2009-08-08 5 views
6

Sono un utente Linux da molto tempo, ma sono nuovo a Windows e PowerShell. Ho appena installato Windows7 e Strawberry Perl 5 per la prima volta. Ora voglio eseguire una semplice stampa da riga di comando con Windows PowerShell.Perché PowerShell (con Perl) rimuove le virgolette doppie in una semplice istruzione di stampa?

Sembra Perl installato correttamente:

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

e roba da riga di comando funziona:

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

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

Ma quando provo tutto da sé viene stampato un avvertimento filehandler:

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

Quindi sembra che rimuova le virgolette doppie.

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

Che funziona ma è brutto! Proviamo ancora:

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

Quello è più piace, ma io sono confuso.

Perché PowerShell sta sfuggendo alle virgolette tra virgolette singole? Qualsiasi utente PowerShell è disponibile?

+1

Avete provato "perl -e" print "Hello, World" "'? – Weegee

risposta

3

Penso che ci siano un paio di problemi qui. Uno è che le virgolette hanno un significato simbolico sia in powershell sia in perl. Le virgolette e le operazioni di escape funzionano in modo leggermente diverso in PowerShell rispetto a una shell UNIX. Dai un'occhiata a about_quoting in powershell.

Il secondo problema è che la riga di comando perl si comporta diversamente durante il periodo di Windows. Qualsiasi doppia citazione all'interno della riga di comando che si desidera passare a perl deve essere sfuggita in termini di perl come \ ". Questo non è specifico per PowerShell.è il modo in cui perl funziona su Windows. . cmd.exe

Queste versioni dovrebbe funzionare:

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 

Si può fare la stessa cosa con meno fuga utilizzando apostrofo.

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 

Si può anche mettere il ritorno a capo in PowerShell invece di passare una sequenza di escape nuova linea di perl per l'analisi.

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

Cosa succede se si esegue il comando "errato" in cmd.exe anziché in PowerShell? Chiedo perché la sequenza di escape che funziona (\") è di Perl; in PowerShell sarebbe `` ".

1

Interessante: sembra che quando si abbandona il mondo di PowerShell, converta la virgoletta singola in virgoletta doppia per essere interpretata correttamente dalla shell dei comandi di Windows. . che) per dimostrare con Python (che sembra presentare lo stesso problema):

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 

che è lo stesso errore che ottengo se ho cercato di fare qualcosa di simile dalla shell dei comandi di 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 

È come se PowerShell stia facendo questo quando esegue il co mm e:

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 
Problemi correlati