相关疑难解决方法(0)

PowerShell从命令行参数中删除双引号

最近,每当涉及双引号时,我在使用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"
Run Code Online (Sandbox Code Playgroud)

请注意,双引号在传递给PowerShell的echo cmdlet时会出现,但是当作为参数传递给echo.exe时,除非使用反斜杠进行转义,否则将删除双引号(即使PowerShell的转义字符是反引号,而不是反斜杠).

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

这里发生了什么?

目前,修复方法是根据这些规则转义命令行参数(这似乎是CreateProcessPowerShell用来调用.exe文件的API调用):

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

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

下面是一些例子,与echo.exe从的GnuWin32:

PS C:\Documents and Settings\Nick> echo.exe "\`""
"
PS C:\Documents and Settings\Nick> echo.exe "\\\\\`""
\\"
PS C:\Documents and Settings\Nick> echo.exe "\\"
\\
Run Code Online (Sandbox Code Playgroud)

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

另请注意,将双引号的参数传递给.NET函数或PowerShell cmdlet不是必需的.为此,您只需要将双引号转义为PowerShell.

windows powershell command-line

40
推荐指数
4
解决办法
2万
查看次数

在 bash 中将列表转换为单行字符串

我有一个包含列表的文件:

line1
line2
line3
.
.
.
Run Code Online (Sandbox Code Playgroud)

我想将所有内容加入 bash 中的字符串中,如下所示:

"line1", "line2", "line3", ...... (no comma at the end)
Run Code Online (Sandbox Code Playgroud)

我怎么做?

编辑:这不是如何使用自定义分隔符将多行文件名连接成一行的重复项?因为我试图在加入时将每个项目都用双引号引起来。

bash

4
推荐指数
1
解决办法
8739
查看次数

标签 统计

bash ×1

command-line ×1

powershell ×1

windows ×1