用于在特定命名文件夹中解压缩的powershell脚本

时间:2019-02-20 09:57:29

标签: powershell

我有几个zip文件,它们生成的名称类似21321421-12315-sad3fse-23434fg-ggfsd,这无助于识别zip的内容。

我需要一个脚本,该脚本将其解压缩,然后查找具有部分生成的静态名称的pdf文件,例如asdawd-ersrfse-231-Formular2311

之后,应创建一个带有pdf文件名称的文件夹,并将所有zip文件内容解压缩到该文件夹​​中。

到目前为止,我只需要片段片段就可以工作,但是我仍然被困住。

$shell = new-object -com shell.application
$CurrentLocation = get-location
$CurrentPath = $CurrentLocation.path
$Location = $shell.namespace($CurrentPath)

# Find all the Zip files and Count them
$ZipFiles = get-childitem -Path "C:\Install\NB\Teststart" *.zip
$ZipFiles.count | out-default

# Set the Index for unique folders
$Index = 1

# For every zip file in the folder
foreach ($ZipFile in $ZipFiles) {

    # Get the full path to the zip file
    $ZipFile.fullname | out-default

    # Set the location and create a new folder to unzip the files into - Edit the line below to change the location to save files to
    $NewLocation = "C:\Install\NB\Testfinal\$Index"
    New-Item $NewLocation -type Directory

    # Move the zip file to the new folder so that you know which was the original file (can be changed to Copy-Item if needed)
    Copy-Item $ZipFile.fullname $NewLocation

    # List up all of the zip files in the new folder 
    $NewZipFile = get-childitem $NewLocation *.zip

    # Get the COMObjects required for the unzip process
    $NewLocation = $shell.namespace($NewLocation)
    $ZipFolder = $shell.namespace($NewZipFile.fullname)

    # Copy the files to the new Folder
    $NewLocation.copyhere($ZipFolder.items())

    # Increase the Index to ensure that unique folders are made
    $Index = $Index + 1
}

Get-ChildItem -Path "C:\Install\NB\Testfinal" -Include "*.pdf" -Recurse | ForEach-Object {
    $oldFolder = $_.DirectoryName

    # New Folder Name is .pdf Filename, excluding extension
    $newFolder = $_.Name.Substring(0, $_.Name.Length - 4)

    # Verify Not Already Same Name
    Write-Host "Rename: $oldFolder To: $newFolder"
    Rename-Item -NewName $newFolder -Path $oldFolder
}

2 个答案:

答案 0 :(得分:0)

这应该做,并且比您拥有的要简单得多。它依赖于您应该已经在服务器上安装的.NET 4.5:

[Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem')

# Get all the zip files in the root of the script, change $PSScriptRoot accordingly
Get-ChildItem -Path $PSScriptRoot -Filter *.zip -Recurse | ForEach-Object {
    # Open the archive for reading
    $zip = [IO.Compression.ZipFile]::OpenRead($_.FullName)

    # Find the name of the PD file from the archive entries
    $archiveName = $zip.Entries | `
        Where-Object { [System.IO.Path]::GetExtension($_.FullName) -eq '.pdf' } | `
        Select-Object @{N = "BaseName"; E = {[System.IO.Path]::GetFileNameWithoutExtension($_.FullName)}} |
        Select-Object -Expand BaseName

    # Close the zip file
    $zip.Dispose()

    # Use the native Expand-Archive to unzip the archive
    # Ammand $PSScriptRoot to the destination base path if needed
    Expand-Archive -Path $_.FullName -DestinationPath (Join-Path $PSScriptRoot $archiveName)
}

答案 1 :(得分:0)

与您自己的脚本相同,请先提取zip文件,然后将提取的文件夹重命名为与pdf相同的文件:

$SourceDir = 'C:\Install\NB\Teststart'
$ExtractDir = 'C:\Install\NB\Testfinal'

# Extract each zip to a folder with the same name as the zip file (BaseName)
Get-ChildItem (Join-Path $SourceDir *.zip) | foreach {
    Expand-Archive $_.FullName -DestinationPath (Join-Path $ExtractDir $_.BaseName)
}

# Rename the PDF's parent folder to the same as the PDF
Get-ChildItem (Join-Path $ExtractDir *.pdf) -Recurse | foreach {
    Rename-Item -Path $_.Directory.FullName -NewName $_.BaseName
}