总结:

总结:

find.exe在 PowerShell 控制台 shell 中使用参数时,哪些地方令人反感?

这些命令在cmd.exeshell 中按预期工作:

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

答案1

尝试:

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

我用了系统监控工具比较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

总结:

转义双引号或将字符串放在单引号内

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

或使用逐字参数

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

正如 Peter Hahndorf 所说,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

不过,还有一种更简单的方法逐字论据--%

在 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

但如果 PowerShell 可用,那么你可以使用它Select-Stringcmdlet。它比find和更强大findstr

答案3

如果您使用单双引号格式,它在 PowerShell 中可以正常工作,如下所示:

find '"whateveryouarelookingfor"'
find /v '"whateveryouareremoving"'

也就是说,您要搜索的字符串的双引号前面有单引号。

我想这与 PowerShell 在将命令传递给函数/exe 之前删除引号有关。我不是 PowerShell 专家,但我知道批处理。使用 /v 命令,您可以删除带有关键字的整行不需要的行。

相关内容