Windows下Perl执行lmutil命令时出现Invalid argument错误排查
问题原因分析
- 命令执行格式错误:Perl中通过
open执行外部命令并读取输出时,必须在命令末尾添加管道符|。你当前的$command1未包含该管道符,导致Perl误将整个命令字符串当作文件名尝试打开,而非执行外部命令,这是触发「Invalid argument」错误的核心原因。 - HTML实体干扰:命令中的
"是HTML转义字符,Perl会将其作为命令的一部分传递给系统,而非解析为路径所需的引号。而你在命令提示符中使用的是真实双引号,这也是Perl执行失败的关键诱因。
修正方案
方案1:修复原有命令格式
把命令中的"替换为真实双引号,并在末尾添加管道符|,同时保证路径转义正确:
# 修正后的命令(使用双反斜杠路径) $command1 = '"C:\Program Files\InnovMetric\PolyWorks MS License Server 2022\bin\lmutil.exe" lmstat -a -c "C:\Program Files\InnovMetric\PolyWorks MS License Server 2022\innovmet.lic" |'; # 也可使用正斜杠(Perl在Windows环境下兼容正斜杠路径) # $command1 = '"C:/Program Files/InnovMetric/PolyWorks MS License Server 2022/bin/lmutil.exe" lmstat -a -c "C:/Program Files/InnovMetric/PolyWorks MS License Server 2022/innovmet.lic" |'; print "Read license status ->$command1<\n\n"; open(STATUS, $command1) || die "Couldn't run $command1: $!\n";
方案2:使用更安全的Perl三参数open写法
这种写法无需手动处理引号和管道符,Perl会自动处理带空格的路径,更符合现代Perl编码规范:
my $lmutil_path = 'C:\Program Files\InnovMetric\PolyWorks MS License Server 2022\bin\lmutil.exe'; my $lic_path = 'C:\Program Files\InnovMetric\PolyWorks MS License Server 2022\innovmet.lic'; open(my $status_fh, '-|', $lmutil_path, 'lmstat', '-a', '-c', $lic_path) || die "Couldn't run lmutil: $!\n"; # 读取命令输出示例 while (my $line = <$status_fh>) { print $line; } close($status_fh);
内容的提问来源于stack exchange,提问作者Bill
相关产品推荐
相关产品推荐

