Powershell: поместите все файлы в указанном каталоге в отдельные подкаталоги с уникальными именами. - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть существующий каталог, скажем, "C: \ Users \ Test", который содержит файлы (с различными расширениями) и подкаталоги. Я пытаюсь написать скрипт Powershell, который поместит каждый файл в «C: \ Users \ Test» в подкаталог с уникальным именем, например «\ 001», «\ 002» и т. Д. c., игнорируя при этом любые существующие подкаталоги и файлы в них. Пример:

Перед запуском скрипта:

C:\Users\Test\ABC.xlsx
C:\Users\Test\QRS.pdf
C:\Users\Test\XYZ.docx
C:\Users\Test\Folder1\TUV.gif

После запуска скрипта:

C:\Users\Test\001\ABC.xlsx
C:\Users\Test\002\QRS.pdf
C:\Users\Test\003\XYZ.docx
C:\Users\Test\Folder1\TUV.gif

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

Вот где я сейчас нахожусь:

$id = 1
Get-ChildItem | where {!$_.PsIsContainer}| % {
MD ($_.root +($id++).tostring('000'));
MV $_ -Destination ($_.root +(001+n))
}

Выражение MD успешно создает подкаталоги, но я не уверен, как написать выражение MV для фактического перемещения файлов в них. Я написал (001 + n), чтобы проиллюстрировать концепцию, которую я собираюсь, где n будет увеличиваться от 0 до общего количества файлов. Или, возможно, нужен совершенно другой подход.

Ответы [ 2 ]

0 голосов
/ 04 апреля 2020

Хорошо, думаю, я понял это. Последующее выполнение следующих сценариев дает желаемый результат. Хитрость была в том, чтобы сбросить приращение $ id при выполнении выражения MV. Это, вероятно, можно улучшить, так что дайте мне знать, если у вас есть лучший способ! Отредактировано: @ArcSet предоставил лучший ответ в одном скрипте! Спасибо!

$id = 1
Get-ChildItem | where {!$_.PsIsContainer}| % {
MD ($_.root +($id++).tostring('000'))
}

$id = 1
Get-ChildItem | where {!$_.PsIsContainer}| % {
MV $_ -Destination($_.root +($id++).tostring('000'))
}
0 голосов
/ 04 апреля 2020
$id = 1
Get-ChildItem C:\Test\ -file  | % {
    New-Item -ItemType Directory -Path C:\Test -Name $id.tostring('000')
    Move-Item $_.FullName -Destination C:\Test\$($id.tostring('000'))
    $id++
}

Move-Item - это то, что вы искали.

...