通过Jenkins运行时,Perl SYSTEM命令失败,并显示“错误的文件描述符”

我有一个简单的系统命令,可将文件从一个文件夹复制到另一个文件夹:

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之后,这个问题就开始了,但是我认为这没有关系。 它曾经工作过,但现在总是失败:(

tanxx 回答:通过Jenkins运行时,Perl SYSTEM命令失败,并显示“错误的文件描述符”

反斜杠在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
本文链接:https://www.f2er.com/3158692.html

大家都在问