【问题标题】:Batch script stops executing after winrs command批处理脚本在 winrs 命令后停止执行
【发布时间】:2017-09-26 10:45:18
【问题描述】:

我有一个脚本,其中包含对 winrs 的调用,以便在用户指定的目标计算机上远程启动 .exe 的执行。

我想要以下功能:

  • 启动脚本
  • 提示用户输入目标 PC 的名称
  • winrs 进入执行 .exe 的目标 PC,并告诉运行脚本的用户正在执行此操作。
  • 停止执行 winrs 并告诉运行脚本的用户它已经完成。
  • 退出。
  • 我想要运行脚本的机器上的所有输出,并且不希望在目标机器上显示任何活动。

我的代码如下:

@echo off

echo -------------------------------------------------------
echo PLEASE ENTER PC NAME OF DISCONNECTED MACHINE
echo -------------------------------------------------------
SET /p pcToReconnect= 
echo Attempting to contact Agent.

call winrs -r:%pcToReconnect% "C:\Path\To The\exe that I want\toExecute.exe" >> logfile.txt 2>>&1

echo Agent reconnected. Please allow ~5mins for your management console to update.

代码一直执行,直到 winrs 调用,它实际上在目标机器上执行 .exe,但似乎远程 shell 在此之后只是保持打开状态。

如果此时我按下 ctrl+c,“终止 shell?(y/n)”将被放置在我的日志文件中(但在 cmd 提示符中没有输出),然后我可以按下“y”并输入,远程shell退出并且“终止批处理作业(Y / N)”出现在cmd提示符中,但是最后一个echo语句永远不会执行。

如何让远程 shell 在 .exe 运行后自动关闭,并在执行者的提示下回显脚本已完成的某种确认?

感谢所有帮助!

【问题讨论】:

    标签: windows batch-file cmd winrm winrs


    【解决方案1】:

    您正在使用call,它执行一个新的cmd.exe 窗口并在该新窗口中运行winrs 并退出。 删除它,它会工作。我在最后添加了暂停,以防您通过双击运行批处理。

    @echo 关闭

    echo -------------------------------------------------------
    echo PLEASE ENTER PC NAME OF DISCONNECTED MACHINE
    echo -------------------------------------------------------
    SET /p pcToReconnect= 
    echo Attempting to contact Agent.
    
    winrs -r:%pcToReconnect% "C:\Path\To The\exe that I want\toExecute.exe" >> logfile.txt 2>>&1
    
    echo Agent reconnected. Please allow ~5mins for your management console to update.
    pause
    

    编辑

    经过一些分析,批处理似乎正在等待程序完成,因此可以使用 start 调用它,它应该调用它并返回原始提示。

    start winrs -r:%pcToReconnect% "C:\Path\To The\exe that I want\toExecute.exe" >> logfile.txt 2>>&1
    

    【讨论】:

    • 这具有完全相同的行为。我认为 call 只是确保脚本在调用指定命令后返回到自身?暂停是通过双击运行的有用提示,但谢谢!
    • @CiaranMcKenzie 你在执行什么命令?它应该在命令运行后退出。也许测试命令本身,所以用类似 ping 命令的东西替换命令。看看它是否返回?
    • 我想远程运行一个 .exe 文件,所以只需将其路径/名称输入远程 cmd。我这里有两台电脑,所以当我运行您的代码或我的代码时,.exe 在目标机器上远程运行,因为我可以看到相关服务已在该机器上启动,并且日志文件没有错误。因此,实现了在目标后台运行该 .exe 的实际最终目标。就好像脚本停止了,.exe 已经在远程机器上执行,错误/成功被记录到日志文件中,然后我在提示符下坐在那里,最后一个回显永远不会发生。
    • 您是否尝试过不同的命令作为测试?比如只是做ping localhost 并管道到日志,看看它是否返回?
    • 这成功了!它执行命令并返回到脚本,最后通过回显最后一条语句并将 ping 信息输出到日志文件中,所以我猜问题是这个 .exe 根本没有返回,这实际上是有道理的,因为它是一个程序被启动,将在后台持续运行。所以我想我想启动 .exe 但不是等着看它启动后会做什么?你知道有什么方法可以做到这一点吗?感谢您帮助我们更进一步!
    猜你喜欢
    • 2016-10-06
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 2015-05-08
    • 2012-09-19
    • 2022-10-23
    相关资源
    最近更新 更多