Обновить скрипт с помощью команд регулярных выражений

#regex #powershell

#регулярное выражение #powershell

Вопрос:

Создал следующий PS-скрипт для извлечения данных из некоторых отчетов и выгрузки извлеченных данных в файл .csv:

 $csvContents = @()

$hashTable = @{}
$count = 0 

Get-ChildItem $PSRootNU_*.txt | %{       
      
    Get-Content $_ |
    ?{$_ -imatch 'Percent of memory in use' -or $_ -imatch 'Remaining Space' -or $_ -imatch 'Percent of CPU in use' -or $_ -imatch 'Node Number' `
    -or $_ -imatch 'Generated' -or $_ -imatch 'Client Name' -or $_ -imatch 'Windows Ver:' -or $_ -imatch 'ActiveName' -or $_ -imatch 'node d '} | %{
        
       
        If($_ -imatch 'ActiveName'){                 
            $name = (([regex]::Matches($_,'w ') | select value).value )
            $store = ([regex]::Matches($name[2],'bd ') | select value).value  
        }


        If($_ -imatch 'Node Number'){                 
           $NodeNumber = ([regex]::Matches($_,'bd ') | select value).value   
        } 
       
        If($_ -imatch 'memory in use'){       
           $memory = ([regex]::Matches($_,'bd ') | select value).value      
        }

        If($_ -imatch 'Remaining Space'){       
           $space = ([regex]::Matches($_,'bd ') | select value).value       
        }

        If($_ -imatch 'CPU in use'){       
           $cpu = ([regex]::Matches($_,'bd ') | select value).value      
        }
        
        
        If($_ -imatch 'Generated'){      
           $Date = ([regex]::Matches($_,'(d )-(d )-(d ) (d ):(d ):(?:d )') | select value).value #[0..2] -join '-'                      
        }
           
        If($_ -imatch 'Client Name'){               
           $ClientName = (([regex]::Matches($_,'s (s w )') | select value).value -join ',').trim()
        }

        If($_ -imatch 'Windows Ver:'){       
           $WinVer = ([regex]::Matches($_,'Windows Ver: (d ).(d )') | select value).value -join ','                                                      
        }               
           
       
        $obj = [PSCustomObject]@{
            STORE          = $store
            DATE           = $Date
            NODENUMBER     = $NodeNumber
            POSTYPE        = $ClientName
            MEMORYUSAGE    = $memory
            FREEHDSPACE    = $space
            CPUUSAGE       = $cpu
            WINDOWSVERSION = $WinVer
        }
       
            
        If($_ -imatch 'Node d '){        
            $hashTable.Add($count,$obj) 
            $count             
        }

      }
}

$hashTable.values.GetEnumerator() | Sort-Object -Property DATE | ConvertTo-Csv -NoTypeInformation  | Set-Content -path "$Reports$($Store)_$(Get-Date -f yyyy-MM-dd)_$((Get-Date).tostring("hh-mm-ss")).csv" -force 
  

Пример файла .csv:

вывод файла .csv

В столбце POSTYPE PCSERVER показывает 0, и я бы хотел, чтобы он показывал 123. EPC4 показывает 0, а я бы хотел, чтобы он показывал 155. Любые предложения о том, как я могу это сделать.

Комментарии:

1. Вы хотите сказать, что регулярное выражение работает некорректно и выводит 0 вместо предполагаемых чисел? Если это так, нам нужно просмотреть образец исходных данных, чтобы сравнить их с вашим регулярным выражением.

2. Спасибо за ответ. Регулярное выражение выполняет то, для чего оно предназначено, в файле, из которого извлекаются данные, см. Пример:

3. Да, он выводит 0, который указан в файле — DEV155 GetInfo: номер узла 0;

4. DEV155 GetInfo: имя клиента EPC4; DEV155 GetInfo: номер узла 0;

Ответ №1:

Если вы хотите перезаписать исходные данные и всегда использовать указанные вами числа, вы можете просто добавить еще пару If инструкций перед созданием вашего $obj :

 If($ClientName -eq 'PCSERVER'){       
    $NodeNumber = 123                                                   
}
 
If($ClientName -eq 'EPC4'){
    $NodeNumber = 155
}
  

Комментарии:

1. Спасибо за ответ, должен ли я добавлять эти строки в PSCustomObject?

2. Нет, не внутри, непосредственно перед ним