为啥 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)在简单的打印语句中删除双引号?的主要内容,如果未能解决你的问题,请参考以下文章
为啥变量在 Powershell 中不能与 Get-Aduser 一起使用?