PowerShell - поиск существующих файлов генерирует пустой вывод

Я хочу найти конкретные файлы, перечисленные в searchFiles, и передать их местоположение в TestFileLocation.CSV. Тем не менее, мой текущий скрипт генерирует только пустой CSV. Что мне не хватает?

Мой TestFindFile.csv имеет вид:

Name
123.pdf
321.pdf
aaa.pdf

SNIPPET

$searchFiles = Import-CSV 'C:\Data\SCRIPTS\PS1\TestFindFile.csv' -Header ("Name")
$source = 'C:\Data'

ForEach($File in $searchFiles) 
{
    Get-ChildItem $source -Filter $File -rec | where {!$_.PSIsContainer} | select-object FullName | export-csv -notypeinformation -delimiter '|' -path c:\data\scripts\ps1\TestFileLocation.csv
}

2 ответа

Решение

Вы перезаписывали CSV для каждой итерации цикла.

$searchFiles = Import-CSV 'C:\Data\SCRIPTS\PS1\TestFindFile.csv' -Header ("Name")
$source = 'C:\Data'
$outputPath = 'c:\data\scripts\ps1\TestFileLocation.csv'

$searchFiles |  ForEach-Object {
    # Silently continue to try to ignore error like
    # not being able to read path's which are too long
    Get-ChildItem $source -Filter $_ -rec -ErrorAction SilentlyContinue | where {!$_.PSIsContainer} | select-object FullName 
} | export-csv -notypeinformation -delimiter '|' -path $outputPath

Пример использования AlphaFS

Комментарий попросил привести пример использования AlphaFS, потому что он утверждает, что преодолел проблему длинного пути. Я не буду вдаваться во все детали, но вот как я заставил это работать.

# download and unzip to c:\alpahfs
# dir C:\AlphaFS\* -Recurse -File | Unblock-File 
[System.Reflection.Assembly]::LoadFrom('C:\AlphaFS\lib\net451\AlphaFS.dll')
$searchFiles = Import-CSV 'C:\Data\SCRIPTS\PS1\TestFindFile.csv' -Header ("Name")
$source = 'C:\Data'
$outputPath = 'c:\data\scripts\ps1\TestFileLocation.csv'

    $searchFiles |  ForEach-Object {
        $files = [Alphaleonis.Win32.Filesystem.Directory]::EnumerateFiles($source,'*',[System.IO.SearchOption]::AllDirectories) 
        $files | ForEach-Object { [PSCustomObject] @{FileName = $_} }
    } | export-csv -notypeinformation -delimiter '|' -path $outputPath
# type $outputPath

Если ваш CSV-файл содержит заголовок "Имя", нет необходимости снова объявлять его при запуске Import-Csv,

Причина, по которой выходные данные пусты, заключается в том, что вы ищете объект, который содержит свойство Name (импортированное из TestFindFile.csv). Ищи $File.Name, Также вытащите команды вне цикла, которые не должны быть там:

$searchFiles | Select -ExpandProperty Name | % {
   Get-ChildItem $source -Filter $_ -Recurse | where {!$_.PSIsContainer}
} | select-object FullName | export-csv -notypeinformation -delimiter '|' -path c:\data\scripts\ps1\TestFileLocation.csv
Другие вопросы по тегам