要求是逐个提取服务器名称并检查AppPool状态,如果发现该状态已停止,请使其运行。下面的代码没有帮助。
$ErrorActionPreference = "Continue"
$status = gc -path "D:\Servers\server.txt"|ForEach-Object (invoke-command -ComputerName $_ -ScriptBlock {Import-Module Webadministration Get-WebAppPoolState -name (gc "D:\AppPool.txt")})
if ($status.value -eq "Started")
{
Write-Host ("ApppPool already running")
}
else
{
Invoke-Command -ScriptBlock {Start-WebAppPool}
Write-host ("AppPool has started successfully")
}
答案 0 :(得分:2)
您的代码存在多个问题,我已经单独完成了这些问题,因此您可以看到阻止其正常工作的原因。
foreach
的语法错误,在这种情况下您需要使用{}
而不是()
。普通括号仅用于ForEach ($number in $numArray ) {CODE}
这个你不是。
您正在$status
循环之外检查foreach
- 所以它只评估$status
一次(使用最终的计算机AppPool状态)而不是每台计算机。
您的第二个Invoke-Command
没有指定ComputerName
参数,因此仅在本地运行该命令而不是远程计算机,这意味着AppPool永远不会启动。
当您使用gc "D:\AppPool.txt"
指定AppPool名称时,此文件必须出现在每个远程计算机上才能生效。我已将此更改为作为参数传递给命令,因此该文件只需要在运行该脚本的计算机上。
$Credentials = Get-Credential
$AppPools = Get-Content "D:\AppPool.txt"
$Servers = Get-Content -Path "D:\Servers\server.txt"
ForEach ($Server in $Servers) {
ForEach ($AppPool in $AppPools) {
$AppPoolState = Invoke-Command -ComputerName $Server -ScriptBlock {Import-Module WebAdministration; Get-WebAppPoolState -Name $args[0] } -ArgumentList $AppPool -Credential $Credentials
if ($AppPoolState.Value -eq "Started")
{
Write-Host "$AppPool AppPool already running on $Server"
}
else
{
Invoke-Command -ComputerName $Server -ScriptBlock {Start-WebAppPool -Name $args[0] } -ArgumentList $AppPool -Credential $Credentials
Write-Host "$AppPool AppPool started on $Server"
}
}
}
注意:我运行的是非特权帐户,因此必须提供凭据。如果您运行脚本的帐户具有对所有远程计算机的适当权限,则可以删除三个凭据引用。