我正在处理一个大型脚本,我在其中运行Foreach
循环,在该循环中定义变量,然后检查$Server
变量是否可ping,以及是否可远程访问。
为此,我使用来自PowerShell帮助的以下函数:
# Function to check if $Server is online
Function CanPing ($Server) {
$error.clear()
$tmp = Test-Connection $Server -ErrorAction SilentlyContinue
if ($?) {
Write-Host "Ping succeeded: $Server"; Return $true
}
else {
Write-Host "Ping failed: $Server."; Return $false
}
}
# Function to check if $Server is remotely accessible
Function CanRemote ($Server) {
$s = New-PSSession $Server -Authentication Credssp -Credential $Credentials -Name "Test" -ErrorAction SilentlyContinue
if ($s -is [System.Management.Automation.Runspaces.PSSession]) {
Enter-PSSession -Session $s
Exit-PSSession
Write-Host "Remote test succeeded: $Server."; Return $true
}
else {
Write-Host "Remote test failed: $Server."; Return $false
}
}
# Execute functions to check $Server
if ($Server -ne "UNC") {
if (CanPing $Server) {
if (-Not (CanRemote $Server)) {
Write-Host "Exit loop REMOTE" -ForegroundColor Yellow
continue
}
}
else {
Write-Host "Exit loop PING" -ForegroundColor Yellow
continue # 'continue' to the next object and don't execute the rest of the code, 'break' exits the foreach loop completely
}
}
每次运行此代码时,都会在远程服务器上创建一个名为wsmprovhost.exe
的进程。如果我在网络上找到的信息正确,则此过程代表PowerShell会话。但是,在执行Get-PSSession $Server
时,PowerShell ISE中没有显示打开的会话,即使这些进程在远程服务器上可见,并且只能使用任务管理器终止。
当我经常运行此代码时,会达到开放会话的限制,因为每次将新进程wsmprovhost.exe
添加到$Server
并且命令错误输出时。我已尝试通过在代码中添加Exit-PSSession
来解决此问题,但它并未关闭会话。
非常欢迎任何帮助或想法。
答案 0 :(得分:4)
问题是Enter-PSSession。 Enter-PSSession只能以交互方式使用,您不能在脚本中使用它。我建议更像这样的事情:
# Function to check if $Server is remotely accessible
Function CanRemote ($Server) {
Try {
$s = New-PSSession $Server -Authentication Credssp -Credential $Credentials -Name "Test" -ErrorAction Stop
Write-Host "Remote test succeeded: $Server."
$true
Remove-PSSession $s
}
Catch {
"Remote test failed: $Server."
$false
}
}
答案 1 :(得分:4)
如果我理解正确,您的远程ps-session
不会被关闭。
根据我的理解,Get-PSSession
会在本地会议之前显示会话
还活着(我的意思是你创建了远程ps-session
的会话)但是一旦你的本地会话
结尾Get-PSSession
不会显示它们,因为它们不再存在于您的计算机上
而是在远程系统(或)上,它们不再是本地会话范围。
您可以使用命令
获取会话Get-PSSession -ComputerName server_name
如果你想删除它们,你可以这样做
Get-PSSession -ComputerName server_name | Remove-PSSession
答案 2 :(得分:0)
即使执行以下命令也是如此,如果您无法创建会话
Get-PSSession -ComputerName server_name | Remove-PSSession
请在目标计算机中重新启动服务Windows远程管理(WS-Management)。