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) 命令提供自动格式化。
所以输出工作正常,但我遇到了一个问题,它只输出它的最后一行 运行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) 命令提供自动格式化。