2009-08-08 4 views
6

Ich bin ein langjähriger Linux-Benutzer, bin aber neu in Windows und PowerShell. Ich habe gerade Windows7 und Strawberry Perl 5 zum ersten Mal installiert. Ich möchte jetzt einen einfachen Befehlszeilen-Druck mit Windows PowerShell durchführen.Warum entfernt PowerShell (mit Perl) doppelte Anführungszeichen in einer einfachen Druckanweisung?

Es sieht aus wie Perl richtig installiert:

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

und Kommandozeilen-Zeug funktioniert:

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

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

Aber wenn ich das alles von selbst versuchen, druckt es eine Filehandler Warnung:

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

So sieht es aus wie das Entfernen der Anführungszeichen.

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

Das funktioniert, aber es ist hässlich! Versuchen wir es noch einmal:

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

Das ist mehr wie es, aber ich bin verwirrt.

Warum entfernt PowerShell die doppelten Anführungszeichen innerhalb der Anführungszeichen? Alle PowerShell-Benutzer da draußen?

+1

Haben Sie versucht "Perl-e" print "Hallo, Welt" "? – Weegee

Antwort

3

Ich denke, es gibt ein paar Probleme hier. Einer davon ist, dass Zitate sowohl in Powershell als auch in Perl eine symbolische Bedeutung haben. Zitate und Escapes funktionieren in der Powershell etwas anders als in einer UNIX-Shell. Check out man about_quoting in der Powershell.

Das zweite Problem ist, dass die Perl-Befehlszeile in Windows-Zeitraum anders verhält. Jedes double quote in der Kommandozeile, das Sie an Perl weitergeben wollen, muss in Perl-Terms als Escape angegeben werden. "Dies ist nicht spezifisch für powershell. Es ist die Art, wie Perl unter Windows funktioniert. Sie werden im Allgemeinen ähnliche Probleme haben . cmd.exe

sollten Diese Versionen arbeiten:

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 

Sie können mit weniger entkommen mit Apostroph das gleiche zu tun.

Sie können die neue Zeile auch in Powershell einfügen, anstatt eine Newline-Escape-Sequenz an Perl zum Analysieren zu übergeben.

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

Was passiert, wenn Sie den "falschen" Befehl in cmd.exe anstelle von PowerShell ausführen? Ich frage, weil die Escape-Sequenz, die funktioniert (\") Perl ist; in PowerShell wäre es `` ``.

1

Interessant. Es scheint, als wenn Sie die Powershell-Welt verlassen, wandelt es das einfache Zitat in ein Doppelzitat, um von der Windows-Befehls-Shell richtig interpretiert werden ., dass) um zu demonstrieren, mit python (die das gleiche Problem aufweisen scheint):

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 

, die den gleichen Fehler, die ich, wenn ich versucht, etwas ähnliches aus dem Fenster Command Shell zu tun:

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

Es ist, als würde powershell dies tun, wenn das co ausgeführt wird mmand:

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 
Verwandte Themen