2011-05-27 14 views
8

He estado usando mi propio entorno personal que ha funcionado de manera consistente durante más de 20 años. Comencé a incorporar muchos scripts Perl hace unos 14 años. He estado usando el mismo árbol de intérpretes de línea de comandos durante 22 años (NDOS-> 4DOS-> 4NT-> TCMD, en realidad el mismo programa).De repente, las secuencias de comandos perl no funcionan a menos que las prefija con "perl" y den la ruta completa a la secuencia de comandos

Acabo de cambiar de ActiveState Windows Perl a Strawberry Perl.

Durante años, esto es todo lo que he necesitado para ejecutar un script Perl:

SET .pl=perl 

Este es el modo de especificar programa para abrir cosas con.

esto puedo simplemente hacer:

c:\>test.pl 
Hello, world! 

cosas simplemente trabajaban. Siempre.

Hoy, en un sistema operativo de una semana, las cosas simplemente dejaron de funcionar.

Los scripts de Perl se ejecutarán, pero no HARÁN nada. No hay error. Ninguna salida. Nada.

La única forma de que funcione es si prefijo el script con "perl" (en cuyo caso, mi ruta no se busca porque el nombre del script es ahora un parámetro, así que me queda completar la ruta completa) para el guión)

esto es lo que se siente al ser yo:

C:\>test.pl 

C:\>perl test.pl 
Can't open perl script "test.pl": No such file or directory 

C:\>perl c:\bat\test.pl 
Hello, world! 

Tenga en cuenta que este estaba trabajando bien ayer, incluso el día de hoy. No sé qué cambió esto y qué lo rompió, y he mirado bastante tiempo, encontré problemas similares pero no idénticos, y ninguna solución ha ayudado.

I hvae un bote de scripts. Realmente odiaría tener que insertar el mundo "perl" antes de cada uno de ellos, ¡y luego calificar el camino completo!

De manera realista, probablemente tenga que escribir un contenedor perl.bat que convierta el parámetro nombre de archivo en una ruta de acceso totalmente calificada, y llame explícitamente a perl.

Realmente no quiero hacer eso. Esa es una solución de ban-aid. Quiero entender lo que está mal, la dirección es, y resolverlo.

estoy empezando a odiar Windows 7 ...

Respuesta

8

Creo que su problema es más probable que la asociación a .pl a perl.exe está roto.

Mira HKEY_CLASSES_ROOT \ .pl en el registro es probable que tenga Perl subnodo (o decir FOO) debajo de ella

Ahora mira HKEY_CLASSES_ROOT \ Perl o FOO si ese es el caso.

debe tener un shell \ open \ command clave

que debería ser algo como esto

"C:\Perl\bin\perl.exe" "%1" %* 

Por supuesto, el camino perl.exe en su sistema puede ser diferente. El % * es el bit importante que pasa los argumentos que pasa a su secuencia de comandos a perl.exe

Así que cuando haces "test.pl foo bar" en una ventana de comandos, el shell detrás de las escenas es en realidad invocando

C:\perlpath\perl.exe C:\scriptpath\test.pl foo bar. 

Este tipo de problema ocurre cuando simplemente escoge un archivo * .pl en el Explorador de windows y tratar de asociarlo con perl.exe.

Como ventaja añadida, si agrega .PL a PATHEXT variable de entorno que incluso no tiene que especificar test.pl simplemente prueba invocará test.pl si es por primera vez en el camino :)

+2

I _think_ una línea de comandos para ver sus asociaciones de archivos es a través del comando "Assoc". Escribir 'assoc .pl' en mi máquina de Windows produce' ".pl =" ', lo que significa que mis archivos .pl no están asociados con Perl. ¡Buena suerte! – rickumali

1

Puede verificar su asociación de extensión de archivo haciendo clic con el botón derecho en un archivo .pl, seleccione properties y haga clic en el botón "abrir con" (esto es XP, no sé cómo se ve en Windows 7). Es posible que su extensión esté apuntando al lugar equivocado.

2

Windows PowerShell

en Windows PowerShell, agregue .PL a la variable de entorno PATHEXT (de lo contrario la secuencia de comandos se ejecutará en una ventana separada CMD).

Sin embargo, Powershell no se ejecutará comandos a menos que estén en el PATH (es decir, no está en $ env "": PATH por defecto, un poco como root en Unix)

Por lo tanto, para ejecutar un script

./script 
./script.pl 

La manera más fácil es utilizar el perfil de Powershell.

p. Ej. en C: \ Users \ nombre de usuario \ Documents \ WindowsPowerShell \ Microsoft.PowerShell_profile.ps1

$env:PATH = "C:\strawberry\perl\bin;$env:PATH" 
$env:PATHEXT = "$env:PATHEXT;.PL" 

Si desea no tener que hacer ./ (y tenga en cuenta, este es un riesgo de seguridad), añadir "" a la trayectoria (sin las comillas)

$env:PATH = "C:\strawberry\perl\bin;$env:PATH;." 

A continuación, puede simplemente hacer

script 
Cuestiones relacionadas