можно открыть команду в perl выполнить скрипт .bat? - PullRequest
0 голосов
/ 13 марта 2020

У меня есть эта подпрограмма, которая запускает скрипт .bat, но я не вижу, какая строка это делает.

sub Traitement_Proc {

   foreach my $input (@_) {

    my $cmd = Fonctions_communes::ResolvEnvDos($input);
    my ($proc, $args);
    my $chExec;
    if ($cmd =~ /^\"/) {
        ($proc, $args) = $cmd =~ /^\"(.+?)\"(.*)/;
    } else {
        ($proc, $args) = $cmd =~ /^([^\s]+)(.*)/;
    }
    $chExec = File::Spec->catfile($::G_ParamTable{$::cstExecDir}, $proc);
    $chExec = File::Spec->rel2abs($chExec, File::Spec->curdir());
    $chExec = "\"".$chExec."\"" . $args;

    Fonctions_communes::PrintError("  PROC : "._("Execution of script")." <" . $chExec . ">");

    open PROC_OUT, $chExec." 2>&1"." & if ERRORLEVEL 1 exit/b 1"." |";
    while(my $output = <PROC_OUT>) {
        chomp($output);
        Fonctions_communes::PrintError(decode($Fonctions_communes::console_encoding,$output));
    }
    close(PROC_OUT);
    if ($? == 1) {
        Fonctions_communes::PrintError(_("The script [_1] ended in failure.",basename($chExec)).".\n");
        return 0;
    }
}

return 1;

}

внутри $input есть имя Файл bat, передаваемый в аргументе, в моем случае $args отсутствует, поэтому переменная chExec равна "C:\Users\anes.yahiaoui\Desktop\SPOOC_BD_TU_BD_XX_BD\tieme_RE_PCCA_BD_MAIN\RE_PCCA\BD\avantBDD\Gene_CSV\Proc\IMPORT_INV.bat".

, когда я вызываю эту функцию (Traitement_pro c), мой IMPORT_INV запускается, но я не видите, какая строка это делает?

1 Ответ

1 голос
/ 13 марта 2020

Это open при выполнении команды. И open(my $pipe, "shell_cmd |"), и open(my $pipe, "-|", "shell_cmd") выполняют команду оболочки с другим концом канала в $pipe, подключенным к его STDOUT.

Например,

use strict;
use warnings;
use feature qw( say );

use Win32::ShellQuote qw( quote_system_string );

open(my $pipe, quote_system_string(@ARGV)." |")
   or die $!;

while (<$pipe>) {
   chomp;
   say("[$_]");
}

if (!close($pipe)) {
   die("Error waiting for child to exit: $!\n")      if $!;
   die("Child killed by signal ".( $? & 0x7F )."\n") if $? & 0x7F;
   die("Child exited with error ".( $? >> 8 )."\n")  if $? >> 8;
}

say("Child completed successfully.");
>a.pl perl -le"print for 1..5"
[1]
[2]
[3]
[4]
[5]
Child completed successfully.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...