为什么PowerShell(使用Perl)在简单的print语句中删除双引号?

时间:2009-08-08 22:22:47

标签: perl powershell

我是Linux的长期用户,但我是Windows和PowerShell的新手。我刚刚第一次安装了Windows7和Strawberry Perl 5。我现在想用Windows PowerShell进行简单的命令行打印。

看起来Perl安装正确:

PS C:\Users\Me> perl -v 
This is perl, v5.10.0 built for MSWin32-x86-multi-thread Copyright
1987-2007, Larry Wall 
...

命令行的工作原理:

PS C:\Users\Me> perl -e 'die'
Died at -e line 1.

PS C:\Users\Me> echo 'print "Hello, World\n"' | perl
Hello, World

但是当我单独尝试它时会打印出一个文件处理程序警告:

PS C:\Users\Me> perl -e 'print "Hello, World\n"'
No comma allowed after filehandle at -e line 1.

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

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

虽然有效但丑陋!让我们再试一次:

PS C:\Users\Me> perl -e 'print qq{Hello, World\n}'
Hello, World

多喜欢它,但我很困惑。

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

3 个答案:

答案 0 :(得分:3)

我认为这里有一些问题。一个是引号在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

答案 1 :(得分:1)

有趣。好像当你离开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

答案 2 :(得分:0)

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