我正在尝试使用system
命令来启动一个带有多个参数的exe,包括启动更多带有参数的exes。
设置如下。
Apple.exe
将一切视为一种论据。
Box.exe
是一个也带参数的论据。所以现在我们是2层。
这是伪代码,其中引号的数量等于参数层
system(Apple.exe 'Box.exe' "/candy" "/dawn" 'elf.exe' "/fence")
将Apple.exe
以下的所有内容传递到Apple.exe
时,将其分解出来,有些参数可以自行调用。我们最终得到Apple.exe
有5个参数,其中2个参数是调用,其中3个是2个调用的参数。
Apple.exe
Box.exe /candy /dawn
elf.exe /fence
答案 0 :(得分:1)
这不是系统调用的方式。当您调用可执行文件时,它会传递一个参数列表。这是一个字符串数组 - 没有嵌套其他数组的概念。这不是Perl特定的限制;它就是系统调用在主流操作系统中的工作方式。
一个建议可能是使用两个参数调用Apple.exe:
system(
"Apple.exe",
"Box.exe /candy /dawn",
"elf.exe /fence",
);
当Apple.exe收到两个参数时,它可以在空格上拆分它们以构建它需要的任何结构。如果参数本身可能包含空格,请选择要拆分的另一个字符:
system(
"Apple.exe",
"Box.exe~/candy~/dawn",
"elf.exe~/fence",
);
或者,您可以将您的参数作为JSON写入文件:
[
[ "Box.exe", "/candy", "/dawn" ],
[ "elf.exe", "/fence" ]
]
然后调用Apple.exe,为其提供JSON文件的路径:
system("Apple.exe", "argument-list.json");
当然,无论你做出什么选择,你都需要确保Apple.exe被编程为以你选择传递它们的任何方式接收它的参数。
答案 1 :(得分:0)
如果这是一个基于unix的系统,我会说这些信息是作为一系列shell命令传递的。 apple
将被称为如下:
use String::ShellQuote qw( shell_quote );
system(shell_quote('apple',
shell_quote('box', '--candy', '--dawn'),
shell_quote('elf', '--fence'),
));
生成相当于
的东西apple 'box --candy --dawn' 'elf --fence'
apple
看起来像是:
for my $cmd (@ARGV) {
system($cmd); # aka system('sh', '-c', $cmd);
}
但是你似乎在使用Windows,而Windows中的命令行处理有点脆弱。你可以试试
use Win32::ShellQuote qw( quote_cmd );
system(quote_cmd('apple',
quote_cmd('box', '/candy', '/dawn'),
quote_cmd('elf', '/fence'),
));
产生一个丑陋的混乱,应该等同于
apple "box /candy /dawn" "elf /fence"
apple
仍然如下:
for my $cmd (@ARGV) {
system($cmd); # aka system('cmd', '/x', '/c', $cmd);
}