2009-08-08 63 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 
相關問題