find.exe
在 PowerShell 控制台 shell 中使用参数时,哪些地方令人反感?
这些命令在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
答案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-String
cmdlet。它比find
和更强大findstr
答案3
如果您使用单双引号格式,它在 PowerShell 中可以正常工作,如下所示:
find '"whateveryouarelookingfor"'
find /v '"whateveryouareremoving"'
也就是说,您要搜索的字符串的双引号前面有单引号。
我想这与 PowerShell 在将命令传递给函数/exe 之前删除引号有关。我不是 PowerShell 专家,但我知道批处理。使用 /v 命令,您可以删除带有关键字的整行不需要的行。