根据大parent和parent目录重命名文件并顺序编号多个文件
Rename file based on grand parent and parent directory and sequentially number multiple files
我有一个以
格式存储的文件
C:\Users\xx\test powershell script\studyID\number\filenamedfolder\example.jpg
期望的输出是:
studyID_number_1
#'filenamedfolder' 中每个 jpg 实例的最后一位应按顺序编号。
我使用了之前答案中给出的代码来查找、重命名文件并将文件复制到根目录。
我正在使用 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
到BaseDir
- 使用多个通配符执行
Get-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:\Test19\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
我有一个以
格式存储的文件C:\Users\xx\test powershell script\studyID\number\filenamedfolder\example.jpg
期望的输出是:
studyID_number_1
#'filenamedfolder' 中每个 jpg 实例的最后一位应按顺序编号。
我使用了之前答案中给出的代码来查找、重命名文件并将文件复制到根目录。
我正在使用 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
到BaseDir - 使用多个通配符执行
Get-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:\Test19\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