gpt4 book ai didi

windows - PowerShell 从命令行参数中去除双引号

转载 作者:可可西里 更新时间:2023-11-01 11:59:39 69 4
gpt4 key购买 nike

最近,每当涉及双引号时,我在使用 PowerShell 的 GnuWin32 时遇到一些问题。

经过进一步调查,PowerShell 似乎正在从命令行参数中去除双引号,即使已正确转义也是如此。

PS C:\Documents and Settings\Nick> echo '"hello"'
"hello"
PS C:\Documents and Settings\Nick> echo.exe '"hello"'
hello
PS C:\Documents and Settings\Nick> echo.exe '\"hello\"'
"hello"

请注意,当传递给 PowerShell 的 echo cmdlet 时双引号在那里,但是当作为参数传递给 echo.exe 时,双引号会被去除,除非使用反斜杠(即使 PowerShell 的转义字符是反引号,而不是反斜杠)。

这对我来说似乎是一个错误。如果我将正确的转义字符串传递给 PowerShell,那么 PowerShell 应该处理调用命令可能需要的任何转义。

这是怎么回事?

目前,修复是根据这些规则转义命令行参数(这些规则似乎被 PowerShell 用来调用 .exe 文件的 CreateProcess API 调用(间接地)使用):

  • 要传递双引号,请使用反斜杠转义:\" -> "
  • 要传递一个或多个后跟双引号的反斜杠,请使用另一个反斜杠转义每个反斜杠并转义引号:\\\\\" -> \\"
  • 如果后面没有跟双引号,则反斜杠不需要转义:\\ -> \\

请注意,可能需要进一步转义双引号才能将 Windows API 转义字符串中的双引号转义为 PowerShell。

这里有一些例子,使用来自 GnuWin32 的 echo.exe:

PS C:\Documents and Settings\Nick> echo.exe "\`""
"
PS C:\Documents and Settings\Nick> echo.exe "\\\\\`""
\\"
PS C:\Documents and Settings\Nick> echo.exe "\\"
\\

我想如果您需要传递一个复杂的命令行参数,这很快就会变成 hell 。当然,这些都没有记录在 CreateProcess() 或 PowerShell 文档中。

另请注意,无需将带双引号的参数传递给 .NET 函数或 PowerShell cmdlet。为此,您只需将双引号转义到 PowerShell。

编辑:正如 Martin 在他出色的回答中指出的那样,这在 CommandLineToArgv() 函数(CRT 使用它来解析命令行参数)文档中进行了记录.

最佳答案

这是一个known thing :

It's FAR TOO HARD to pass parameters to applications which require quoted strings. I asked this question in IRC with a "roomful" of PowerShell experts, and it took hour for someone to figure out a way (I originally started to post here that it is simply not possible). This completely breaks PowerShell's ability to serve as a general purpose shell, because we can't do simple things like executing sqlcmd. The number one job of a command shell should be running command-line applications... As an example, trying to use SqlCmd from SQL Server 2008, there is a -v parameter which takes a series of name:value parameters. If the value has spaces in it, you must quote it...

...there is no single way to write a command line to invoke this application correctly, so even after you master all 4 or 5 different ways of quoting and escaping things, you're still guessing as to which will work when ... or, you can just shell out to cmd, and be done with it.

关于windows - PowerShell 从命令行参数中去除双引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6714165/

69 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com