透過 7-zip 以指定密碼壓縮檔案

 以下主要提供我使用 powershell 來壓縮指定目錄下的所有 *.dll 的檔案(並且壓縮完後刪除檔案)

這個需要自己設定 Filter 及 7-zip 的 7z.exe 路徑

這篇文章主要是我留個紀錄

$Filter = [String]"*.dll"
$7zBin = [String]"C:\Program Files\7-Zip\7z.exe"

# 設定 ProcessStartInfo
Set-Location $ProcessDIR.FullName

$dirPath = Read-Host 'Enter Directory Path'
$ProcessDIR = [System.IO.DirectoryInfo]::new($dirPath)

#取得密碼
$SecurePassword = Read-Host 'Enter Password' -AsSecureString
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecurePassword)
$password = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)

$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.FileName = $7zBin
# $pinfo.Arguments = [String]"a -t7z """ + $ProcessDIR.FullName + "\" + $fileNameWithExtension + ".7z"" -p""" + $password + """ -mhe """ + $ProcessDIR.FullName + "\" + $file.Name + """"
$pinfo.RedirectStandardError = $true
$pinfo.RedirectStandardOutput = $true
$pinfo.UseShellExecute = $false
$pinfo.CreateNoWindow = $true

$process = New-Object System.Diagnostics.Process
$process.StartInfo = $pinfo

#Setup Error Listener
$errEvent = Register-ObjectEvent -InputObj $process `
        -Event "ErrorDataReceived" `
        -Action `
        {
            param
            (
                [System.Object] $sender,
                [System.Diagnostics.DataReceivedEventArgs] $e
            )
            Write-host $e.Data
        }

#Setup Out Listener
$outEvent = Register-ObjectEvent -InputObj $process `
        -Event "OutputDataReceived" `
        -Action `
        {
            param
             (
               [System.Object] $sender,
               [System.Diagnostics.DataReceivedEventArgs] $e
            )
            Write-Host $e.Data
        }


# $process.BeginOutputReadLine()
# $process.BeginErrorReadLine()

$i = 0

Foreach ($file in $files = $ProcessDIR.GetFiles($Filter))
{
    $fileNameWithExtension = $file.Name.Substring(0, $file.Name.Length - $file.Extension.Length)
    $7zFile = [System.IO.FileInfo]::new($ProcessDIR.FullName + "\" + $fileNameWithExtension + ".7z")
    $sourceFile = [System.IO.FileInfo]::new($ProcessDIR.FullName + "\" + $file)

    # 如果 7z 檔案有存在的話
    if($true -eq $7zFile.Exists)
    {
        $7zFile.Delete()
        Write-Host "File $7zFile deleted." -ForegroundColor red -BackgroundColor white
    }

    Write-Host "File $sourceFile Process ..."

    $process.StartInfo.Arguments = [String]"a -t7z """ + $7zFile.FullName + """ -p""" + $password + """ -mhe """ + $sourceFile.FullName + """"
    # Start the process
    [Void] $process.Start()

    # Begin async read events
    while (!$process.HasExited)
    {
        Start-Sleep -Milliseconds 250
    }
    $process.Close()
    
    [System.IO.File]::Delete($sourceFile.FullName)
}
    
Get-EventSubscriber -Force | Unregister-Event -Force

Write-Host "Done."

留言

這個網誌中的熱門文章

DB 資料庫呈現復原中

Outlook 刪除大量重覆信件

[VB.Net] If vs IIf ,兩者的差異