为啥 PowerShell(使用 Perl)在简单的打印语句中删除双引号?

Posted

技术标签:

【中文标题】为啥 PowerShell(使用 Perl)在简单的打印语句中删除双引号?【英文标题】:Why is PowerShell (with Perl) removing double quotes in a simple print statement?为什么 PowerShell(使用 Perl)在简单的打印语句中删除双引号? 【发布时间】:2010-11-18 00:20:32 【问题描述】:

我是 Linux 的老用户,但不熟悉 Windows 和 PowerShell。我是第一次安装 Windows7 和 Strawberry Perl 5。我现在想使用 Windows PowerShell 进行简单的命令行打印。

看起来 Perl 安装正确:

PS C:\Users\Me> perl -v 这是为 MSWin32-x86-multi-thread 构建的 perl,v5.10.0 版权所有 1987-2007,拉里·沃尔 ...

命令行的东西也有效:

PS C:\Users\Me> perl -e 'die' 死于 -e 第 1 行。 PS C:\Users\Me> echo 'print "Hello, World\n"' | perl 你好世界

但是当我自己尝试时,它会打印一个文件处理程序警告:

PS C:\Users\Me> perl -e 'print "Hello, World\n"' -e 第 1 行的文件句柄后不允许有逗号。

所以看起来它删除了双引号。

PS C:\Users\Me> perl -e 'print \"Hello, World\n\"' 你好世界

这行得通,但它很丑!让我们再试一次:

PS C:\Users\Me> perl -e 'print qqHello, World\n' 你好世界

这更像是它,但我很困惑。

为什么 PowerShell 在单引号中转义双引号? 有 PowerShell 用户吗?

【问题讨论】:

你试过perl -e "print 'Hello, World'"吗? 【参考方案1】:

我认为这里有几个问题。一是引号在 powershell 和 perl 中都具有象征意义。引号和转义在 powershell 中的工作方式与在 UNIX shell 中的工作方式略有不同。在 powershell 中查看 man about_quoting。

第二个问题是 perl 命令行在 Windows 时期的行为不同。您要传递给 perl 的命令行中的任何双引号都需要以 perl 术语转义为 \"。这不是特定于 powershell。这是 perl 在 Windows 上的工作方式。您通常会遇到类似的问题cmd.exe。

这些版本应该可以工作:

PS> & perl -e "print \`"hello, world\n\`""
hello, world
PS> $s = "print \`"hello, world\n\`""
PS> echo $s
print \"hello, world\n\"
PS> & perl -e $s
hello, world

你可以用单引号做同样的事情,减少转义。

PS> & perl -e 'print \"hello, world\n\"'
hello, world
PS> $s = 'print \"hello, world\n\"'
PS> echo $s
print \"hello, world\n\"
PS> & perl -e $s
hello, world

您也可以将换行符放在 powershell 中,而不是将换行符转义序列传递给 perl 进行解析。

PS> & perl -e "print \`"hello, world`n\`""
hello, world
PS> $s = "print \`"hello, world`n\`""
PS> echo $s
print \"hello, world
\"
PS> & perl -e $s
hello, world

【讨论】:

【参考方案2】:

有趣。似乎当您离开 powershell 世界时,它会将单引号转换为双引号,以便由 windows 命令 shell 正确解释。 (或类似的东西)。用python演示(似乎表现出同样的问题):

PS C:\> python -c  'print "Hi from python"'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'Hi' is not defined

如果我尝试从 Windows 命令 shell 执行类似操作,也会遇到同样的错误:

C:\>python -c  "print "Hi from python""
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'Hi' is not defined

就好像powershell在执行命令的时候是这样做的:

PS C:\> $s = 'python -c "print "Hi from python""'
PS C:\> cmd /c $s
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'Hi' is not defined

【讨论】:

【参考方案3】:

如果在 cmd.exe 而不是 PowerShell 中运行“错误”命令会发生什么?我问是因为有效的转义序列(\")是 Perl 的;在 PowerShell 中它会是 `"`。

【讨论】:

以上是关于为啥 PowerShell(使用 Perl)在简单的打印语句中删除双引号?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 STDIN 会导致我的 Perl 程序冻结?

为啥 Perl 5 的函数原型不好?

为啥变量在 Powershell 中不能与 Get-Aduser 一起使用?

为啥在powershell中使用touch命令会显示错误?

为啥我的Windows powershell读取结果有一堆90m

为啥 Perl 文件 glob() 不能在标量上下文中的循环之外工作?