Передача аргументов в командную строку с каталогами, имеющими пробелы - PullRequest
2 голосов
/ 09 апреля 2010

Я делаю системный вызов из perl для ContentCheck.pl и передаю параметры с каталогами (с пробелами). Поэтому я передаю их в кавычках, но они не собираются в файле ContentCheck.pl

Random.pm 1)

my $call = "$perlExe $contentcheck -t $target_path -b $base_path -o $output_path -s $size_threshold";
print "\ncall: ".$call."\n";
system($call);

Contentcheck.pl

    use vars qw($opt_t $opt_b $opt_o $opt_n $opt_s $opt_h);  # initialize
    getopts('t:b:o:n:s:h') or do{ 
    print "*** Error:  Invalid command line option.  Use option -h  for help.\a\n";
    exit 1};

    if ($opt_h) {print $UsagePage; exit; }

    my $tar;
    if ($opt_t) {$tar=$opt_t; print "\ntarget ".$tar."\n";} else {
    print " in target";
    print 
     "*** Error:  Invalid command line option.  Use option -h  for help.\a\n";
    exit 1;}
    my $base;
    if ($opt_b) {$base=$opt_b;} else {
    print "\nin base\n";
    print "*** Error:  Invalid command line option.  Use option -h  for help.\a\n";
    exit 1;}

Это вывод в командной строке

call: D:\tools\PacketCreationTool/bin/perl/winx64/bin/perl.exe D:/tools/PacketCr
eationTool/scripts/ContentCheck.pl -t "C:/Documents and Settings/pkkonath/Deskto
p/saved/myMockName.TGZ" -b "input file/myMockName.TGZ" -o myMockName.validate -s
 10

target C:/Documents

in base
*** Error:  Invalid command line option.  Use option -h  for help.

Любые предложения приветствуются! Спасибо.

2) Когда я прохожу это так

my $call = "$perlExe $contentcheck -t \"$target_path\" -b \"$base_path\" -o $output_path -s $size_threshold";
print "\ncall: ".$call."\n";
system($call);

Это вывод

call: D:\tools\PacketCreationTool/bin/perl/winx64/bin/perl.exe D:/tools/PacketCr
eationTool/scripts/ContentCheck.pl -t ""C:/Documents and Settings/pkkonath/Deskt
op/saved/myMockName.TGZ"" -b ""input file/myMockName.TGZ"" -o myMockName.validat
e -s 10

target C:/Documents

in base
*** Error:  Invalid command line option.  Use option -h  for help.

3)

my $call = "$perlExe, $contentcheck, '-t', $target_path, '-b', $base_path, '-o', $output_path, '-s', $size_threshold";
print "\ncall: ".$call."\n";
system($call);

Это вывод:

Can't open perl script ",": No such file or directory

Ответы [ 4 ]

6 голосов
/ 09 апреля 2010

Вместо этого используйте форму с несколькими аргументами system.Это избавит вас от необходимости решать проблемы с выходом из оболочки и, следовательно, станет намного безопаснее.

system( $perlExe, $contentcheck, '-t', $target_path, '-b', $base_path, '-o', $output_path, '-s', $size_threshold );
4 голосов
/ 09 апреля 2010

Поскольку вы говорите: «Я передаю их в кавычках», я так понимаю, вы имеете в виду, что вы передаете эти пути в свой сценарий через оболочку. Если это так, то оболочка использует ваши кавычки для определения аргументов - сами кавычки не являются частью аргумента.

Например, возьмите следующий простой скрипт:

echo $1

И обратите внимание на разницу между этими различными форматами аргументов:

# ./test.sh 1 2 3
1

# ./test.sh "1 2 3"
1 2 3

# ./test.sh "\"1 2 3\""
"1 2 3"

Если вы действительно хотите передавать кавычки в ваш скрипт из командной строки, вам нужно их экранировать, как в третьем примере.

Это не очень удобный для пользователя вариант, поэтому я рекомендую вам добавлять кавычки во все полные пути в вашем скрипте. Например. -t "$target_path" и т. Д.

0 голосов
/ 09 апреля 2010

Это Contentcheck.pl программа, которую вы написали. Для меня было бы более естественным сделать это подпрограммой (если вы хотите использовать ее только из этой программы) или модулем, если вам нужно использовать ее из других источников.

Тогда параметры становятся аргументами подпрограммы, и вам не нужно беспокоиться о пробелах и т. Д.

0 голосов
/ 09 апреля 2010

Побег это означает:

system("cmd -a \"$firstopt\" -b \"$secondopt\"");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...