Perl通过bsub调用SCHTASKS时因引号问题报错的解决咨询
解决Perl中通过bsub调用SCHTASKS的引号转义及参数错误问题
问题核心
直接在命令行执行以下SCHTASKS命令可正常创建任务:
SCHTASKS /create /tn "ADW_generic" /s noivw-pulsereg3 /tr "\"U:\adw_prerun_bat_file\filesToUseInAutomatedPvReg\ADWGeneric_cic.bat\" -var 23232 " /sc ONCE /sd 12/29/2014 /st 12:00 /f
但在Perl中通过system调用bsub执行该命令时,会触发ERROR: Invalid argument/option - '-var'错误;调整引号转义又会引发Perl语法错误Bareword found where operator expected...,即使生成的命令在命令行可运行,Perl调用仍失败。本质是多层命令解析(Perl字符串、bsub shell、cmd.exe)的引号转义逻辑冲突,导致/tr参数被拆分,-var被误判为SCHTASKS的顶层选项。
解决方案
方法1:使用Perl数组形式调用(推荐)
Perl的system函数支持数组参数,直接传递每个独立参数,避免多层shell的引号解析混乱,这是最可靠的方式:
my @cmd = ( 'bsub', 'SCHTASKS', '/create', '/tn', 'ADW_generic', '/s', 'noivw-pulsereg3', '/tr', '"U:\\adw_prerun_bat_file\\filesToUseInAutomatedPvReg\\ADWGeneric_cic.bat" -var 23232', '/sc', 'ONCE', '/sd', '12/29/2014', '/st', '12:00', '/f' ); system(@cmd) == 0 or die "Command failed: $?";
- 路径中的反斜杠需在Perl字符串中转义为
\\,确保传递给cmd时为正确的单反斜杠 /tr参数整体作为一个元素传递,bsub会完整传递给SCHTASKS,不会拆分参数
方法2:调整字符串形式的转义规则
若必须用字符串调用,需处理三层转义(Perl、bsub shell、cmd.exe):
my $cmd = 'bsub SCHTASKS /create /tn "ADW_generic" /s noivw-pulsereg3 /tr "\\"U:\\adw_prerun_bat_file\\filesToUseInAutomatedPvReg\\ADWGeneric_cic.bat\\" -var 23232" /sc ONCE /sd 12/29/2014 /st 12:00 /f'; system($cmd) == 0 or die "Command failed: $?";
- Perl中用
\\"表示最终传递给SCHTASKS的双引号(Perl转义为\"给shell,shell再转义为"给SCHTASKS) - 路径反斜杠同样需转义为
\\
内容的提问来源于stack exchange,提问作者PPP
相关产品推荐
相关产品推荐

