VBAでXCOPYの実行結果を取得する方法

このQ&Aのポイント
  • VBAのshell関数を利用してXCOPYを実行し、ファイルのコピー結果を取得する方法をまとめました。
  • 実行結果に表示されるファイルのコピーに失敗したファイル名のみを取得することは可能でしょうか?
  • 検索しても答えが見つからず、わからないという方に対して、XCOPYの実行結果から失敗したファイル名を取得する方法を教えていただきたいです。
回答を見る
  • ベストアンサー

VBAでXCOPYの実行結果を取得したい

VBAでshell関数を利用してXCOPYを実行し、テキストファイルにその実行結果を出力しています。 しかし、結果には D:\>xcopy D:\test\ssss.txt D:\test2 ファイルが見つかりません - ssss.txt 0 個のファイルをコピーしました もしくは D:\>xcopy D:\test\sssss.txt D:\test2 D:\test\sssss.txt 1 個のファイルをコピーしました というDOS画面で表示される内容が出力されているだけです。 ここでコピーに失敗している(0個のファイルをコピーしました)ファイル名だけを取得することは可能でしょうか? 色々サイトを検索してみましたが、答えが見つかりません。 恐れ入りますが、どなたかご存知の方がいらっしゃいましたらご教示ください。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.3

ええと、テキストファイル中のファイル名を取り出す方法ですよね? ファイル名に「-」を含んだ物がないと言う前提ですが、テキストファイルをExcelで開いて、データの区切り位置を「-」にするとB列にコピーできなかったファイル名が出ますがそれでは駄目ですか? マクロでやるなら↓こんな感じでしょうか。 取り出したファイル名をSheet1のA列に貼り付けてます。 Sub Sample()  Workbooks.OpenText Filename:="C:\log.txt", Other:=True, OtherChar:="-"  Columns("B:B").Copy  ThisWorkbook.Activate  Sheets("Sheet1").Columns("A:A").Select  ActiveSheet.Paste  Application.CutCopyMode = False  Windows("log.txt").Close End Sub ファイルにアクセス出来ない為にコピーに失敗した場合などは別の内容になりますので、違う方法が必要になります。

asaji7
質問者

お礼

ありがとうございます。 大変参考になりました。確かにコピーできなかったファイル名には区切り文字"-"があります。気づかなかった・・・。 この方法で試してみます。 ありがとうございました。

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 例えば、Dir関数 で、コピー先を調べるという方法は、思いつくのかもしれませんが、こちらで試してみると、一旦、Shell の子プロに出てxcopy を実行するので、そのスピードとはマッチしないので、コピーが成功しても、誤認識して、ファイルが見当たらないと出てしまいました。 以下のように、コマンドプロンプトの 戻り値(ErrorLevel) を取る方法はあります。 命令 ="xcopy D:\test\ssss.txt D:\test2" ExecCmd 命令, Ret MsgBox Ret '-------------------------------- Function ExecCmd(sCmd As String, Ret As String) _    As Boolean    Dim objShell As Object    Dim objExec As Object    Set objShell = CreateObject("WScript.Shell")    Set objExec = objShell.Exec("%ComSpec% /c " & sCmd)       Do Until objExec.Status: DoEvents: Loop    If Not objExec.StdErr.AtEndOfStream Then      ExecCmd = True      Ret = objExec.StdErr.ReadAll    ElseIf Not objExec.StdOut.AtEndOfStream Then      Ret = objExec.StdOut.ReadAll    End If    Set objExec = Nothing    Set objShell = Nothing End Function ただ、こういう方法は、VB/VBAの範囲ではありません。 VB なら、FileCopy などがありますから、それを使えばよいと思います。

asaji7
質問者

お礼

確かに、FileCopy を利用すれば、簡単に結果を取得することも出来ますね。。 ご提示いただいた内容で一度試して見ます。 ひとまず、お礼まで。 ありがとうございました。

  • F_PAPA
  • ベストアンサー率40% (8/20)
回答No.1

>D:\>xcopy D:\test\ssss.txt D:\test2 >ファイルが見つかりません - ssss.txt >0 個のファイルをコピーしました では、ssss.text が見つからないので「0個」と表示されているのですよね? ということは、「ない」ファイル名を取得することは出来ないのではないでしょうか?

関連するQ&A

  • xcopyでCDにコピー

    出力先がハードディスクの場合はコピーされるのですが、 xcopy C:\Test\*.* D:\ /e /c /h /y 出力先がCD-Rのドライブだとコピーが出来ません…ご教授下さい。 xcopy C:\Test\*.* F:\ /e /c /h /y ↓次のメッセージが表示される 無効なドライブ指定です 0 個のファイルをコピーしました

  • バッチファイル XCOPYで上書きしない

    バッチファイルでXCOPYを実行し既存ファイルを上書きしないようにしたい(上書き確認を自動でNo返答する)さらに、存在しないファイルはコピーしたい ●構成 ・C:\test\A\A.txt がある ・バッチファイルと同列に、A\A.txt 及び B.txt が存在  さらにバッチファイルと同列に、からフォルダB が存在 ●試したコマンド: XCOPY * C:\test /E /-Y /Q < nul > nul ●結果:C:\test\A\A.txt は上書きされないが、B.txt 及びフォルダBがコピーされない ●求める結果: C:\test\A\A.txt は上書きされず、コピー先に存在しないB.txt 及びフォルダBがコピーしたい 宜しくお願いいたします。

  • エクセルのVBAからDOSコマンドのDIRを実行したい

    DOSコマンドのDIRコマンドを、エクセルのVBAから実行したいのですがうまくいきません。助けてください。 DOSプロンプト上で、たとえば「DIR c:\*.mdb /s/b > c:\aaa.txt」を実行すると、Cドライブ上の拡張子(MDB)のファイルの一覧を、aaa.txt上に出力できるのですが、それをエクセルのVBAから実行したいのです。 Shell関数で、COMMAND.COMを実行することはできるのですが、それ以降の指定がわかりません。COMMAND.COMを実行した後、DOSプロンプトをアクティブにし、「DIR c:\*.mdb /s/b > c:\aaa.txt」をsendkeyで送れば・・・とアドバイスをうけたりもしたのですが、sendkeyでなくてもできた記憶があります。 よい方法があれば教えてください。 よろしくお願いします。

  • VBAのShellの同期的実行

    ExcelVBAについての質問です。コマンドプロンプトで実行するプログラムをCで作成しました(これをXXX.exeとします)。このプログラムは計算が終了した後で、その結果のファイルを作成します(これをYYY.txtとします)。このプログラムを操作し、結果を表にして出力するために、ExcelVBAでshellを使って以下のようなプログラムを作成しました。   shell("XXX.exe")   call Output Outputでは、XXX.exeが作成したファイルYYY.txtからデータを読み込んでシートに結果を出力するのですが、うまくファイルを読み込みません。多分、shellにより実行したXXX.exeが終了する前にOutputが呼ばれているのだと思うのですが、もしそうだとしたらどのような解決方法があるのでしょうか。よろしくお願いします。 WinXp、Excel2000です

  • bat処理の実行結果ログ出力方法について

    Windows2003Serverで、bat処理でネットワーク共有したHDDにバックアップデータを移動する処理を組込しているのですが、実行される場合、されない場合があるため、実行結果をログ出力したいと思っています。 MV D:TEST.TXT Z:\TEST.TXT >>D:\LOG.TXT として出力しますと、エラーであっても、正常であっても何も出力されませんでした。 コマンドプロンプト上で返される結果(ファイルが存在しない場合、「指定されたファイルが見つかりません」の表示をする等)をログ出力する方法はないでしょうか? ご教授下さい。

  • XCOPYについて

    Win98が立ち上がらなくなり、かろうじてDOSは立ち上がる状態です。 せめてマイドキュメントにあるファイルだけでもFDにコピーしたいのですが XCOPYでコピーしたところ容量がFD以上あるため、少しのファイルしかコピーできません。何かいい方法を教えていただけないでしょうか。

  • Batファイルでxcopyを実行するとループする

    BatファイルでCドライブのaaaフォルダからDドライブのaaaフォルダへファイルをコピーするxcopyの記述をしました。 xcopy c:\aaa d:\aaa /i 作成したBatファイルを実行するとループしてるのか、このコマンドが何度も繰り返され、コマンドプロンプトの×ボタンを押すまで終わりません。 コマンドプロンプトから直接xcopyを入力すると問題なくコピーされます。 どこか私の記述が間違っているのでしょうか?

  • xcopyについて質問なのですが。

    xcopyについて質問なのですが。 あるディレクトリの配下に、「20091206」というフォルダ(フォルダの中には.datファイルや、.txtファイルなどがあります。)と、コントロールファイルがあります。 そこのディレクトリから、違うサーバーのディレクトリにxcopyを使用して、フォルダごと(中身の.datファイルや、.txtファイルも一緒に)コピーさせるバッチを作成しています。 xcopy のオプションを色々探して試してみたのですが、 xcopy /c /e /i /y /zだと、フォルダだけコピーして、中身の.datファイルや、.txtファイルがなかったり、 xcopy /I /Yだと、コントロールファイルだけコピーされて、フォルダはコピーされなかったりと上手くいきません。 どのオプションを使用すれば、ディレクトリの配下に存在する、フォルダとファイルのうち、フォルダ(中身のファイルも)だけコピーできるのでしょうか? \\10.xxx.xxx.xx\aaaという、ディレクトリの中に、 (1)abc.ctl (2)20091206 |__xyz.dat |__aaa.txt があり、(2)(.dat、.ctlも一緒)をxcopyを使用して、他のサーバー上のディレクトリにおきたいです。 ご教授よろしくお願い致します。

  • xcopyについて質問なのですが。

    xcopyについて質問なのですが。 あるディレクトリの配下に、「20091206」というフォルダ(フォルダの中には.datファイルや、.txtファイルなどがあります。)と、コントロールファイルがあります。 そこのディレクトリから、違うサーバーのディレクトリにxcopyを使用して、フォルダごと(中身の.datファイルや、.txtファイルも一緒に)コピーさせるバッチを作成しています。 xcopy のオプションを色々探して試してみたのですが、 xcopy /c /e /i /y /zだと、フォルダだけコピーして、中身の.datファイルや、.txtファイルがなかったり、 xcopy /I /Yだと、コントロールファイルだけコピーされて、フォルダはコピーされなかったりと上手くいきません。 どのオプションを使用すれば、ディレクトリの配下に存在する、フォルダとファイルのうち、フォルダ(中身のファイルも)だけコピーできるのでしょうか? \\10.xxx.xxx.xx\aaaという、ディレクトリの中に、 (1)abc.ctl (2)20091206 |__xyz.dat |__aaa.txt があり、(2)(.dat、.ctlも一緒)をxcopyを使用して、他のサーバー上のディレクトリにおきたいです。 ご教授よろしくお願い致します。

  • xcopyでのバッチコピー方法でコピーできない

    こんにちは。 xcopyを使って、ネットワーク上のファイルを、同じくネットワーク上の別フォルダにコピーしたいと思っています。 ローカルで下記のコードを書きました。 xcopy C:\abc.txt D:\ これは問題なく、Dドライブ直下にデータがコピーできました。 次に、ネットワーク上のあるファイルを指定してコピーするコードを書きました。 xcopy \\mynetwork\abc.txt \\mynetwork\something\ or xcopy "\\mynetwork\abc.txt" "\\mynetwork\something\" これは一応はバッチ画面は起動されるのですが、正しくコピーをできませんでした。つまりコピーは失敗におわりました。 何が間違っているでしょうか? やりたい事は、単一のテキストファイルを、ある特定のフォルダにコピーして、既に同じファイル名があれば上書きするといったことをやりたいです。 よろしくお願いいたします。

専門家に質問してみよう