У меня есть большое количество изображений, хранящихся в одной папке и отсортированных по ним, чтобы выбрать, какие из них копировать в определенные папки, такие как "декорации" или "технические", и создал список частичных имен файлов для каждой папки в текстовом файле. например. Scenery.txt

4811
4819
4820

Это уникальные номера файлов, которые являются частью полных имен файлов, например:

C:\Users\drewb\Pictures\2018_08_Inuvik\All\DSC_4811.jpg

У меня есть скрипт в powershell, который работал для меня, когда у меня был список полных имен файлов, перечисленных в файле .txt, но для экономии времени из-за большего количества фотографий я написал только номер изображения. Я надеюсь, что есть способ создать массив этого списка и передать его как переменную в полное имя файла в цикле, но любые предложения приветствуются.

Код, который работал для меня с полными именами в .txt был

Get-Content C:\Users\drewb\Pictures\2018_08_Inuvik\Technical.txt | ForEach-Object {copy-item $_ C:\Users\drewb\Pictures\2018_08_Inuvik\Technical}

РЕШЕНО: Я решил это, объединив путь к файлам с именами и расширением файла в Excel, а затем использовал сценарий PS, который я использовал ранее. Однако я чувствую, что должен быть более прямой способ, которым это может быть написано в сценарии.

1 ответ1

1

Короткий ответ

Если текущий каталог содержит изображения, имена файлов которых соответствуют одному и тому же шаблону DSC_XXXX.jpg (где XXXX - число) и файл с именем Technical.txt содержащий некоторые из этих чисел, следующая команда скопирует в папку Technical (если она существует в текущий каталог) все файлы, для которых указан номер в файле Technical.txt :

Get-Content Technical.txt | ForEach-Object { Copy-Item "DSC_$_.jpg" Technical }

Если Technical.txt и файлы изображений и Technical каталог не находятся в текущем каталоге, необходимо указать полный или относительный путь, например:

Get-Content c:\path1\to\Technical.txt | ForEach-Object { Copy-Item "c:\path2\to\pictures\DSC_$_.jpg" c:\path3\to\Technical }

объяснение

  • Выражение "DSC_$_.jpg" в команде используется для генерации имени файла изображения из числа, которое было прочитано из файла Technical.txt , который является текущим объектом конвейера (то есть $_). Он просто добавляет DSC_ в качестве префикса и .jpg в качестве расширения.
  • Get-Content читает содержимое файла Technical.txt .
  • ForEach-Object выполняет свои аргументы блока скрипта (заключенные в фигурные скобки, то есть {}) для каждого объекта в конвейере, в данном случае, каждой строки текста, возвращаемой Get-Content .

Тестирование этого решения (онлайн или локально)

Самое простое - попробовать это решение онлайн.

В противном случае следующий фрагмент можно использовать для создания в текущем каталоге test папки, содержащей пример файла Technical.txt и поддельных файлов изображений, следуя шаблону, указанному в этом ответе, вместе с пустым Technical каталогом (будьте осторожны: вам нужно изменить .\test to other else, если у вас уже есть test папка в рабочем каталоге:

mkdir -ErrorAction SilentlyContinue .\test\Technical
Out-File .\test\DSC_4811.jpg; Out-File .\test\DSC_4812.jpg; Out-File .\test\DSC_4813.jpg;
Out-File .\test\DSC_4814.jpg; Out-File .\test\DSC_4819.jpg; Out-File .\test\DSC_4820.jpg;
"4811`n4819`n4820" > .\test\Technical.txt

(В третьей строке `n представляет символ конца строки (обратная галочка (`) является escape-символом в PowerShell).

Он генерирует следующие файлы:

.\test\DSC_4811.jpg    .\test\DSC_4812.jpg    .\test\DSC_4813.jpg
.\test\DSC_4814.jpg    .\test\DSC_4819.jpg    .\test\DSC_4820.jpg
.\test\Technical.txt

После выполнения команды, указанной в качестве ответа (Get-Content .\test\Technical.txt | ForEach-Object { Copy-Item ".\test\DSC_$_.jpg" .\test\Technical }), файлы :

.\test\DSC_4811.jpg              .\test\DSC_4812.jpg              .\test\DSC_4813.jpg
.\test\DSC_4814.jpg              .\test\DSC_4819.jpg              .\test\DSC_4820.jpg
.\test\Technical.txt
.\test\Technical\DSC_4811.jpg    .\test\Technical\DSC_4819.jpg    .\test\Technical\DSC_4820.jpg

Очистить:

ri -Recurse .\test

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .