3

最后,我试图返回'Product Version'of Robocopy.exe(为了避免使用 XP026;损坏的返回码)。我可以使用Shell.Application,NameSpaceParseName获取“产品版本”,但我需要NameSpace事先知道(文件夹|目录|路径)。

我无法将 NameSpace 路径写入脚本,因为它将在不同的计算机上运行,​​并且 Robocopy.exe 可能位于系统 PATH 环境变量中列出的一个或多个目录中。我只对在 PATH 中找到的那些感兴趣,而且对将作为WScript.ShellRun 方法的结果执行的实例感兴趣。WScript.Shell Run当未指定绝对路径时,将执行在系统搜索路径中找到的第一个实例。那是我有兴趣找到的那个。

我的备份计划是使用 where.exe 程序找到完整路径Robocopy.exe,将其返回到我的 vbs 脚本,WScript.Shell Exec oExec.StdOut然后提取要使用的路径,如NameSpace上面的代码所示。

我一直在寻找 winapi 搜索路径函数/方法的 vbs 或 com 控制实现,但没有运气。我很惊讶它还没有在FileSystemObjector中实现Shell.Application。我感谢任何帮助、推荐或想法。

4

1 回答 1

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
于 2012-01-12T21:55:58.150 回答