2009-08-08 13 views
6

Soy un usuario de Linux desde hace mucho tiempo, pero soy nuevo en Windows y PowerShell. Acabo de instalar Windows7 y Strawberry Perl 5 por primera vez. Ahora quiero hacer una impresión simple de línea de comandos con Windows PowerShell.¿Por qué PowerShell (con Perl) elimina las comillas dobles en una simple declaración de impresión?

Parece que Perl instalado correctamente:

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

y cosas de línea de comandos funciona:

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

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

Pero cuando lo intento por sí mismo muestra una advertencia FileHandler:

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

Parece que eliminar las comillas dobles.

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

Eso funciona pero es feo! Vamos a intentarlo de nuevo:

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

Eso es más como él, pero estoy confundido.

¿Por qué PowerShell está escapando de las comillas dobles dentro de las comillas simples? ¿Hay usuarios de PowerShell por ahí?

+1

¿Has probado 'perl -e" print 'Hello, World' "'? – Weegee

Respuesta

3

Creo que hay un par de problemas aquí. Una es que las citas tienen un significado simbólico tanto en powerhell como en perl. Las citas y los escapes funcionan de forma un tanto diferente en powershell que en un shell de UNIX. Echa un vistazo a man about_quoting en powershell.

El segundo problema es que la línea de comandos de perl se comporta de manera diferente en el período de Windows. Cualquier comilla doble dentro de la línea de comando que quiera pasar a Perl debe ser escapada en términos perl como \ ". Esto no es específico de powershell. Es la forma en que perl funciona en Windows. En general, usted tendrá problemas similares con . cmd.exe

Estas versiones debería funcionar:

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 

Usted puede hacer lo mismo con menos de escapar usando comilla simple.

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 

También puede poner la nueva línea en powershell en lugar de pasar una nueva secuencia de escape a perl para analizar.

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

¿Qué ocurre si ejecuta el comando "incorrecto" en cmd.exe en lugar de PowerShell? Lo pregunto porque la secuencia de escape que funciona (\") es de Perl; en PowerShell sería `` "`.

1

Interesante. Parece que al salir del mundo de powershell, convierte la comilla simple en una comilla doble para ser interpretada correctamente por el shell de comandos de Windows. (O algo así como . eso) para demostrar con Python (que parece exhibir el mismo 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 

que es el mismo error que consigo si trataba de hacer algo similar desde el shell de comandos de 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 

Es como si PowerShell estuviera haciendo esto al ejecutar la co 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 
Cuestiones relacionadas