将字符串解析为ARGV等价物(Windows和Perl)

时间:2015-03-25 23:01:13

标签: windows perl arguments

编辑 - 下面发布的答案

我有一个通常使用@ARGV参数的脚本,但在某些情况下,它是由另一个脚本(我无法修改)调用的,而是只传递一个配置文件名,其中包含命令行选项。直接通过了。

示例:

Args=--test --pdf "C:\testing\my pdf files\test.pdf"

如果可能的话,我想要一种方法将这个字符串解析成一个与@ARGV相同的数组。

我有一个解决方法,我设置了一个只有echos @ARGV的外部perl脚本,我调用了这个脚本,如下所示(删除了标准样板文件)。

echo-args.pl

print join ("\n", @ARGV);

test-echo-args.pl

$my_args = '--test --pdf "C:\testing\my pdf files\test.pdf"';
@args = map { chomp ; $_ } `perl echo-args.pl $my_args`;

这似乎不够优雅,但它确实有效。没有调用新进程有没有更好的方法?我确实尝试过拆分和处理,但命令行上有一些奇怪之处,例如-a"b c"变为'-ab c'-a"b""变为-ab",我宁愿不担心边缘情况,但我知道如果不这样做,有一天会咬我。 / p>

2 个答案:

答案 0 :(得分:3)

回答 - 感谢ikegami!

根据ikegami的建议,我在下面发布了一个使用来自Win32::API的{​​{1}}和CommandLineToArgvW的工作程序。它是故意冗长的,希望对于像我这样对C和指针算法极其生疏的人来说更容易理解。

除了明显的简化之外,欢迎任何提示:)

shell32.dll

答案 1 :(得分:2)

在unix系统中,shell将shell命令解析为字符串。但在Windows中,它取决于每个应用程序。我认为通常使用CommandLineToArgv系统调用(您可以在Win32::API的帮助下调用)来完成此操作,但如果您想自行重新实现,则会记录规范here。< / p>