2012-01-11 135 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