编辑 - 下面发布的答案
我有一个通常使用@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>
答案 0 :(得分:3)
回答 - 感谢ikegami!
根据ikegami的建议,我在下面发布了一个使用来自Win32::API
的{{1}}和CommandLineToArgvW
的工作程序。它是故意冗长的,希望对于像我这样对C和指针算法极其生疏的人来说更容易理解。
除了明显的简化之外,欢迎任何提示:)
shell32.dll
答案 1 :(得分:2)
在unix系统中,shell将shell命令解析为字符串。但在Windows中,它取决于每个应用程序。我认为通常使用CommandLineToArgv
系统调用(您可以在Win32::API的帮助下调用)来完成此操作,但如果您想自行重新实现,则会记录规范here。< / p>