在Jenkins中执行Windows批处理命令失败,但在cmd.exe中可以正常运行。

18

我正在尝试在 MSbuild 后在 Jenkins 中运行此命令。

xcopy "C:\Program Files (x86)\Jenkins\workspace\trunk\Projects\results\results\obj\Debug\Package\PackageTmp" "Y:\Extraction_Zone\Jenkins\" /E 

Y: 是一个映射的网络驱动器。在cmd.exe中正常运行,但是在尝试在Jenkins中运行时,出现错误无效的驱动器规范

以下是来自Jenkins的输出:

Time Elapsed 00:00:04.03
[trunk] $ cmd /c call C:\Windows\TEMP\hudson3389873107474371072.bat

C:\Program Files (x86)\Jenkins\workspace\trunk>xcopy "C:\Program Files (x86)\Jenkins\workspace\trunk\Projects\results\results\obj\Debug\Package\PackageTmp" "Y:\Extraction_Zone\Jenkins\" /E 
Invalid drive specification
0 File(s) copied

C:\Program Files (x86)\Jenkins\workspace\trunk>exit 4 
Build step 'Execute Windows batch command' marked build as failure
Finished: FAILURE

非常感谢您的帮助。


3
Jenkins是否作为服务运行?如果是的话,您应该通过在网络路径中指定而不是映射驱动器来解决问题。 - Steve B
2
Y: 可能映射到特定用户。Jenkins 可能在其自己的“服务帐户”下运行,无法访问该驱动器字母 Y:。您可以尝试使用 UNC 路径代替 Y:,例如 "\ServerName\Folder\Extraction_zone\Jenkins"。 - JMC
感谢回复。我尝试了这个,但是出现了访问被拒绝的错误:`Time Elapsed 00:00:03.70 [trunk] $ cmd /c call C:\Windows\TEMP\hudson7535872922876977589.batC:\Program Files (x86)\Jenkins\workspace\trunk>xcopy "C:\Program Files (x86)\Jenkins\workspace\trunk\Projects\results\results\obj\Debug\Package\PackageTmp" "\COMP-NAME\Webs\Extraction_Zone" /E Access denied Unable to create directory - \COMP-NAME\Webs\Extraction_Zone 0 File(s) copiedC:\Program Files (x86)\Jenkins\workspace\trunk>exit 4 Build step 'Execute Windows batch command' marked build as failure Finished: FAILURE` - Chris
我意识到我忘记了路径中的\Jenkins部分,但仍然收到“无效驱动器规范”错误:C:\Program Files (x86)\Jenkins\workspace\trunk>xcopy "C:\Program Files (x86)\Jenkins\workspace\trunk\Projects\results\results\obj\Debug\Package\PackageTmp" "\\COMP-NAME\Webs\Extraction_Zone\Jenkins\" /E Invalid drive specification - Chris
你解决了吗?我遇到了类似的问题(Jenkins行为与命令行不同)。 - Kohanz
7个回答

17

我曾经也遇到了类似的问题。尝试在 services.msc 中授予 Jenkins 服务“作为此帐户登录”的权限,并确保您在那里键入的帐户与您用于运行 cmd.exe 的帐户相同。

输入图片描述


这似乎没有起作用。我尝试以管理员身份登录,但是我仍然遇到了相同的错误。 - Chris
1
我正在使用我的工作机器运行,我遇到了同样的问题。我按照@adarshr的建议使用了"This Account"和"Browse...",然后查找了我的企业AD帐户信息和密码。非常顺利地解决了问题! - TWhite
我遇到了一个问题:在更改用户后,服务会启动然后停止。请检查事件查看器以获取更多信息。在我的情况下,我的用户没有访问C:\program files\jenkins的权限。 - DLeh
如果您通过GIT选项无法在批处理中工作,但在cmd.exe中可以,请访问以下链接:https://issues.jenkins-ci.org/browse/JENKINS-34082 - Peter PitLock

4
这些基于Java JAR文件的命令对我很有用:
cmd
net use x: \\
xcopy "dist\" x:\ /Y

就是这样!我花了很多时间解决这个问题,但直到我写了CMD和NET USE,什么都没起作用。
我既不需要更改jenkins服务的权限,也不需要使用runas命令。

但我必须提到,每个人都有读写网络驱动器的权限。

1
这对我也起作用了(根据@adarshr的回复,我已经有了Jenkins服务器)。为了提高可读性,第二行意味着net use x: \\yournetworkshare\foldername - Schaki
这也解决了我的Python脚本问题,因为它们试图写入网络位置。更改/更新登录用户并没有起作用... - radix07

1

对大多数问题都有简单的解决方法。

  1. 制作一个批处理命令,将要运行的内容放在文件名为filename.bat的文件中,其中包含命令提示符文本。
  2. 制作一个普通的Windows快捷方式,编辑快捷方式的高级属性并勾选“以管理员身份运行”(非常巧妙)。
  3. 现在从Jenkins命令行调用运行filename.lnk快捷方式,这将使您绕过所有烦琐的步骤。

:)


'"C:\your.lnk"' 不被识别为内部或外部命令。这就是你得到的结果 ;) - Davut Gürbüz

1
我在Windows任务中运行批处理文件时遇到了同样的问题(虽然不完全一样),我尝试将文件复制到网络位置,即共享驱动器。我使用了UNC路径和映射驱动器,但错误是相同的。对我来说,它是错误编号4 - MS DOS错误代码。 解决方案是使用 net use 命令!希望能有所帮助。

0

我已经解决了与CIFS插件相关的问题。


0

Adarshr的解决方案(即修改服务的登录凭据)对我部分问题起作用:在我的情况下,这使我成功地检出了一个mercurial存储库(使用ssh协议),而当使用“本地系统帐户”时我无法做到这一点。

然而,我仍然在运行命令行脚本或从jenkins“执行shell”脚本运行相同脚本时有不同的行为。在我的情况下,我编译了一个Python扩展程序。在Jenkins中,我无法导入扩展程序(我没有看到任何错误,但执行简单停止,所以我怀疑它会崩溃)。

如果我卸载服务并将slave代理作为Java Web Start运行,则会得到相同的行为。这对我来说是一个临时的解决办法,但这意味着当我重新启动Windows构建机器时,我必须手动重新启动Java Web Start应用程序。

因此-至少在我的情况下-很明显这是一个凭据问题。

凭据使用文档:https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI


0

遇到类似的问题,找到了两种解决方法。

方法一: 告知Jenkins关于映射驱动器。 1. 转到 -> 管理 Jenkins -> 脚本控制台(Groovy脚本)。 2. 运行下面的命令。

 def mapdrive = "net use Y: \\\\copy_nework_address"
 mapdrive.execute();
 println "net use".execute().getText()

类型:2 1. 转到 -> 命令提示符 -> 运行“net use”以了解网络地址

xcopy "C:\Program Files (x86)\Jenkins\workspace\trunk\Projects\results\results\obj\Debug\Package\PackageTmp" "Copy_Network_Address\Extraction_Zone\Jenkins\" /E

结论:我更喜欢第二种类型,因为每次重启后我都需要运行Groovy脚本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接