Пакет script с петлей и трубой
Я хотел бы, чтобы все файлы 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
)
Может кто-нибудь пролить свет мне на то, как решить проблему выше?
Спасибо заранее!
Ответы
Ответ 1
Вам нужно избежать символа |
, чтобы предотвратить его интерпретацию во время разбора команды цикла. Используйте ^
, чтобы избежать этого:
FOR /f "delims=" %%A in ('dir /b "my_dir\*.csv" ^| find /V "summary"') do (
rem do what you want with %%A here
)
После выхода из строя, |
становится частью строки '
-delimited. Он интерпретируется только как специальный символ, когда эта строка анализируется отдельно от цикла, как "подкоманда", в соответствии с синтаксисом. И это делается после разбора цикла.
Ответ 2
Если у вас возникла проблема с тем, что Gilbeg получил "find:/V": нет такого файла или каталога ", то, скорее всего, у вас есть cygwin или аналогичный на вашем пути и командный файл, не используя команду поиска Windows. Если вы измените свой script, чтобы использовать абсолютный путь поиска 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
)
Ответ 3
Вы также можете просто вставить строку в двойных кавычках в строку одинарных кавычек, как в:
FOR /f "delims=" %%A in ('"dir /b my_dir\*.csv | find /I /V "summary""') do @(
ECHO Do something with "%%A"
)
Ответ 4
взгляните на Windows PowerShell. Не то, чтобы я когда-либо использовал его сам, ум.