Сохранить вывод команды FIND в переменную - PullRequest
2 голосов
/ 02 марта 2012

Как видно из заголовка, я пытаюсь взять вывод команды FIND и сохранить ее в переменной. В частности, я использую:

DIR /b /s "C:\" | FIND "someexe.exe"

чтобы найти конкретный файл .exe, который, кажется, работает нормально, но затем я хочу сохранить результаты FIND для последующего использования в том же сценарии.

Я пробовал разные варианты:

for /f "usebackq" %%i in (`DIR /b /s "C:\" | FIND "someexe.exe"`) do SET foobar=%%i

но когда я пытаюсь запустить скрипт, командное окно немедленно закрывается (предположительно из-за какой-то ошибки, я попытался поместить команду PAUSE в следующую строку безрезультатно).

Я предполагаю, что это какая-то глупая мелочь, которую я делаю неправильно, но если бы кто-то мог показать мне, что это такое, я был бы признателен. Просто для справки, мне все равно, сколько существует копий «someexe.exe», мне просто нужен путь для одной из них.

1 Ответ

4 голосов
/ 02 марта 2012

Вы должны получить эту ошибку: | was unexpected at this time.. Ваша непосредственная проблема заключается в том, что специальные символы без кавычек, такие как |, должны быть экранированы с помощью ^, когда они появляются в FOR / F ('command').

for /f "usebackq" %%i in (`DIR /b /s "C:\" ^| FIND "someexe.exe"`) do SET foobar=%%i

Звучит так, как будто вы запускаете свой командный файл, дважды щелкнув на рабочем столе или в проводнике Windows. Это работает, но затем окно немедленно закрывается после завершения пакета. В вашем случае он заканчивается до достижения PAUSE из-за синтаксической ошибки.

Я всегда запускаю свои командные файлы из командного окна: из меню «Пуск» вы хотите run cmd.exe. Это откроет командную консоль. Затем CD в каталог, где находится ваш пакетный файл, а затем запустите пакетный файл, введя его имя (расширение не требуется). Теперь окно остается открытым после завершения сценария. Вы можете проверить свои переменные, используя SET, запустить другой скрипт, что угодно.

В вашем случае нет необходимости использовать FIND - DIR может найти файл напрямую. Кроме того, путь к вашему файлу может включать пробелы, в этом случае он будет проанализирован в токены. Вам нужно установить «DELIMS =» или «TOKENS = *», чтобы вы получили полный путь.

Я никогда не понимаю, почему люди используют USEBACKQ при выполнении команды. Я нахожу это полезным, только если я пытаюсь использовать FOR / F с файлом и мне нужно заключить файл в кавычки из-за пробелов и / или специальных символов.

Кроме того, вы можете столкнуться с ошибками из-за недоступных каталогов. Перенаправление stderr на nul очищает вывод. Здесь снова, > должен быть экранирован.

for /f "delims=" %%F in ('dir /b /s "c:\someexe.exe" 2^>nul') do set foobar=%%F
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...