我创建了以下.bat
文件来关闭 onedrive 服务:
whoami
"C:\Program Files\Microsoft OneDrive\OneDrive.exe" /shutdown
如果我双击.bat
图标文件,它就会起作用。此外,当我运行命令行 shell 并输入 时,它也会起作用"C:\Users\john\Desktop\onedrive-shutdown.bat"
。
现在,我在以(登录属性)连接方式的同一台 Windows 服务器上运行 Jenkins 服务john
,并且创建了一个包含以下构建步骤的项目:
不幸的是,/shutdown
由于我得到以下输出,该过程挂起/循环:
whoami
john
"C:\Program Files\Microsoft OneDrive\OneDrive.exe" /shutdown
(和...
图标。此外,OneDrive 不会关闭)。
我错过了什么?
注意:
- Jenkins 服务登录属性设置为:
john
- 我试过了
psexec64 -i 1 -u john -p PASSWORD "C:\Program Files\Microsoft OneDrive\OneDrive.exe" /shutdown
,但是没有用(结果相同)。 runas
由于用户john
已经有密码,因此我无法使用。- 任何其他
.bat
文件,例如echo Hello World
都可以。
这可能是因为 Jenkins 在会话 0 中作为 Windows 服务运行,而 OneDrive 在交互式用户会话(会话 1、2 等)中运行。/shutdown
由于我在正确的会话中运行该命令,因此手动执行该命令时可以正常工作,但是当 Jenkins 运行该命令时,OneDrive 无法正确响应,因为它处于不同的会话中。
出现此问题的原因是 Jenkins 作为系统进程 (0) 运行,而 OneDrive 需要交互式用户会话 (1) 才能正常运行。为了解决这个问题,我创建了两个计划任务,以在正确的用户上下文中执行批处理文件。
以下是我解决问题的方法:
"C:\Program Files\Microsoft OneDrive\OneDrive.exe" /shutdown
和"C:\Program Files\Microsoft OneDrive\OneDrive.exe" /background
。/shutdown
命令创建了一个任务:schtasks /create /tn "OneDriveShutdownTask" /tr "C:\Users\john\Desktop\onedrive-shutdown.bat" /sc onstart /ru john /rl HIGHEST
/background
命令创建了一个任务:(schtasks /create /tn "OneDriveBackgroundTask" /tr "C:\Users\john\Desktop\onedrive-background.bat" /sc onstart /ru john /rl LIMITED
请注意LIMITED
,因为 OneDrive 无法在HIGHEST
模式下运行)。schtasks /run /tn "OnedriveShutdownTask"
或schtasks /run /tn "OnedriveBackgroundTask"
使用 Windows CMD 或使用 Jenkins。