【问题标题】:Execute Batch in Remote Powershell Session that Requires Interactive/Redirection在需要交互/重定向的远程 Powershell 会话中执行批处理
【发布时间】:2016-07-27 15:38:24
【问题描述】:

我的公司使用名为“Hyperion”的基于 Oracle 的产品。我相信甲骨文聘请了一些高中生来编写批处理文件来启动和停止服务。我遇到的问题是我想使用 Powershell Remoting 执行一个名为“Stop_Hyperion.bat”的批处理文件,该文件由 Oracle 提供,用于以受控方式停止多个进程和服务。不幸的是,这对我来说不起作用:

$Session = New-PSSession -ComputerName HyperionServer1 -Credential $PSCredential
Invoke-Command -Session $Session -ScriptBlock {C:\Scripts\Stop_Hyperion.bat}

它执行批处理文件,但批处理文件包含一个名为“超时”的命令,该命令会生成以下错误:

ERROR: Input redirection is not supported, exiting the process immediately.
    + CategoryInfo          : NotSpecified: (ERROR: Input re...ss immediately.:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError
    + PSComputerName        : HYPERIONSERVER1

如果我使用良好的旧 PSExec,除非我对桌面交互会话使用 -i 选项,否则我会收到相同的错误。有没有办法用 PSSession 完成那种交互式会话?

我会修改批处理文件或只是使用 Powershell 命令停止服务,但批处理文件包含对其他批处理文件(也使用超时)的调用,其中包含更多调用。嵌套调用如此之多,以至于要花很长时间才能弄清楚批处理文件在做什么。

【问题讨论】:

  • 也许您可以将“超时”替换为不执行任何操作的脚本或模拟可执行文件?
  • 不,这不切实际。如果我要修改批处理文件,我会继续编写 powershell 脚本来完成他们正在做的事情。不幸的是批处理脚本并不简单,有很多对其他批处理文件的嵌套调用,其中许多还包含超时命令。
  • @()|C:\Scripts\Stop_Hyperion.bat?
  • 我并不是要更改批处理文件,因为它们是给定的。我的意思是我能够替换系统上的“timeout.exe”,这样当批处理文件调用 timeout.exe 时,就会调用你的版本。

标签: powershell remoting


【解决方案1】:

使用Enter-PSSession localhost,我无法获得使用timeout 的BAT 文件。档案a.bat

timeout 5 >NUL
echo %errorlevel% > C:\Users\my_user\abc.txt

但是,通过运行 Start-Process .\a.bat -wait,我可以看到 timeout 正确等待,并返回退出代码 0。如果需要更多 .NET,您应该能够获得标准输出。

我认为这是通过使用自己的新 STDIN 生成 CMD 进程来实现的,就好像它在一个新的 conhost 窗口中一样(而不是重用无法重定向的 powershell 进程 STDIN)。

【讨论】:

    【解决方案2】:

    您可以查看批处理文件,并创建一个本地 PowerShell 实现作为替代。

    “Stop-Service”和“Start-Service”是 Windows 上可用的标准 cmdlet。

    这可能会忽略提供的批处理文件中的一些复杂性,但如果它完成了工作,那就足够了。这与从服务管理器停止和启动服务相同。

    【讨论】:

      猜你喜欢
      • 2014-02-23
      • 2018-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      • 2012-12-17
      • 2011-09-05
      相关资源
      最近更新 更多