Пакетный скрипт с для цикла и трубы - PullRequest
23 голосов
/ 17 мая 2011

Я хотел бы, чтобы все файлы csv находились в каталоге, имя файла которого не содержит слова "summary". Внутри командной строки я могу набрать следующую команду

dir /b my_dir\*.csv | find /V "summary"

Когда я пытаюсь перенести вышеупомянутую команду в командный файл, я сталкиваюсь с проблемой, заключающейся в том, что команда pipe не поддерживается в цикле for. То есть я не могу сделать следующее

FOR /f %%A in ('dir /b my_dir\*.csv | find /V "summary"') do (
rem want to do something here
)

Может ли кто-нибудь пролить свет на то, как решить вышеописанную проблему?

Заранее спасибо!

Ответы [ 4 ]

47 голосов
/ 17 мая 2011

Вам необходимо экранировать символ |, чтобы предотвратить его интерпретацию во время анализа команды цикла . Для выхода используйте ^:

FOR /f "delims=" %%A in ('dir /b "my_dir\*.csv" <b>^|</b> find /V "summary"') do (
rem do what you want with %%A here
)

После выхода | становится частью строки ' -limited. Он интерпретируется как специальный символ, когда эта строка анализируется отдельно от цикла, как «подкоманда» в соответствии с синтаксисом. И это делается после разбора цикла.

5 голосов
/ 22 сентября 2014

Если у вас возникла проблема с тем, что Гилбег получил "find: / V ': нет такого файла или каталога", то, скорее всего, у вас есть путь cygwin или аналогичный, а пакетный файл не использует команду поиска Windows.Если вы измените свой скрипт, чтобы использовать абсолютный путь поиска Windows, ошибка исчезнет:

FOR /f "delims=" %%A in ('dir /b "my_dir\*.csv" ^| %SYSTEMROOT%\system32\find.exe /V "summary"') do (
rem want to do something here with %%A
)
0 голосов
/ 12 января 2019

Вы также можете просто вставить строку в двойных кавычках внутри строки в одинарных кавычках, например:

FOR /f "delims=" %%A in ('"dir /b my_dir\*.csv | find /I /V "summary""') do @(
    ECHO Do something with "%%A"
)
0 голосов
/ 17 мая 2011

взгляните на Windows PowerShell. Не то чтобы я сам этим пользовался, ум.

...