2010-05-25 7 views
3

J'ai un programme Perl qui fait quelque chose comme ci-dessous:Exécution d'un fichier de commandes à partir de Perl (ActiveState Perl sous Windows)

#!/usr/bin/env perl  
use strict; 
use warnings; 

my $exe = "C:\\project\\set_env_and_run.bat"; 

my $arg1 = "\\\\Server\\share\\folder1";  
my $arg2 = "D:\\output\\folder1"; 

my $cmd = "$exe \"$arg1\" \"$arg2\"";  
my $status = system("$cmd > c:\\tmp\\out.txt 2>&1"); 

print "$status\n"; 

J'appelle ce code Perl dans un bloc eval. Lorsque invoqué, j'obtiens l'état imprimé comme 0, mais le fichier de commandes n'a pas été réellement exécuté. Quelle serait la raison de cela? Un problème avec l'appel 'système' codé ci-dessus?

Merci, Jits

Répondre

1

Vous devez échapper à vos antislashs à l'intérieur des guillemets doubles.

my $exe = "C:\\project\\set_env_and_run.bat"; 
... 
my $status = system("$cmd > c:\\tmp\\out.txt 2>&1"); 
+0

Désolé, j'avais mis l'échantillon c ode et manqué échapper les barres obliques inverses! l'ai corrigé ci-dessus. – Jithesh

+0

Vous pouvez utiliser des barres obliques (directes) correctes dans les chemins d'accès aux fichiers dans Win32 perl? 'my $ exe = 'C: /project/set_env_and_run.bat';' fonctionnera très bien. – daotoad

1

Etes-vous sûr que le fichier bat n'est pas en cours d'exécution? J'ai pris votre code, réparé les chemins qui n'existent pas sur ma machine. Je reçois pour appeler le fichier batch

echo In myrun 1=%1 2=%2 

Et il écrit ce qui suit dans le fichier de sortie

In myrun 1="\\Server\share\folder1" 2="D:\output\folder1" 
1

Je dirais que vous devez définir exe comme ceci:

my $exe = "cmd.exe /c C:\\project\\set_env_and_run.bat"; 
0
vous

pourrait utiliser

system ("start C:\\project\\set_env_and_run.bat"); 
Questions connexes