现在,我有一个包含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
答案 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'
替换为调用的标头/值。