我在测试机环境中使用 PSExec 以管理员身份启动要测试的应用程序的安装包,然后在需要时以管理员身份运行测试。PSExec 仅用于此处的“run as”部分,不用于远程执行。调用如下所示:
c:\psexec -u Administrator -p adminpassword -w C:\SystemTests C:\SystemTests\run_system_tests.cmd ...
问题是我们的 CI 服务器 Jenkins 只在控制台输出中捕获了 PSExec 的标志,而不是实际的测试打印输出:
PsExec v1.98 - Execute processes remotely
Copyright (C) 2001-2010 Mark Russinovich
Sysinternals - www.sysinternals.com
C:\SystemTests\run_system_tests.cmd exited with error code 0.
Run Code Online (Sandbox Code Playgroud)
启动的脚本在本地打开自己的控制台窗口并打印其中的所有内容。但是它没有登录 Jenkins,所以我们不知道脚本做了什么以及为什么事情可能会失败。
是否有一个选项可以让 PSExec 将启动程序的输出打印到标准输出而不是徽标,而不是打开控制台窗口?
在研究这个确切的问题时,我遇到了这个technet 论坛帖子。
线程中的相关帖子:
由用户bnyffele在 sysinternals 上发帖
我实际上发现各个系统之间没有区别,但取决于你如何寻址远程机器:
Run Code Online (Sandbox Code Playgroud)psexec \\hostA cmd -> seperate window opens (if command is executed on \\hostA) psexec \\127.0.0.1 cmd -> cmd prompt in same window psexec \\[IP address] cmd -> cmd prompt in same window psexec \\localhost cmd -> results in error message about localhost being a duplicate name. psexec \\hostA.domain.com -> cmd prompt in same window因此,当我为本地计算机执行 psexec 并且使用短主机名时,我似乎只得到一个单独的窗口。
看起来,如果您指定本地主机 IP 地址作为运行命令的计算机,您将获得输出。我自己测试了这一点,虽然它没有实时打印标准输出,但在脚本完成时确实将其全部打印到同一个终端。
如果您试图弄清楚如何使用系统名称而不是 IP 地址来执行此操作,您仍然可以通过在主机名末尾添加一个点来使其工作,该主机名是由另一个用户稍后在同一线程中发布的多个帖子确定的。
由用户bluechipps在 sysinternals 上发帖
事实上,我刚刚发现了一种几乎无痛的解决方法。您所要做的就是添加一个“.” 在短名称之后,它仍然具有相同的功能,但随后会正确输出到同一个 cmd 窗口!注意差异。
PS C:> psexec \hal ipconfig
PsExec v1.95 - 远程执行进程
版权所有 (C) 2001-2009 Mark Russinovich
Sysinternals - www.sysinternals.comipconfig 退出,错误代码为 0。
PS C:>
PS C:> psexec \hal. ip配置
PsExec v1.95 - 远程执行进程
版权所有 (C) 2001-2009 Mark Russinovich
Sysinternals - www.sysinternals.comWindows IP配置
以太网适配器本地连接 2:
连接特定的 DNS 后缀。:#####
链路本地 IPv6 地址。。。。。:#####
IPv4 地址。。。。。。。。。。。:#####
子网掩码 。。。。。。。。。。。:#####
默认网关 。。。。。。。。。:#####ipconfig 在 hal 上退出。错误代码为 0。
PS C:>
我发现您可以通过这种方式将 PsExec 输出从远程输出中分离出来......
psexec \\wxesbbtlkS02 cmd /c C:\test.bat >tmpfile.txt 2>other.txt
Run Code Online (Sandbox Code Playgroud)
这样你就可以在文件中获得 PsExec 输出other.txt,并在tmpfile.txt