Копировать элементы с похожими именами файлов из содержимого CSV

Я пытаюсь создать простой скрипт, который может читать файл CSV и находить файлы (.jpg) с именами, содержащими содержимое CSV, а затем копировать эти файлы в новое место.

Содержимое CSV будет иметь следующий формат, «файлы» — это заголовок:

Files
------
B000000001
B000000002

Имена файлов будут в следующем формате:

B000000001.PT01.jpg
B000000002.PT03.jpg

Вот что у меня есть до сих пор:

$ASINs = Import-Csv "C:\share_test.csv"
foreach($ASIN in $ASINs){
GCI -Path "C:\test1" | Where-Object{$_.Name -like $ASIN} | Copy-Item -Destination "C:\test2"
}

Я не получаю ошибок, но это не копирование файлов, которые соответствуют. Кажется, у меня всегда возникают проблемы с Copy-Item, когда он получает это конкретное, поэтому любая помощь приветствуется.

РЕДАКТИРОВАТЬ: Хорошо, спасибо всем за советы. Это то, что у меня есть сейчас:

$ASINs = Import-Csv "C:\share_test.csv"
foreach($ASIN in $ASINs){
GCI -Path "C:\test1" -Filter '*$ASIN*' | Copy-Item -Destination "C:\test2"
}

До сих пор нет кости! Что я делаю не так? Я пробовал -Filter с кавычками и без них.

Спасибо еще раз!


person Garrett    schedule 20.12.2017    source источник
comment
Вы не получаете никаких ошибок, потому что вы неправильно сравниваете объекты, а ваш конвейер пуст. Get-ChildItem -Path 'C:\test1' -Filter *$ASIN*, Where-Object не нужно проверять имя файла; это просто замедляет работу.   -  person Maximilian Burszley    schedule 21.12.2017


Ответы (2)


Оператор -like допускает подстановочные знаки, но без подстановочных знаков он работает так же, как -eq, т.е. вы ищете, например. имя файла, которое точно B000000001 вместо B000000001.PT01.jpg.

Вы можете решить эту проблему, добавив подстановочные знаки по мере необходимости:

 Where-Object{$_.Name -like "*$ASIN*"}

Однако это быстрее и рекомендуется фильтровать «слева»:

Get-ChildItem -Path "C:\test1" -Filter "*$ASIN*"

В этом случае нет необходимости в Where-Object.

person vrdse    schedule 20.12.2017

У меня есть это быстрая попытка, и я должен был внести пару изменений. Во-первых, я использовал оператор -match, а во-вторых, я включил свойство Files при использовании оператора

Where-Object{$_.Name -match $ASIN.files}

Я попытался протестировать то, что упоминал @vrdse, сравнив строку и $ASIN, используя следующие

"B0003" -like "*$Asin*"

Но это также ничего не вернуло, пока я не изменил его на

"B0003" -like "*$($Asin.files)*"
person Shadowzee    schedule 20.12.2017