Powershell 调用命令:为什么这不参与 foreach 循环?

问题描述 投票:0回答:1

好的,我正在利用我之前的问题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 

}
powershell parameters invoke-command
1个回答
0
投票

我怀疑你的参数

Invoke-Request
被泼溅。基本上,您需要更明确地定义变量类型以避免这些类型的问题。在远程系统上运行
Invoke-Command
时,单个字符串变量数组将被解释为传递给脚本块的多个位置变量。由于您在脚本块中只定义了单个命名参数
param($apppools)
,因此您只能看到原始数组中的第一个值。

我对下面的代码做了一些更改,我认为应该可以解决您的问题:

  1. 强制
    $apppools
    [string[]]
    类型(而不是 Object[])。
  2. 指定传递给
    -ArgumentList
    的值的类型 - 使用
    ([Object[]] @(,$apppools))
    而不是
    @($apppools)
    确保您传递
    [Object[]]
    ,即具有 1 个元素的对象数组。该元素是应用程序池名称字符串数组(类型为 [string[]])。
  3. 我已将脚本块内
    $apppools
    的类型设置为
    [String[]]
  4. 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,但其余的都是避免类型转换出现奇怪问题的好习惯:)

© www.soinside.com 2019 - 2024. All rights reserved.