Подтвердить что ты не робот

Пакет 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
)

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

Спасибо заранее!

4b9b3361

Ответ 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. Не то, чтобы я когда-либо использовал его сам, ум.