Por que o “find” não pode ser usado no PowerShell?

3

O que find.exe considera objetável sobre os parâmetros quando é usado em um shell do console do PowerShell? Esses comandos funcionam como esperado em um cmd.exe shell.

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
    
por lit 14.05.2017 / 04:10

2 respostas

3

Tente:

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

Eu usei Sysmon.exe para comparar as execuções em PowerShell.exe e cmd.exe :

Para cmd.exe:

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

Para o 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

podemos ver que, no PowerShell, as aspas em torno do termo de pesquisa estão faltando; portanto, ao adicionar outro conjunto de aspas duplas, isso deve funcionar.

    
por 14.05.2017 / 05:17
1

Como Peter Hahndorf disse, o PowerShell está removendo as cotações externas . Você pode verificá-lo diretamente, ecoando ou escrevendo a string diretamente na linha de comando

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

IMHO é uma coisa boa porque agora você pode usar aspas simples para agrupar strings. Você também tem uma maneira padronizada de passar parâmetros de caracteres especiais semelhantes ao bash, ao contrário de em cmd , onde aspas duplas são uma dor

Então, de acordo com a regra de cotação do PowerShell , você deve escapar da citação por 'backticks' ou pela aspas duplas, ou simplesmente colocá-lo entre aspas simples

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

Em casos simples como este, quando não há espaço no parâmetro, você também pode escapar diretamente das aspas duplas sem colocá-lo dentro de outro par de citações

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

No entanto, há uma maneira mais fácil com argumentos verbos --%

In PowerShell 3.0 the special marker --% is a signal to PowerShell to stop interpreting any remaining characters on the line. This can be used to call a non-PowerShell utility and pass along some quoted parameters exactly as is.

Como resultado, você pode usá-lo assim

find.exe --% "System.Diagnostics.Process" *.ps1xml
    
por 19.05.2017 / 08:44