Powershell, просматривайте CSV-файлы и ищите строку подряд, затем экспортируйте - PullRequest
0 голосов
/ 01 июня 2018

У меня есть каталог на сервере с именем 'servername'.В этом каталоге у меня есть подкаталоги, чье имя является датой.В этих каталогах дат у меня есть около 150 журналов аудита файлов .csv.У меня есть частично работающий скрипт, который запускается из каталога даты, перечисляет и просматривает .csv и ищет строку в столбце.Я пытаюсь заставить его экспортировать строку для каждого совпадения, а затем перейти к следующему файлу.

$files = Get-ChildItem '\\servername\volume\dir1\audit\serverbeingaudited\20180525'

ForEach ($file in $files) {
    $Result = If (import-csv $file.FullName | Where {$_.'path/from' -like "*01May18.xlsx*"})
    {
    $result | Export-CSV -Path c:\temp\output.csv -Append}
    }

То, что я делаю, - это поиск в столбце 'путь \ от' строки - как имя файла,Столбец содержит данные, которые всегда имеют вид \ folder \ folder \ folder \ filename.xls.Я ищу определенное имя файла и все экземпляры этого имени файла в этом столбце в этом файле.

Моя проблема заключается в экспорте этой строки - export.csv всегда пуст.Я также хотел бы запустить каталог «вверх» и пройти по каждому каталогу дат, разобрать, экспортировать, а затем перейти к следующему каталогу и файлам.

Если я разобью его на один файл и выведу егоЕсли это, кажется, дает мне результат, поэтому я думаю, что я получаю что-то не так в IF или для каждого, но, очевидно, это выше моего paygrade - не могу понять это ...

Заранее спасибо за любыепомощь, RichardX

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

Не вижу необходимости добавлять файл CSV?Как насчет:

Get-ChildItem '\\servername\volume\dir1\audit\serverbeingaudited\20180525' | ForEach-Object {
  Import-Csv $_.FullName | Where-Object { $_.'path/from' -like '*01May18.xlsx*' }
} | Export-Csv 'C:\Temp\Output.csv' -NoTypeInformation
0 голосов
/ 02 июня 2018

Предполагая, что ваши CSV находятся в том же формате, и что ваш поисковый текст вряд ли будет присутствовать в каких-либо других столбцах, вы можете использовать Select-String вместо Import-Csv.Таким образом, вместо преобразования строки в объект и обратно в строку, вы можете просто обрабатывать как строки.Вам необходимо добавить дополнительную строку для подделки строки заголовка, примерно так:

$files = Get-ChildItem '\\servername\volume\dir1\audit\serverbeingaudited\20180525'

$result = @()
$result += Get-Content $files[0] -TotalCount 1 

$result += ($files | Select-String -Pattern '01May18\.xlsx').Line 
$result | Out-File 'c:\temp\output.csv'
0 голосов
/ 01 июня 2018

Проблема в вашем If блоке, когда вы говорите $Result = If () {$Result | ...}, вы говорите, что новый $Result равен тому, что возвращается из оператора if.Поскольку $Result еще не определено, это $Result = If () {$null | ...}, поэтому вы получаете пустую строку.

Блок If даже не нужен.Вы фильтруете свой CSV с Where-Object, просто продолжайте передавать эти объекты по конвейеру на экспорт.

Поскольку звучит так, будто вы просто запускаете это для всех дочерних папок родительского элемента, похоже, что вы можете просто использовать параметр -Recurse Get-ChildItem

Get-ChildItem '\\servername\volume\dir1\audit\serverbeingaudited\' -Recurse |
    ForEach-Object {
        Import-csv $_.FullName |
            Where-Object {$_.'path/from' -like "*01May18.xlsx*"} 
    } | Export-CSV -Path c:\temp\output.csv 

(Iиспользовал цикл ForEach-Object вместо foreach, только чтобы продемонстрировать объекты, передаваемые по конвейеру другим способом)

Редактировать: Удалено добавление согласно предложению Bill_Stewart.Запишет все записи для повторяющихся папок в прогоне.Перезапишет при следующем запуске.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...