Sam*_*ain 2 powershell powershell-4.0
要求是一一提取服务器名称,查看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")
}
Run Code Online (Sandbox Code Playgroud)
您的代码存在多个问题,我已经逐一解决了这些问题,因此您可以了解是什么导致它无法正常工作。
for 的语法foreach错误,在这种情况下您需要使用{}not ()。普通括号只像这样使用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"
}
}
}
Run Code Online (Sandbox Code Playgroud)
注意:我运行的是非特权帐户,因此必须提供凭据。如果您运行脚本的帐户对所有远程计算机具有适当的权限,您可以删除三个凭据引用。
| 归档时间: |
|
| 查看次数: |
7635 次 |
| 最近记录: |