Как переименовать большое количество файлов, используя Powershell и CSV - PullRequest
0 голосов
/ 07 марта 2020

В конечном итоге мне нужен solid сценарий PowerShell, который будет принимать папку с несколькими сотнями видеофайлов, импортировать существующие имена файлов в программу, искать новое имя файла в CSV и переименовывать его. Старое имя файла просто (ie. File1.mp4, File2.mp4, et c.). Я хотел бы добавить дату в начало файла в формате (ГГГГ-ММ-ДД).

Для тестирования я создал на своем рабочем столе папку с (10) текстовыми файлами, каждый из которых имеет уникальное имя.

Мой CSV-файл выглядит следующим образом:

Изображение CSV

Столбец «newfilename» был создан с помощью команды Concatenate в Excel.

`(=CONCATENATE(TEXT(A2, "yyyy-mm-dd")," ", B2)`

Как бы мне ни хотелось, чтобы PowerShell справлялся со всем, я чувствую, что использование Excel для большинства из них может быть лучшим способом.

В моем тестировании все было в одной папке , Однако на работе у меня будут видеофайлы на одном диске, а сценарий должен находиться в папке на рабочем столе. Поскольку я нахожусь в корпоративной сети, мне нужен специальный командный файл для запуска моих скриптов, который не является чем-то новым. Я просто изменяю имя скрипта, и он уходит!

Итак, какие команды мне нужно сделать, чтобы скрипт был отделен от видеофайлов И файла CSV?

Вот код, который у меня есть до сих пор. Все работает, когда он в одной папке.

PS C:\Users\ceran\Desktop\Rename Project> Import-Csv -Path .\MyFileList.csv | ForEach-Object {
>> $Src = Join-Path -Path $TargetDir -ChildPath $_.filename
>> $Dst = Join-Path -Path $TargetDir -ChildPath $_.newfilename
>> Rename-Item -Path $Src -NewName $Dst
>> } 

Заранее спасибо за помощь!

Крис

Ответы [ 3 ]

0 голосов
/ 07 марта 2020

Я не уверен, что столбец даты находится в вашем файле Excel и если вы хотите переименовать все файлы в папке, но если это так, вам не нужен файл CSV вообще и может сделать это :

$sourceFolder = 'X:\Path\to\the\video\files'                 # change this to the real path
Get-ChildItem -Path $sourceFolder -Filter '*.mp4' -File |    # iterate through the files in the folder
    Where-Object {$_.Name -notmatch '^\d{4}-\d{2}-\d{2}'} |  # don't rename files that already start with the date
    Rename-Item -NewName { '{0:yyyy-MM-dd} {1}' -f $_.LastWriteTime, $_.Name } -WhatIf

Используется параметр -Filter '*.mp4', чтобы получить только файлы с расширением .mp4. Для файлов в вашей тестовой папке (Desktop \ Rename Project) измените это значение на -Filter '*.txt'.
Если вы хотите переименовать все файлы, независимо от их расширения, просто удалите фильтр из командлета.

Из-за переключателя -WhatIf фактически ни один файл не переименовывается, и код просто показывает в консоли, что произойдет . Убедившись, что все в порядке, удалите -WhatIf

Надежда, которая помогает.

0 голосов
/ 07 марта 2020

Кстати, если бы CSV имел путь к столбцам и новое имя, он мог бы быть передан напрямую в пункт переименования:

path,newname
file.txt,file2.txt

import-csv ren.csv | Rename-Item -whatif

What if: Performing the operation "Rename File" on target "Item: /Users/js/foo/file.txt Destination: /Users/js/foo/file2.txt".
0 голосов
/ 07 марта 2020
$targetdir="C:\path\to\where\our\file\directory\is"
$pathtocsv="c:\path\to\csv.csv"

Import-Csv -Path $pathtocsv | ForEach-Object {
    $Src = Join-Path -Path $TargetDir -ChildPath $_.filename
    $Dst = Join-Path -Path $TargetDir -ChildPath $_.newfilename
    Rename-Item -Path $Src -NewName $Dst
} 

Почему бы это не сработало в любой ситуации?

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