5

Некоторое время назад я спросил о синтаксисе перенаправления пакетных скриптов и получил хороший ответ. Я чаще использовал метод круглых скобок () для echo в пакетных сценариях и перенаправления в файлы и т.д.

Я столкнулся с нечетным вопросом , где он появляется слово Where не сможет быть echo «d , как это слово в буквальном смысле , и кажется , это интерпретируется как Where имя команды вызывается вместо этого.


Чтобы упростить этот пример, я перевел логику сценария к гораздо более простой версии, но логика PowerShell, являющаяся echo , могла бы быть намного более сложной, чем эта.

Пример скрипта

@ECHO ON

(
    ECHO [System.IO.DriveInfo]::GetDrives() ^| Where {$_.Name -like "C:\"}
)>> Outfile.txt

PAUSE

ошибка

INFO: Could not find files for the given pattern(s).


Что я сделал

Я немного решил эту проблему, провел небольшое исследование и не смог найти простой ответ. Так как я не задавал много вопросов по SuperUser, я подумал, что это будет хороший вопрос.

В частности, я попытался установить переменную в качестве строкового значения Where (то есть SET w=Where), а затем в заключенных в скобках командах echo я ссылался на эту переменную (т.е. %w%) вместо слова Where но результат все та же ошибка.

Я также немного поиграл с SETLOCAL ENABLEDELAYEDEXPANSION но это не имело никакого значения.

@ECHO ON
SET w=Where
(
    ECHO [System.IO.DriveInfo]::GetDrives() ^| %w% {$_.Name -like "C:\"}
)>> Outfile.txt
PAUSE

Обходной путь

Я просто не используя скобки метод echo - ING слово Where , и я только что с использованием прилагаемой >> перенаправляет к методу файла на каждый echo «d линии по отдельности , where Ничего страшного в этом маленьком примере, но больше для большого сценария.

@ECHO ON
ECHO [System.IO.DriveInfo]::GetDrives() ^| Where {$_.Name -like "C:\"}>> Outfile.txt
PAUSE

Коррелированные вопросы

Hmmmmm ......

  1. Что является причиной этого и что именно происходит, когда это происходит?

  2. Есть ли способ разрешить использование слова (или строки) « Where » без проблемы?


Ресурсы

3 ответа3

4

Вы ошиблись в диагностике проблемы - ГДЕ не имеет к этому никакого отношения.

Вам просто нужно избежать закрывающей скобки:

@ECHO ON

(
    ECHO [System.IO.DriveInfo]::GetDrives(^) ^| Where {$_.Name -like "C:\"}
)>> Outfile.txt

PAUSE
3

Вот еще один вариант для вас. Это не требует от вас избежать скобок или пробела. Когда вы перенаправляете устройство NUL на команду SET /P оно записывает строку приглашения в стандартный вывод. Единственное предостережение в том, что SET /P не записывает возврат каретки и перевод строки, поэтому вам нужен пустой ECHO. вывести CRLF.

@ECHO OFF

(
<nul set /p "=[System.IO.DriveInfo]::GetDrives() | Where {$_.Name -like "C:\"}" &echo.
echo another line
)>Outfile.txt

notepad Outfile.txt
PAUSE
2

Похоже, что после a ) CMD интерпретирует ^| как |:

C:\> (echo 1.The && echo 2.quick && echo 3.brown && echo 4.fox) ^| find "q"
2.quick

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .