2012-01-11 144 views
3

最後,我試圖返回Robocopy.exe的「產品版本」(爲了避免使用XP026;破損的返回碼)。我可以使用Shell.Application,NameSpace,ParseName來獲取'Product Version',但是我需要事先知道NameSpace(folder | directory | path)。如何找到文件路徑

我無法在腳本中寫入NameSpace路徑,因爲它可以在不同的計算機上運行,​​並且Robocopy.exe可能位於系統PATH環境變量中列出的一個或多個目錄中。我只對在PATH中找到的那些感興趣,並且進一步,將作爲WScript.Shell Run方法的結果執行的實例。當沒有指定絕對路徑時,WScript.Shell Run將執行在系統搜索路徑中找到的第一個實例。這是我有興趣找到的那個。

我的備份計劃是使用where.exe程序查找Robocopy.exe的完整路徑,使用WScript.Shell Exec oExec.StdOut將其返回到我的vbs腳本,並在代碼中提取用作NameSpace的路徑以上。

我一直在尋找一個vap或com控件實現的winapi searchpath函數/方法,並沒有運氣。我很驚訝它尚未在FileSystemObject或Shell.Application中實現。我感謝任何幫助,推薦或想法。

回答

1

要搜索給定文件的PATH變量,您必須獲取該變量的值,將其分隔爲「;」字符轉換爲數組,然後遍歷目錄路徑數組,檢查每個目錄是否包含要搜索的文件。但您也可以使用CMD單線來實現這一點:

sFileName = "robocopy.exe" 

Set oShell = WScript.CreateObject("WScript.Shell") 

' this will find the file that will be actually run from command line when typed without qualified path 
Set oExec = oShell.Exec("cmd /c for %G in (""" & sFileName & """) do @echo.%~$PATH:G") 

' this will find all occurances of the file in directories listed in PATH 
'Set oExec = oShell.Exec("cmd /c for %G in (""%path:;="" ""%"") do @if exist ""%~dpfxG\" & sFileName & """ echo %~dpfxG\" & sFileName) 

Do 
    line = oExec.StdOut.ReadLine() 
    WScript.Echo line 
    ' here you can examine the file 

Loop While Not oExec.Stdout.atEndOfStream