簡體   English   中英

使用 PowerShell 5 壓縮列表中的文件

[英]Compress Files from list with PowerShell 5

我有一個文件,其中包含帶有說明的文件列表。

像這樣:

XXXXXX/sample.txt

XXXXXX/dog.txt

XXXXXX/cat.docx

ZZZZ/lamp.jpg

如何壓縮所有文件並使用子方向保存文件。

現在,我可以壓縮所有文件但沒有指示。

像這樣:

sample.txt

dog.txt

cat.docx

lamp.jpg

抱歉我的英語不好。

foreach ($filename in Get-Content .\ListOfFilesToZip.txt)
{
    Compress-Archive -Update $filename .\ZipFile.zip
}

編輯如果問題是關於從路徑中獲取文件名
最有效的方法是使用正則表達式,但如果您不習慣使用它們,它們可能會相當復雜。

一種更簡單的方法是簡單地拆分每個字符串並選擇文件名所在的最后一部分:

$string = "c:\asd\qwe\zxc\dog.txt"

#Split the string on each \
    $string.Split("\") 

#This will output a list like this
c:
asd
qwe
zxc
dog.txt

現在我們只想選擇此列表中的最后一個條目,因為文件名總是在路徑中的最后一個。 所以我們為此使用選擇對象。

$string.Split("\") | Select-Object -Last 1 

這將返回:

dog.txt

您可以通過列表上的 foreach 運行它以獲取每個項目的它。

不確定是否有更好的方法來執行此操作,但是您可以創建一個臨時文件夾,將要存檔的文件與所需的文件夾結構一起復制到那里,然后將整個文件壓縮。

看看這里(不是我的代碼,但似乎正是這樣做的)的示例

以下函數可以將整個文件夾結構壓縮到一個 zip 文件中,並將結構保留在 zip 中(甚至適用於 PowerShell <5)。

function createZipFile($outputFileName, $sourceDirectory){
    Add-Type -AssemblyName System.IO.Compression.FileSystem
    $compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
    [System.IO.Compression.ZipFile]::CreateFromDirectory($sourceDirectory, $outputFileName, $compressionLevel, $false)
}

這樣稱呼它:

createZipFile "c:\temp\output.zip" "c:\folder\to\compress"
function DirNewTemp {
    $tmpdir = (New-TemporaryFile).FullName
    Remove-Item -Force -Path $tmpdir -ErrorAction 'SilentlyContinue'
    New-Item -Type Directory $tmpdir | out-null
    return $tmpdir
}

function ZipFiles {
    param(
        [string]$Zip,
        [string[]]$FileList
    )
    write-host ""
    write-host "====================================="
    write-host "ZipFile $Zip"
    write-host "====================================="
    
    $pwd      = (Get-Location).Path     
    $tmpdir   = DirNewTemp
        
    try {
        $count = $FileList.Count
        foreach ($file in $FileList) {
            $pwd_escaped = [Regex]::Escape($pwd)        
            $save_file   = $file -replace "^${pwd_escaped}\\", "${tmpdir}\"
            $save_path   = Split-Path $save_file -Parent
            New-Item  -Force -Path $save_path -ItemType Directory | out-null
            Copy-Item -Force $file $save_file           
        }
        set-location $tmpdir        
        $dest = "$pwd\$Zip";
        write-host "Creating Zip: $dest"        
        Compress-Archive -Force -Path * -DestinationPath $dest
    }
    finally {
        write-host "cleanup"
        set-location $pwd
        remove-item -Force -Recurse -Path $tmpdir -ErrorAction 'SilentlyContinue'
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM