2016-02-11 3 views
2

J'ai besoin de mon programme Perl pour exécuter une commande DIR dans la ligne de commande Windows. J'utilise ces lignes:Impossible de terminer une commande à partir de la ligne d'invite, en utilisant qx en Perl

$percorso1= C:\PerlEsercitazione\FileCompare1\VSS\Divina Cömmediä\ProgettoTest 
my $cmd_string = "dir /ad /b ".$percorso1 ; 
my @result = qx {$cmd_string};        

évidemment $percorso1 est le chemin à suivre. Le problème est que @result s'avère être vide. J'ai tapé la commande DIR directement dans le shell et cela fonctionne, donc le problème devrait être dans la fonction qx. Où ai-je tort?

de toute façon j'ai essayé d'utiliser readdir, opendir et closedir mais en utilisant ce code:

opendir ("Temp_VSS", $percorso1); 
my @result = readdir ($percorso1); 
closedir ("Temp_VSS"); 

et je reçois l'erreur "mauvaise symble pour DIRHANDLE"

+0

Pourquoi vous ne pas utiliser les perl readdir fonction? – Jens

+0

Je suis un "newbe" chez Perl et je ne connais pas cette fonction ... Je vais la chercher dans un livre de texte et ensuite je vous informerai. – Maurizio

+0

Ce qui est dans $ percorso1 – 123

Répondre

2

Je ne sais pas pourquoi ce fail (peut-être dir n'est pas vraiment un exécutable mais plutôt une commande shell, donc vous pouvez essayer avec cmd /c "dir /ad /b $percorso1"). Mais généralement, il est préférable d'éviter les programmes externes pour quelque chose que vous avez des fonctions internes.

Ici spécifiquement File::Slurp::read_dir peut faire la même chose pour vous beaucoup plus facile et la gestion des erreurs internes:

my @files = File::Slurp::read_dir($percorso1, err_mode => 'carp', keep_dot_dot => 0); 
+0

Cela ressemble à un bon moyen d'éviter le problème précédent mais ... quelle était l'erreur dans ma précédente tentative? – Maurizio

+0

Ou vous pourriez juste utiliser 'my @files = <$percorso1>'. – TLP

+0

Merci à tous. Le problème a été corrigé. J'ai remplacé qx {} par qx(), et comme vous l'avez suggéré dans les autres commentaires, j'ai ajouté le "" sur les chemins. – Maurizio

1

La déclaration percorso1 $ manque les guillemets. Vous devrez inverser les antislashs. La ligne devrait se terminer par un point-virgule. Aussi, vous aurez besoin d'utf8; car votre code source contient des caractères encodés en utf8.

Pour le deuxième extrait regardez ici: Perl: Bad Symbol for dirhandle