为什么不能正确计算这个数字PowerShell的

时间:2018-06-11 20:56:27

标签: powershell loops foreach powershell-ise

现在,我有一个包含3,800多条记录的CSV文件。此文件包含服务器名称列表,后跟缩写,说明服务器是Windows服务器,Linux服务器等。该文件还包含注释或文档,其中每行以"#"开头,说它是评论。我到目前为止的内容如下:

$file = Get-Content .\allsystems.csv
$arraysplit = @()
$arrayfinal = @()
[int]$windows = 0

foreach ($thing in $file){
    if ($thing.StartsWith("#")) {
        continue
        }
    else {
        $arraysplit = $thing.Split(":")
        $arrayfinal = @($arraysplit[0], $arraysplit[1])
    }
}

foreach ($item in $arrayfinal){
    if ($item[1] -contains 'NT'){
        $windows++
    }
    else {
        continue
    }
}
$windows

此脚本的目标是计算Windows服务器的总数。我的问题是第一个" foreach"块工作正常,但第二个导致" $ Windows" 0岁。老实说,我不确定为什么这不起作用。两个示例行数据如下:

example:LNX

example2:NT

4 个答案:

答案 0 :(得分:1)

如果目标是计算Windows服务器,为什么需要数组呢?

你不能说像

这样的话
foreach ($thing in $file)
{
    if ($thing -notmatch "^#" -and $thing -match "NT") { $windows++ }
}

答案 1 :(得分:0)

$arrayfinal = @($arraysplit[0], $arraysplit[1])

这将替换每次运行的数组。

将其更改为+=会产生另一个问题。它只是附加了每个单独的元素。我使用这篇文章的信息来修复它,有点强迫二维数组:How to create array of arrays in powershell?

$file = Get-Content .\allsystems.csv
$arraysplit = @()
$arrayfinal = @()
[int]$windows = 0

foreach ($thing in $file){
    if ($thing.StartsWith("#")) {
        continue
        }
    else {
        $arraysplit = $thing.Split(":")
        $arrayfinal += ,$arraysplit
    }
}

foreach ($item in $arrayfinal){
    if ($item[1] -contains 'NT'){
        $windows++
    }
    else {
        continue
    }
}
$windows
  

1

我还更改了文件并添加了更多 NT 和其他随机垃圾的实例。似乎它工作正常。

答案 2 :(得分:0)

我会避免使用另一个ForEach循环来计算出现次数。你的$ arrayfinal每次都会重写,所以我使用了ArrayList。

$file = Get-Content "E:\Code\PS\myPS\2018\Jun\12\allSystems.csv"
$arrayFinal = New-Object System.Collections.ArrayList($null)

foreach ($thing in $file){
    if ($thing.StartsWith("#")) {
        continue
        }
    else {
        $arraysplit = $thing -split ":"
        if($arraysplit[1] -match "NT" -or $arraysplit[1] -match "Windows")
        {
            $arrayfinal.Add($arraysplit[1]) | Out-Null
        }
    }
}

Write-Host "Entries with 'NT' or 'Windows' $($arrayFinal.Count)"

我不确定你是否要保留'Example','example2'...所以我跳过将它们添加到arrayfinal,假设目标是计算“NT”或“Windows”出现

答案 3 :(得分:0)

  

此脚本的目标是计算Windows服务器的总数。

我建议使用简单的方法:使用为此构建的cmdlet。

$csv = Get-Content -Path .\file.csv |
    Where-Object { -not $_.StartsWith('#') } |
    ConvertFrom-Csv

@($csv.servertype).Where({ $_.Equals('NT') }).Count

# Compatibility mode:
# ($csv.servertype | Where-Object { $_.Equals('NT') }).Count

servertype'NT'替换为调用的标头/值。