#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:
В столбце 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. Нет, не внутри, непосредственно перед ним