首页 > 解决方案 > Powershell脚本,用于根据pdf名称中的5位数字创建单个文件夹

问题描述

到目前为止,我已经尝试了以下脚本:


    $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 位数字创建一个文件夹,并将这些文件移动到新文件夹中。

例如:我可以有 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

我试图在最佳答案脚本中包含一个 else 块,但没有取得多大成功。但是,我确实创建了一个单独的脚本,该脚本将在创建新文件之前存档文件。我只需要在主 powershell 脚本之前运行它。

$SourceDir = 'D:\WORK\JetLetter\LKY\LKY_jV_004_9835'
$DestDir = 'D:\WORK\JetLetter\LKY\#Print_Production_Files'
$ArchiveDir = 'D:\WORK\JetLetter\LKY\#Print_Production_Files\@archive'
$Filter = '*.pdf'

$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 (Test-Path -LiteralPath $FullTargetDir)
    {
        # the "$Null =" is to suppress unwanted output about what was done
        $null = Move-Item -Path $FullTargetDir -Destination $ArchiveDir -Force
    }
}

这使文件和文件夹更有条理。

标签: powershelldirectorycopy

解决方案


我认为这可以满足您的要求。[]评论似乎足够了,但是如果您有任何问题,请提出。

$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

推荐阅读