运行远程批处理文件时,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 脚本不应等待进程完成