运行远程批处理文件时,Powershell 进程“挂起”

Posted

技术标签:

【中文标题】运行远程批处理文件时,Powershell 进程“挂起”【英文标题】:Powershell process 'hanging' when running remote batch file 【发布时间】:2013-12-03 12:23:56 【问题描述】:

我正在尝试通过如下驱动器映射在远程服务器上运行批处理文件,但进程挂起...

Enable-WSManCredSSP -Role Client -DelegateComputer someserver -Force

$credential = Get-Credential -Credential domain\user (then I supply the password in the popup)

$RemoteSession = New-PSSession -ComputerName someserver -Credential $credential -Authentication Credssp

Invoke-Command -Session $RemoteSession -ScriptBlock  Enable-WSManCredSSP -Role Server -Force 

Invoke-Command -Session $RemoteSession -ScriptBlock  New-PSDrive -Name I -PSProvider FileSystem -Root \\server\share$ 

到目前为止,一切似乎都很好,我可以“dir”我驾驶的车并查看预期的内容。

当我执行以下操作时,进程挂起 -

Invoke-Command -Session $RemoteSession -ScriptBlock  Start-Process I:\temp.bat 

temp.bat 文件执行以下命令,我已手动验证它是否有效

echo Scott was here > C:\temp.txt

但是,该命令运行超过 5 分钟而没有任何响应。

有人可以帮忙吗?我做错了什么?

【问题讨论】:

由于 Start-Process 不等待进程完成,我不明白为什么会这样。您是否尝试过用 powershell 命令替换批处理文件? 嗨,Lars,我没有,没有。我需要运行的实际文件是第三方批处理文件,所以我不确定有什么意义。我最初认为是这个文件有问题,这就是为什么我将调用更改为重定向的 echo 语句(如上)。 Lars,你过去有没有看到任何可以解释这一点的东西?非常感谢您的帮助... 可能与您的重定向有关。您可以尝试删除批处理中的> C:\temp.txt,并将-RedirectStandardOutput C:\temp.txt 作为参数附加到Start-Process 吗? 嗨,安东尼,我下周试试。唯一的问题是没有重定向,我不知道它是否有效!还有其他证明方法吗?谢谢 【参考方案1】:

虽然这不是您问题的直接解决方案,但我在数周的敲击键盘上的建议是采取不同的路径。

$taskName = whocares
$command = I:\Temp.bat
$serverName = theServer
$userName = domain\user
$pass = pl4inT3xtPassword
$date = (Get-Date).addMinutes(1)
$formats = $date.getDateTimeFormats()
$startTime = $formats[113]
schtasks.exe /create /sc ONCE /tn $taskName /tr $command /s $serverName /u $userName /p $pass /ru $userName /rp $pass /st $startTime

这将创建一个任务,在下一分钟启动该进程,然后将其从调度程序中删除。还有一个 /z 标志可以在运行后删除,但如果你喜欢我并且在 XP 上,那么你可能无法使用它。如果你发现你的任务在运行后没有被删除,你总是可以等待一分钟然后杀死它......或者你可以更喜欢它:

while(($timer -lt 60) -and (!$running)) 
    schtasks.exe /query /S $serverName /FO CSV /v /u $userName /p $pass | ConvertFrom-CSV | `
    % if($_.Status -eq "Running") 
        Write-Host "IT WORKED!"
        Write-host $_
        $running = $true
      
    
    if(!$running) 
        $timer++
    
    sleep 1

schtasks.exe /delete /s $serverName /u $userName /p $pass /tn $taskName /f

这个位只是每秒查询一次任务以检查它是否正在运行......一旦它会删除旧的计划任务并且您的进程将继续运行(直到它完成)。

任务计划程序是我发现使用 PowerShell 远程启动进程的唯一干净方法。它不是您的 PSremote.exe 的子进程,而是在系统下。此外,与远程会话不同,如果您退出 powershell 会话,该进程将在远程计算机上持续存在。

我知道它不仅仅是你的一个班轮,但我希望它是有用的,如果你将它参数化,甚至在上面构建一个 windows 窗体应用程序,它将为你节省大量时间和头痛。

更多关于 schtasks Here

【讨论】:

【参考方案2】:

感谢您的建议。

由于其他问题(与我们最终尝试运行的流程有关),我们暂时搁置了这个问题,但没有找到解决方案

感谢您的帮助和建议。希望能在几周内恢复 斯科特

【讨论】:

【参考方案3】:

尝试将 -AsJob 放在 Invoke-Command 行的末尾?

【讨论】:

【参考方案4】:

仅供参考,如果 Invoke-Command 总是挂起,则可能是服务或防火墙:

    尝试一个简单的系统命令: Invoke-Command -ComputerName XXXXX -ScriptBlock Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion

    启动 Windows 远程管理服务(在该系统上)

    检查监听端口:

     netstat -aon | findstr "5985"
          TCP    0.0.0.0:5985           0.0.0.0:0              LISTENING       4
          TCP    [::]:5985              [::]:0                 LISTENING       4
    

【讨论】:

以上是关于运行远程批处理文件时,Powershell 进程“挂起”的主要内容,如果未能解决你的问题,请参考以下文章

使用 PowerShell 2.0 在远程计算机上运行批处理文件

运行PowerShell进程时如何阻止Windows 10机器休眠/休眠?

在远程机器上启动应用程序并保持运行,powershell 脚本不应等待进程完成

powershell 在PowerShell远程处理上运行iisreset

如何通过cmd杀死powershell进程?统一远程应用

Powershell 远程配置文件