Переименовать папки на основе новейшего PDF в папке - PullRequest
0 голосов
/ 25 февраля 2019

В настоящее время у меня есть более 20000 папок, в которых при создании была задана произвольная строка символов.Я хотел бы переименовать каждую папку с именем последнего PDF, измененного в каждой папке.Я определенно в моей голове.Текущий скрипт, кажется, просто перемещает PDF и / или папку без переименования или создания папки с именем PDF.

Get-ChildItem -Path $SourceFolder -Filter *.pdf |
 ForEach-Object {
     $ChildPath = Join-Path -Path $_.Name.Replace('.pdf','') -ChildPath $_.Name

     [System.IO.FileInfo]$Destination = Join-Path -Path $TargetFolder -ChildPath $ChildPat

     if( -not ( Test-Path -Path $Destination.Directory.FullName ) ){
         New-Item -ItemType Directory -Path $Destination.Directory.FullName
         }

     Copy-Item -Path $_.FullName -Destination $Destination.FullName
     }

1 Ответ

0 голосов
/ 25 февраля 2019

Добро пожаловать, Роберт!С вашим скриптом происходит несколько вещей:

  1. Существует опечатка: $ChildPat
  2. Вам не нужен объект FileInfo для создания нового каталога, и вы можете 'создать один из несуществующего пути.$Destination = Join-Path $_.Directory $_.BaseName получит имя новой папки более надежно, в необычном случае, когда в имени файла есть встроенный файл '.pdf'
  3. . Он не получает последнюю версию PDF.

Предполагая, что вы хотите получать только папки с PDF, у вас должен быть вложенный Get-ChildItem для каждой папки, как рекомендует @Lee_Dailey:

Push-Location $SourceFolder
Foreach ($dir in (Get-ChildItem *.pdf -Recurse | Group-Object Directory | Select Name )){
        Push-Location $dir.Name
        $NewestPDF = Get-ChildItem *.pdf | Sort-Object ModifiedDate | Select -Last 1
        $Destination = Join-Path $dir.Name "..\$($NewestPDF.BaseName)"
        If(!(Test-Path $Destination)){New-Item $Destination -ItemType Directory}
        Copy-Item *.PDF $Destination 
        Pop-Location
        #Remove-Item $dir.Name #uncomment to remove the old folder (is it empty?)
}
...