VBAでPowerShellのTest-Pathを使ってファイルの存在確認が出来るか試してみました。
WScript.ShellのExecメソッド
Execメソッドを使うと標準入力、標準出力、標準エラー出力を利用することが出来きますので、これを使ってファイルの存在判定を行います。Sub CheckFile3() Dim filePath As String Dim oShell As Object Set oShell = CreateObject("WScript.Shell") Dim oExec As Object Dim oOutput As Object filePath = "C:\work\Excel\output.txt" 'Execメソッド Set oExec = oShell.Exec("powershell -WindowStyle Hidden -command Test-Path """ & filePath & """") '標準出力の値を取得 Set oOutput = oExec.StdOut Dim bufStr As String While Not oOutput.AtEndOfStream '取得した値から1行読みとる bufStr = oOutput.ReadLine If bufStr = "True" Then MsgBox filePath & " は存在します。" Else MsgBox filePath & " は存在しません。" End If Wend End SubExecメソッドでpowershellを起動するときに「-WindowStyle Hidden」を使って、ウィンドウを非表示設定にしてますが、一瞬だけプロンプト画面が表示されてしまいます。この一瞬だけチラって見えるのがカッコ悪くてなんとかならないかといろいろ調べましたが、どうやら無理なようです。
まあ、ちょっとぐらいプロンプトが表示されても気にならないという方は、この方法でいいと思います。
ただ、チラっとか見えるの嫌だ!、という方は次の方法を試してみてください。
ShellのRunメソッドを使って完全非表示にしています。
WScript.ShellのRunメソッド
Runメソッドを使うとプロンプトを非表示にすることが出来ます。ただ、この方法ですと標準出力の値は取得できませんのでTest-Pathの結果を知る方法が別に必要です。
今回は手っ取り早くクリップボードを使って結果を取得するようにしてみました。
Sub CheckFile4() Dim filePath As String Dim ret As Long Dim ClipBoard As Variant Dim cb As New DataObject Dim cbText As String filePath = "C:\work\Excel\output.txt" Dim cmd As String cmd = "powershell Test-Path """ & filePath & """ | Set-Clipboard " With CreateObject("Wscript.Shell") ret = .Run(cmd, 0, True) End With 'クリップボードの値を取得 cb.GetFromClipboard cbText = cb.GetText If cbText = "True" Then MsgBox filePath & " は存在します。" Else MsgBox filePath & " は存在しません。" End If End SubTest-Pathの結果は、パイプラインを使ってSet-Clipboardでクリップボードに格納しています。
ちなみに、DataObjectオブジェクトを使用するには、参照設定で「Microsoft Forms 2.0 Object Library」にチェックを入れる必要があります。
もし、参照設定に「Microsoft Forms 2.0 Object Library」が出てこない場合は、[参照]ボタンから「c:\Windows\System32\FM20.DLL」または「C:\Windows\SysWOW64\FM20.DLL」を追加してください。
今回、試しにPowerShellのTest-Pathを使った方法を考えてみましたが、普通にFileSystemObjectとかを使ったほうがはるかに簡単です。まあでも、PowerShellのコマンドレットを利用したいといったこともあると思いますので、そういったときに今回のやり方が使えそうな気がします。
スポンサーリンク