0

我有一个以格式存储的文件

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 中编码,我不确定我做错了什么。我似乎找不到现有的答案。有人可以建议进行调整以使其正常工作吗?

4

1 回答 1

0

由于您想为每个目录重新编号,我建议:

  • 首先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:\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
于 2019-05-21T13:11:31.380 回答