Get-ChildItem и подстановочные знаки и фильтрация - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть два разных способа получения файлов с шаблоном подстановки:

Get-ChildItem "$ActivityLogDirectory/*.csv"

и

Get-ChildItem "$ActivityLogDirectory" -Filter *.csv

Я предпочитаю использовать последний вместо первого, потому что первый (Get-ChildItem "$ActivityLogDirectory/*.csv") иногда выдает мне ошибку отказа в разрешении.

Похоже, они оба возвращают одинаковые результаты, но когда я пытаюсь сжать полученные файлы с помощью этой команды:

Compress-Archive -Update -Path $CsvFiles -DestinationPath C:\Users\admin\Downloads\foo.zip

первый преуспевает, а второй - со следующей ошибкой:

Compress-Archive : The path 'rgb dev automation store a_1-1_2194_20181120.csv'
either does not exist or is not a valid file system path.
At line:1 char:1
+ Compress-Archive -Update -Path $CsvFiles -DestinationPath C:\Users\ad ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (rgb dev automat...94_20181120.csv:String) [Compress-Archive], InvalidOperationException
    + FullyQualifiedErrorId : ArchiveCmdletPathNotFound,Compress-Archive

Так в чем же разница между этими двумя способами получения списка файлов с использованием подстановочных знаков?Или, возможно, задали другой вопрос: почему использование -Filter *.csv приводит к сбою командлета Compress-Archive?

enter image description here

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Причиной, по которой вы видите другое поведение, является неясное ситуативное поведение при строковом распределении объектов, выводимое Get-ChildItem:

Этот ответ подробноВывод Get-ChildItem происходит для преобразования в простое имя файла против полного пути , и так получается, что Get-ChildItem "$ActivityLogDirectory" -Filter *.csv преобразуется в простые имена файлов.

The Обходной путь заключается в явной строковой классификации объектов как их полных путей через их свойство FullName (синтаксис PSv3 +):

$CsvFiles = (Get-ChildItem "$ActivityLogDirectory" -Filter *.csv).FullName
0 голосов
/ 29 ноября 2018

Если вы запускаете это из оболочки с расположением папки, в которой находятся файлы CSV, то это будет работать.То, что вы делаете, передавая переменную $CsvFiles в Compress-Archive, пытается запустить имя файла в текущем контексте.Чтобы исправить это, передайте полный путь $CsvFiles.FullName:

$Csvfiles = (Get-Childitem $ActivityLogDirectory -Filter *.csv)
Compress-Archive -Update -Path $Csvfiles.fullname -DestinationPath C:\Users\admin\Downloads\foo.zip
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...