我有一个简单的系统命令,可将文件从一个文件夹复制到另一个文件夹:
my $cmd = "xcopy /Y c:\DBs\Support\db.bak c:\jenkins\workdir\sql-bak-files";
当我尝试运行以下系统命令时,全部失败:
1. my $res = qx/$cmd/;
2. my $res = qx($cmd);
3. using back ticks
所有尝试均返回错误:Error number -1, error message: "Bad file descriptor"
。
尝试使用system($ cmd)时,错误为Error number 65280, error message: "No such file or directory"
。
此Perl代码通过Jenkins(版本2.190.1)和perl v5.26.0运行。 在将代码从mercurial迁移到git之后,这个问题就开始了,但是我认为这没有关系。 它曾经工作过,但现在总是失败:(
答案 0 :(得分:3)
反斜杠在Perl引用的字符串中具有特殊含义。它用于转义以下字符-“关闭”任何特殊含义。如果要在Perl引用的字符串中使用反斜杠,则需要使用另一个反斜杠将其转义。
my $cmd = 'xcopy /Y c:\\DBs\\Support\\db.bak c:\\jenkins\\workdir\\sql-bak-files';
或者,Perl可以识别Windows路径中的正斜杠,因此使用以下代码替换代码可能会更容易:
my $cmd = 'xcopy /Y c:/DBs/Support/db.bak c:/jenkins/workdir/sql-bak-files';
请注意,在两种情况下,我都将双引号替换为单引号。这对您的问题没有影响,但是如果您不使用双引号的字符串的任何特殊特征(例如变量的扩展),则使用双引号的字符串似乎很奇怪。
更新:要调试此类问题,可以尝试print
输入字符串。
$ perl -E'say "xcopy /Y c:\DBs\Support\db.bak c:\jenkins\workdir\sql-bak-files"'
xcopy /Y c:DBsSupportdb.bak c:jenkinsworkdirsql-bak-files