有人可以帮我这个。!?
以下是我正在使用的ps脚本,用于从远程计算机获取应用程序池详细信息。
在同一台机器上尝试或逐行执行脚本时,它可以正常工作。
当它作为脚本文件执行时不起作用。然后,它显示了脚本在其输出中运行的服务器的应用程序池详细信息。
echo正确显示主机名及其循环。但我不确定脚本为什么不循环。
请看一下,让我知道如何进一步尝试......
$nodes = Get-Content "C:\PowerShell\Servers.txt"
foreach($node in $nodes) {
echo $node
Enter-PSSession $node
Import-Module WebAdministration
$webapps = Get-WebApplication
$list = @()
foreach ($webapp in get-childitem IIS:\AppPools\)
{
$name = "IIS:\AppPools\" + $webapp.name
$item = @{}
$item.WebAppName = $webapp.name
$item.Version = (Get-ItemProperty $name managedRuntimeVersion).Value
$item.UserIdentityType = $webapp.processModel.identityType
$item.Username = $webapp.processModel.userName
$obj = New-Object PSObject -Property $item
$list += $obj
}
$list | Format-Table -a -Property "WebAppName", "Version", "State", "UserIdentityType", "Username", "Password"
Exit-PSSession
}
Read-Host“按Enter键”
答案 0 :(得分:1)
Enter-PSSession
仅用于创建交互式会话。它没有按照您期望的方式在脚本中工作。脚本仅在您启动它的会话中运行,在本例中是在本地计算机上。
远程运行命令的方法是使用Invoke-Command
。您可以修改脚本以将Enter-PSSession
更改为New-PSSession
,并使用Invoke-Command
foreach ($node in $nodes) {
$session = New-PSSession $node
Invoke-Command -Session $session { $webapps = Get-Webapplication }
Invoke-Command -Session $session { $list = @() }
etc...
}
但那效率低下。 Invoke-Command
采用一个脚本块而不仅仅是一个命令,因此将所有命令放入一个块并且每台计算机只调用一次Invoke-Command
是有意义的。一旦你做到了,就没有任何理由保持$session
变量。相反,使用-ComputerName
参数,Invoke-Command
将自动创建临时PSSession。
foreach ($node in $nodes) {
Invoke-Command -Computer $node {
Import-Module WebAdministration
$webapps = Get-WebApplication
$list = @()
etc...
}
}
这种方法效果很好,用途非常广泛,但如果你愿意,你甚至不需要手动迭代comptuers。而是将完整的$ nodes数组传递给-ComputerName
参数。
$nodes = Get-Content "C:\PowerShell\Servers.txt"
Invoke-Command -Computer $nodes {
Import-Module WebAdministration
$webapps = Get-WebApplication
$list = @()
etc...
}
Invoke-Command
将在列表中的所有计算机上运行scriptblock。