当我运行命令时:
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 中通过 bsub (使用系统)运行相同的命令时,如下所示:
my $cmdTriggerServerSetup = "bsub -J ADWServer -m machine1 -e //noida02/psd/error_tette.log -q win_normal \'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\'";
出现以下错误:
ERROR: Invalid argument/option - '-var'.
Type "SCHTASKS /CREATE /?" for usage.
如何消除这个错误?我知道错误在某种程度上是由于引号引起的,因此需要帮助弄清楚如何将引号添加到命令中。
我希望所需的字符串是
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
但是当我使用 as 时:
my $cmdTriggerServerSetup = "bsub -J ADWServer -m machine1 -e //noida02/psd/error_tette.log -q win_normal \'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\'";
它给我一个错误:
Bareword found where operator expected at test.pl line 24, near "U"
(Missing operator before U?)
问题如所陈述,并有一些猜测来填补空白:
您对某些未指定的 shell 有此 shell 命令:
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
您想将其作为参数传递给
bsub
。
bsub -J ADWServer -m machine1 -e //noida02/psd/error_tette.log -q win_normal '...'
并且您希望在使用
system
的系统上使用 Perl 的 sh
来运行它。 (你实际上说csh
以某种方式参与其中,但没有解释如何参与。)
首先,让我们将该字符串放入变量中。在特定情况下,我们可以简单地使用单引号。
my $remote_cmd = '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';
接下来,我们需要为
sh
构建 bsub 命令。
use String::ShellQuote qw( shell_quote );
my $local_cmd = shell_quote(
bsub => (
-J => "ADWServer",
-m => "machine1",
-e => "//noida02/psd/error_tette.log",
-q => "win_normal",
$remote_cmd,
)
);
最后,这只是执行它的问题,看起来像这样
system( $local_cmd );
请注意,您可以通过使用以下内容来避免本地 shell 和
shell_quote
的需要:
system(
bsub => (
-J => "ADWServer",
-m => "machine1",
-e => "//noida02/psd/error_tette.log",
-q => "win_normal",
$remote_cmd,
)
);