Хорошо, ваш оригинальный сценарий был ужасно неэффективным и плохо спроектированным. Вот PowerShell, чтобы делать то, что вы хотите, никакие файлы temp не нужны. Обычно у меня бы не было таких комментариев, но я хочу убедиться, что все понимают, что я сделал. Выходные файлы будут находиться в рабочем каталоге, откуда вы выполняете этот метод.
Использование (в CMD/партии): -command PowerShell "& {\ FileContainsThisFunction.ps1; экстракт Хосты original.csv.}"
Использование (в) PowerShell:. \ FileContainsThisFunction.ps1; Extract-хосты original.csv
function Extract-Hosts {
param(
[Parameter(Mandatory=$true)]
[String]$InputFile
)
if(-not (Test-Path $InputFile)) { throw ("Input file doesn't exist: {0}" -f $InputFile) }
# Extract filename without path or extension
$BaseName = Get-Item $InputFile | Select -ExpandProperty Basename
# Create a custom object that conains the outfilename and the content for lwks and wks
$OutLwks = @{ File = ('{0}-lwks.csv' -f $Basename); Content = @() }
$OutWks = @{ File = ('{0}-wks.csv' -f $Basename); Content = @() }
# First, delete the output files if they exist
$OutLwks, $OutWks | ForEach { if (Test-Path -Path:($_.File)) { Remove-Item $_.File } }
# Import the original csv into the pipeline
Import-Csv $InputFile |
# We only care about the IP and Hostname columns
Select -Property IP, Hostname |
# Where the hostname is not empty, nor contains n/a or n/s
Where { $_.Hostname -iNotMatch '(^$|n/a|n/s)' } |
ForEach-Object {
# If it contains lwks, add it to that list
if ($_ -imatch 'lwks') {
($OutLwks.Content += $_)
}
# if it contains wks but NOT lwks, add to the other list
elseif ($_ -imatch 'wks') {
($OutWks.Content += $_)
}
} | Out-Null # Sends objects to null after pipeline processing.
# Splat each one into the appropriate CSV file
$OutLwks, $OutWks | ForEach-Object {
$_.Content | Export-Csv -Path $_.File -NoTypeInformation }
}
Edit: Исправлена опечатка во втором контентной Кроме того, он должен был прочитать OutWks.Content + = $ _ Edit +: Заменено Где магия с Foreach, чтобы сделать его проще для понимания; Добавлен Out-Null для подавления вывода после конвейера.
Надеюсь, этот сценарий поможет вам на шаг приблизиться к написанию богатых конвейерных процессоров в powershell.
Как, собственно, сценарий не работает? – vonPryz
Моя конечная цель: # 1, удалить столбцы с заголовком «Ping» и «Ports» + удалить строки, содержащие строку «[n/a]» и «[n/s]» «Hostname» в temp.csv файл >>> сохранить его в dad.csv # 2, в новом файле dad.csv удалить все строки, не содержащие «lwks» >>> save to lwks.csv, сделать то же самое с любой строкой, не содержащей «wks «>>> Сохраните его на wks.csv # 3, из-за ограничений в скриптах, я не могу их поместить в PowerShell, спасибо за вашу помощь. – user1928098