最后,我正在尝试返回Robocopy.exe的“产品版本”(为了避免使用XP026;损坏的返回码)。我可以使用Shell.Application,NameSpace,ParseName来获取“产品版本”,但我需要事先知道NameSpace(文件夹|目录|路径)。
我无法将NameSpace路径写入脚本,因为它将在不同的计算机上运行,而Robocopy.exe可能位于系统PATH环境变量中列出的一个或多个目录中。我只对在PATH中找到的那些感兴趣,并且还对将作为WScript.Shell Run方法的结果执行的实例感兴趣。当未指定绝对路径时,WScript.Shell Run将执行系统搜索路径中找到的第一个实例。那是我有兴趣找到的那个。
我的备份计划是使用where.exe程序查找Robocopy.exe的完整路径,使用WScript.Shell Exec oExec.StdOut将其返回到我的vbs脚本,并在上面的代码中提取用作NameSpace的路径
我一直在搜索winapi searchpath函数/方法的vbs或com控件实现,但没有运气。我很惊讶它还没有在FileSystemObject或Shell.Application中实现。我感谢任何帮助,推荐或想法。
答案 0 :(得分: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