Как я могу найти путь к файлу - PullRequest
3 голосов
/ 11 января 2012

В конце я пытаюсь вернуть «Версию продукта» Robocopy.exe (во избежание использования XP026; неработающий код возврата).Я могу использовать Shell.Application, NameSpace, ParseName для получения «Версии продукта», но мне нужно заранее знать NameSpace (folder | directory | path).

Я не могу записать путь NameSpace всценарий, поскольку он будет работать на разных компьютерах, а Robocopy.exe может находиться в одном или нескольких каталогах, указанных в системной переменной среды PATH.Меня интересуют только те, которые найдены в PATH, и, кроме того, экземпляр, который будет выполняться в результате выполнения метода WScript.Shell Run.WScript.Shell Run выполнит первый экземпляр, найденный в системном пути поиска, если абсолютный путь не указан.Это то, что мне интересно найти.

Мой план резервного копирования - использовать программу where.exe, чтобы найти полный путь к Robocopy.exe, вернуть его в мой скрипт vbs с помощью WScript.Shell Exec oExec.StdOut и извлеките путь для использования в качестве NameSpace в приведенном выше коде.

Я искал реализацию vbs или com для управления функцией / методом winpi searchpath, но мне не повезло.Я удивлен, что это еще не реализовано в FileSystemObject или Shell.Application.Я ценю любую помощь, рекомендации или идеи.

1 Ответ

1 голос
/ 13 января 2012

Чтобы найти переменную 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
...