Скрипт Powershell для создания одной папки на основе 5 цифр в названии PDF - PullRequest
1 голос
/ 10 апреля 2020

До сих пор я пробовал следующий скрипт:

$SourceFolder = "D:\WORK\JetLetter\LKY\LKY_jV_004\"
$TargetFolder = "D:\WORK\JetLetter\LKY\LKY_jV_004\Final\"
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 $ChildPath
        if( -not ( Test-Path -Path $Destination.Directory.FullName )){
            New-Item -ItemType Directory -Path $Destination.Directory.FullName
            }
        Copy-Item -Path $_.FullName -Destination $Destination.FullName
}

Это создает папку для каждого файла PDF в папке. Мне нужно создать одну папку на основе имени 5 di git и переместить эти файлы в новую папку.

Например: у меня может быть 10 pdf с номером "30565" в них. и новая папка должна называться «30565»

Вот некоторые имена файлов, которые нужно объяснить:

LKY_20974_Pr01_1-5000.pdf
to
D:\WORK\JetLetter\LKY\LKY_jV_004\Final\20974

LKY_20974_Pr02_5001-10000.pdf
to
D:\WORK\JetLetter\LKY\LKY_jV_004\Final\20974

LKY_20974_Pr03_10001-15000.pdf
to
D:\WORK\JetLetter\LKY\LKY_jV_004\Final\20974

1 Ответ

1 голос
/ 11 апреля 2020

Я думаю, что это делает то, что вы хотите сделать. [ ухмылка ] комментарии кажутся адекватными, но если у вас есть какие-либо вопросы, пожалуйста, задавайте.

$SourceDir = 'c:\temp\JetLetter\LKY\LKY_jv_004'
$DestDir = 'c:\temp\JetLetter\LKY\LKY_jv_004\Final'
$Filter = '*.pdf'

#region >>> make the dirs and sample files to work with
#    remove the entire "#region/#endregion" block when you are ready to work with real data
# make the dirs
$Null = mkdir -Path $SourceDir, $DestDir -ErrorAction 'SilentlyContinue'

# make the test files
$SampleFiles = @(
    'LKY_11111_Pr11_1-11111.pdf'
    'LKY_22222_Pr22_2-22222.pdf'
    'LKY_22222_Pr22_2222-2222.pdf'
    'LKY_33333_Pr33_3-3333.pdf'
    'LKY_33333_Pr33_33333-33333.pdf'
    'LKY_55555_Pr55_5-5555.pdf'
    'LKY_77777_Pr77_7-77777.pdf'
    'LKY_77777_Pr77_77777-77777.pdf'
    'LKY_99999_Pr99_9-99999.pdf'
    )

foreach ($SF_Item in $SampleFiles)
    {
    # the "$Null =" is to suppress unwanted output about what was done
    $Null = New-Item -Path $SourceDir -Name $SF_Item -ItemType 'File' -ErrorAction 'SilentlyContinue'
    }
#endregion >>> make the dirs and sample files to work with


$FileList = Get-ChildItem -LiteralPath $SourceDir -Filter $Filter -File

foreach ($FL_Item in $FileList)
    {
    # this presumes the target dir number is ALWAYS the 2nd item in the split string
    $TargetDir = $FL_Item.BaseName.Split('_')[1]
    $FullTargetDir = Join-Path -Path $DestDir -ChildPath $TargetDir
    if (-not (Test-Path -LiteralPath $FullTargetDir))
        {
        # the "$Null =" is to suppress unwanted output about what was done
        $Null = New-Item -Path $FullTargetDir -ItemType 'Directory'
        }

    $NewFullFileName = Join-Path -Path $FullTargetDir -ChildPath $FL_Item.Name
    # leave the file in the source dir if it already is in the final target dir
    #    you may want to save the not-copied info to a file for later review
    if (-not (Test-Path -LiteralPath $NewFullFileName))
        {
        # the "Move-Item" cmdlet on win7ps5.1 is wildly unreliable
        #    so i used copy & then remove
        $Null = Copy-Item -LiteralPath $FL_Item.FullName -Destination $NewFullFileName
        Remove-Item -LiteralPath $FL_Item.FullName
        }
        else
        {
        Write-Warning ('    {0} already exists in {1}' -f $FL_Item.Name, $FullTargetDir)
        Write-Warning '        The file was not moved.'
        Write-Warning ''
        }
    }

вывод на экран существует только для «не перемещенных» файлов. опять же, вы можете сохранить список в $ Var или в файл для дальнейшей работы.

один из перемещенных файлов ...

C:\Temp\JetLetter\LKY\LKY_jv_004\Final\22222\LKY_22222_Pr22_2222-2222.pdf
...