Power shell For Loop 不循环

Power shell For Loop not Looping

所以输出工作正常,但我遇到了一个问题,它只输出它的最后一行 运行s。无论如何要检查循环以在将来进行测试?

但我有一个 IP 地址列表,我正在尝试检查 windows 中的防火墙是启用还是禁用。 他们在一个大型(300 多个工作组)中。任何帮助让它正确循环的帮助将不胜感激。安全和其他问题不是问题,因为我还有其他 运行 没问题的脚本。而且我没有收到任何错误。只是单一的输出。

我已经尝试过移动阵列,但没有用。我认为它可能是 PSCustomObject 部分,因为我才刚刚开始学习这些。或者可能是我的输入和输出格式不同导致出现问题??

clear
$ComputerList = get-content C:\Users\Administrator\Desktop\DavidsScripts\TurnOffFirewall\input.txt
$Status = @(
foreach ($Computer in $ComputerList) {

netsh -r $Computer advfirewall show currentprofile state})[3] -replace 'State' -replace '\s' 


$Object = [PSCustomObject]@{
    Computer = $Computer
    Firewall = $Status
}

Write-Output $Object
$Object | Export-Csv -Path "C:\FirewallStatus.csv" -Append -NoTypeInformation

您之前的代码没有跳出循环,只是将循环中的最后一台计算机添加到对象。

我发现的最好方法是创建一个临时对象并将其添加到数组列表中,然后将其导出。好多了。

$ComputerList = get-content C:\Users\Administrator\Desktop\DavidsScripts\TurnOffFirewall\input.txt
$collectionVariable = New-Object System.Collections.ArrayList

ForEach ($Computer in $ComputerList) {
    # Create temp object
    $temp = New-Object System.Object
    # Add members to temp object
    $temp | Add-Member -MemberType NoteProperty -Name "Computer" -Value $Computer
    $temp | Add-Member -MemberType NoteProperty -Name "Firewall" -Value $((netsh -r $Computer advfirewall show currentprofile state)[3] -replace 'State' -replace '\s')
    # Add the temp object to ArrayList
    $collectionVariable.Add($temp)
}

Write-Output $collectionVariable
$collectionVariable | Export-Csv -Path "C:\FirewallStatus.csv" -Append -NoTypeInformation

这是您的代码的简化功能版本,使用单个管道:

Get-Content C:\Users\Administrator\Desktop\DavidsScripts\TurnOffFirewall\input.txt |
  ForEach-Object {
    [pscustomobject] @{
      Computer = $_
      Firewall = (-split ((netsh -r $_ advfirewall show currentprofile state) -match '^State'))[-1]    
    }
  } | Export-Csv -Path C:\FirewallStatus.csv -NoTypeInformation

注:

  • 不需要中间变量;从输入文件中读取的每个计算机名称都被一一处理,每个基于它构造的自定义对象被发送到输出 CSV 文件。

  • netsh 的输出中提取防火墙状态的命令变得更加健壮,以便根据行 content[=50] 提取状态信息=](正则表达式 ^State,即以 State 开头的行)而不是行 index ([3]); -split 的一元形式将感兴趣的行按空格拆分为标记,索引 [-1] 提取最后一个标记,即状态值。


至于你试过的

  • 你的foreach循环在$Object构建之前结束,所以你最终只构建了1 使用 Export-Csv.

  • 发送到输出文件的对象
  • 如果您正确地格式化了您的代码,那么这个事实会更加明显;尝试使用 Visual Studio Code with the PowerShell extension,它通过 >Format Document (Shift+Alt+F) 命令提供自动格式化。