将参数传递给具有空格的目录的命令行

时间:2010-04-09 15:12:43

标签: perl command-line

我正在从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 个答案:

答案 0 :(得分:6)

使用system的多参数形式。这将使您免于处理shell转义问题,因此更加安全。

system( $perlExe, $contentcheck, '-t', $target_path, '-b', $base_path, '-o', $output_path, '-s', $size_threshold );

答案 1 :(得分:4)

既然你说“我用引号传递它们”,我认为你的意思是你通过shell将这些路径传递到你的脚本中。如果是这样,那么shell正在使用引号来确定参数 - 它不会将引号本身作为参数的一部分。

例如,请使用以下简单脚本:

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",等等。

答案 2 :(得分:0)

Contentcheck.pl是您编写的程序吗?对我来说,将它作为子程序(如果你只想从这个程序中使用它)或模块(如果你需要从其他地方使用它)似乎更自然。

然后参数成为子程序的参与者,你不需要担心空间等。

答案 3 :(得分:-2)

逃避它意味着:

system("cmd -a \"$firstopt\" -b \"$secondopt\"");