4

Что find.exe находит нежелательным в отношении параметров при использовании в консольной оболочке PowerShell? Эти команды работают должным образом в оболочке cmd.exe .

PS C:\Windows\System32\WindowsPowerShell\v1.0> find /i "System.Diagnostics.Process" *.ps1xml
FIND: Parameter format not correct
PS C:\Windows\System32\WindowsPowerShell\v1.0> find /i "System.Diagnostics.Process" *.ps1xml
FIND: Parameter format not correct
PS C:\Windows\System32\WindowsPowerShell\v1.0> C:\Windows\System32\find.exe /i "System.Diagnostics.Process" *.ps1xml
FIND: Parameter format not correct
PS C:\Windows\System32\WindowsPowerShell\v1.0> C:\Windows\System32\find.exe /i "System.Diagnostics.Process" .\DotNetTypes.format.ps1xml
FIND: Parameter format not correct

2 ответа2

3

Пытаться:

find /i "`"System.Diagnostics.Process`"" *.ps1xml

Я использовал Sysmon.exe для сравнения выполнений в PowerShell.exe и cmd.exe:

Для cmd.exe:

 Image: C:\Windows\System32\find.exe
 CommandLine: find  /i "System.Diagnostics.Process" *.ps1xml
 ParentImage: C:\Windows\System32\cmd.exe

Для PowerShell:

 Image: C:\Windows\System32\find.exe
 CommandLine: "C:\Windows\system32\find.exe" /i System.Diagnostics.Process *.ps1xml
 ParentImage: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

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

2

Как сказал Питер Хандорф, PowerShell снимает внешние цитаты. Посмотрите, как PowerShell удаляет двойные кавычки из аргументов командной строки. Вы можете проверить это, повторив или написав строку прямо в командной строке

PS C:\> echo C:\Windows\System32\find.exe /i "System.Diagnostics.Process" *.ps1xml
C:\Windows\System32\find.exe
/i
System.Diagnostics.Process
*.ps1xml
PS C:\> "System.Diagnostics.Process"
System.Diagnostics.Process

ИМХО, это хорошо, потому что теперь вы можете использовать одинарные кавычки для переноса строк. У вас также есть стандартизированный способ передачи параметров специальных символов, аналогичный bash, в отличие от cmd, где вставленные двойные кавычки являются трудной задачей.

В соответствии с правилом цитирования PowerShell вы должны избегать кавычки либо с помощью `backticks` либо самой двойной кавычки, или просто помещать ее в одинарные кавычки

find.exe /i "`"System.Diagnostics.Process`"" *.ps1xml
find.exe /i """System.Diagnostics.Process""" *.ps1xml
find.exe /i '"System.Diagnostics.Process"' *.ps1xml

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

find.exe /i `"System.Diagnostics.Process`" *.ps1xml

Однако есть более простой способ с аргументами Verbatim --%

В PowerShell 3.0 специальный маркер --% является сигналом для PowerShell о прекращении интерпретации любых оставшихся символов в строке. Это может быть использовано для вызова утилиты не-PowerShell и передачи некоторых параметров в кавычках в том виде, как они есть.

В результате вы можете использовать это так

find.exe --% "System.Diagnostics.Process" *.ps1xml

Или, если вам не нужна поддержка Unicode, вы можете просто find с помощью findstr который не нуждается в кавычках

PS C:\Users> help | findstr command
    topics at the command line.
    The Get-Help cmdlet displays help at the command line from content in

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