好的,我正在利用我之前的问题Powershell脚本从服务器获取IIS应用程序池回收时间并想知道我做错了什么
我有 IIS 应用程序池列表 (apppools.txt) 和服务器列表 (servers.txt)
当我按如下方式运行它时,我得到的唯一输出是每个节点列表中的第一个应用程序池。有人可以帮我找到我的(可能非常简单)错误吗?
输出示例:
“服务器名称”,“应用程序池”,“回收时间”
“服务器S26”,“池1”,“04:10:00”
“服务器S27”,“池1”,“04:10:00”
当我期望获得大约 10 个应用程序池及其各自的回收时间时。我确信我的 ICM 参数或参数有些愚蠢。
$apppools =gc c:\temp\apppools.txt
$servers = Get-Content C:\temp\servers.txt
foreach ($server in $servers){
Invoke-Command -ComputerName $server -argumentlist @($apppools) -scriptblock {
param($apppools)
$servername = hostname
$infoObject = New-Object PSObject
import-module webadministration
foreach ($a in $apppools){
$recycle = (Get-ItemProperty -Path "IIS:\AppPools\$a" -Name recycling.periodicRestart.schedule.collection).value.tostring()}
Add-Member -inputObject $infoObject -memberType NoteProperty -name "ServerName" -value $Servername
Add-Member -inputObject $infoObject -memberType NoteProperty -name "AppPool" -value $a
Add-Member -inputObject $infoObject -memberType NoteProperty -name "RecycleTime" -value $recycle
$infoObject
} | Select-Object * -ExcludeProperty PSComputerName, RunspaceId, PSShowComputerName | Export-Csv -append -path "C:\temp\recycling.csv" -NoTypeInformation
}
我怀疑你的参数
Invoke-Request
是被泼溅。基本上,您需要更明确地定义变量类型以避免这些类型的问题。在远程系统上运行 Invoke-Command
时,单个字符串变量数组将被解释为传递给脚本块的多个位置变量。由于您在脚本块中只定义了单个命名参数param($apppools)
,因此您只能看到原始数组中的第一个值。
我对下面的代码做了一些更改,我认为应该可以解决您的问题:
$apppools
为 [string[]]
类型(而不是 Object[])。-ArgumentList
的值的类型 - 使用 ([Object[]] @(,$apppools))
而不是 @($apppools)
确保您传递 [Object[]]
,即具有 1 个元素的对象数组。该元素是应用程序池名称字符串数组(类型为 [string[]])。$apppools
的类型设置为[String[]]
GC
是 Get-Content
,因此更新只是为了保持一致性。 $servers
的类型并不重要,因为它不会传递到您的脚本块,但会再次更新以保持一致性。[string[]] $apppools = Get-Content c:\temp\apppools.txt
[string[]] $servers = Get-Content C:\temp\servers.txt
foreach ($server in $servers){
Invoke-Command -ComputerName $server -ArgumentList ([Object[]] @(,$apppools)) -ScriptBlock {
param([String[]] $apppools)
(我不确定是否实际上只需要#2,但其余的都是避免类型转换出现奇怪问题的好习惯:)