最后,我试图返回'Product Version'Robocopy.exe(以避免使用XP026;返回代码损坏)。我可以使用Shell.ApplicationNameSpaceParseName来获取“产品版本”,但是我需要事先知道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控件实现,但没有运气。我很惊讶它尚未在FileSystemObjectShell.Application中实现。感谢您的帮助,推荐或想法。

最佳答案

要在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

关于vbscript - 如何找到文件路径,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8812848/

10-14 12:11
查看更多