2009-08-08 61 views
6

我是一位很长时间的Linux用户,但对Windows和PowerShell来说是新手。我第一次安装了Windows7和Strawberry Perl 5。我现在想用Windows PowerShell进行简单的命令行打印。PowerShell(带Perl)为什么在简单的打印语句中删除双引号?

看起来正确安装的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 

但是当我尝试它所有的本身它打印的FileHandler警告:

 
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用户在那里?

+1

您是否尝试过'perl -e“print'Hello,World'”'? – Weegee 2009-08-10 23:21:36

回答

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 
0

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

1

有趣的是,当你离开powershell世界时,它将单引号转换为双引号,以便被windows命令shell正确解释。 。那)与蟒蛇证明(这似乎表现出了同样的问题):

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命令外壳类似的东西:

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 
相关问题