У меня есть файлы, которые хранятся в формате
C:\Users\xx\test powershell script\studyID\number\filenamedfolder\example.jpg
Желаемый результат:
studyID_number_1
#последняя цифра должна быть последовательно пронумерована для каждого экземпляра jpg в 'filenamedfolder'.
Я использовал код, приведенный в предыдущих ответах, для поиска, переименования и копирования файлов в корневой каталог.
Я использую Windows 10 и Powershell:
Major Minor Build Revision
----- ----- ----- --------
5 1 15063 1478
Get-childitem "C:\Users\xx\test powershell script\*" -include *.jpg -recurse |% {
$nextName = Join-Path -Path 'C:\Users\xx\test powershell script\*' -ChildPath $_.name
while(Test-Path -Path $nextName)
{
$nextName = Join-Path "C:\Users\xx\test powershell script" ($_.BaseName + "_$num" + $_.Extension)
$num+=1
}
$ParentOjbect =$_.Directory
$Parent =$ParentOjbect.Name
$GrandParent = $ParentOjbect.Parent
$GreatGran = $GrandParent.Parent
$Extension = $_.Extension
$countRef = [ref] 0
Copy-item $_ -Destination (Join-Path "C:\Users\xx\test powershell script" ('{0}_{1}_{2}{3}' -f $GrandParent,$GreatGran,++$countRef.Value,$Extension))
}
Я попытался использовать код для последовательного именования файлов, но мой код не последовательно именует файлы, когда в папке «filenamedfolder» существует более одного jpg. Вместо этого копируется только один jpg и переименовывается в корневую папку.
Я никогда не кодировал в powershell, и я не уверен, что я сделал неправильно. Кажется, я не могу найти существующий ответ. Может ли кто-нибудь предложить корректировку, чтобы заставить это работать?
Поскольку вы хотите перенумеровать каталог, я предлагаю:
Set-Location
в BaseDirGet-ChildItem
с несколькими подстановочными знаками, чтобы сохранить ту же глубину подкаталогаDirectory
и перенумеровать только внутри этой группыЭто образец дерева:
> tree /F
├───studyID1
│ ├───number1
│ │ └───filenamedfolder
│ │ example1.jpg
│ │ example2.jpg
│ │
│ └───number2
│ └───filenamedfolder
│ example1.jpg
│ example2.jpg
│
└───studyID2
├───number1
│ └───filenamedfolder
│ example1.jpg
│ example2.jpg
│
└───number2
└───filenamedfolder
example1.jpg
example2.jpg
example3.jpg
обрабатывается этим скриптом:
## Q:\Test\2019\05\21\SO_56236909.ps1
$BaseDir = Join-Path $ENV:USERPROFILE "test powershell script"
Push-Location $BaseDir
Get-ChildItem -Path *\*\*\* -Filter *.jpg -File |
Group-Object Directory | ForEach-Object {
$Cnt=1
$DirName = $_.Group[0].Directory.Name
$Number = $_.Group[0].Directory.Parent.Name
$StudyID = $_.Group[0].Directory.Parent.Parent.Name
$_.Group | Rename-Item -NewName {"{0}_{1}_{2}_{3}.jpg" -f `
$StudyID,$Number,$DirName,$Script:Cnt++ } -WhatIf
}
Pop-Location
Если вывод выглядит нормально, удалите -WhatIf
дает это результирующее дерево:
> tree /F
├───studyID1
│ ├───number1
│ │ └───filenamedfolder
│ │ studyID1_number1_1.jpg
│ │ studyID1_number1_2.jpg
│ │
│ └───number2
│ └───filenamedfolder
│ studyID1_number2_1.jpg
│ studyID1_number2_2.jpg
│
└───studyID2
├───number1
│ └───filenamedfolder
│ studyID2_number1_1.jpg
│ studyID2_number1_2.jpg
│
└───number2
└───filenamedfolder
studyID2_number2_1.jpg
studyID2_number2_2.jpg
studyID2_number2_3.jpg
Вау, это довольно удивительно. Я должен изучить некоторую оболочку Power. Большое спасибо за объяснение. Мне пришлось изменить код, потому что в дереве мой номерной файл стоял перед моим файлом StudyID, но тогда он работал отлично. Спасибо
Я заметил проблему, поскольку (используя полученное дерево) в некоторых числовых файлах есть несколько папок с именами файлов. В результате получается несколько .jpg с одним и тем же именем файла. Можно ли изменить код для учета этого, чтобы все файлы jpg имели уникальное имя?
Это была схема твой :-), вставлю дополнительный DirName
- Готово.
Спасибо @LotPings, я ценю это, это здорово.
Код был взят у @Armand G. спасибо