先安裝 NanaZip 或 7-Zip
在 PowerShell 中輸入 7z.exe 確認是否可用
若得到以下訊息則必須手動新增 7z.exe 所在目錄到環境變數 PATH
"無法辨識 '7z.exe' 詞彙是否為 Cmdlet、函數、指令檔或可執行程式的名稱。......"
在 PowerShell 中執行下列命令
使用前記得先修改 Path\To\Dir 為你要的主目錄路徑
Set-Location -LiteralPath 'Path\To\Dir'
$outputDirPath = $PWD.Path
foreach ($item in (Get-ChildItem -LiteralPath .)) {
$desFilePath = Join-Path $outputDirPath "$($item.Name).zip"
if ($item.PsIsContainer) {
$souFilePath = Join-Path $item.FullName *
} else {
$souFilePath = $item.FullName
}
& 7z.exe a "$($desFilePath)" "$($souFilePath)"
}
你也可只用 PowerShell 的 cmdlet 來達到相同功能
Set-Location -LiteralPath 'Path\To\Dir'
$outputDirPath = $PWD.Path
foreach ($item in (Get-ChildItem -LiteralPath .)) {
$desFilePath = Join-Path $outputDirPath "$($item.Name).zip"
$escDesFilePath = $desFilePath -replace '[\`\[\]]', '`$0'
if ($item.PsIsContainer) {
$escSouFileParentPath = $item.FullName -replace '[\`\[\]]', '`$0'
$escSouFilePath = Join-Path $escSouFileParentPath *
} else {
$escSouFilePath = $item.FullName -replace '[\`\[\]]', '`$0'
}
Compress-Archive -Path $escSouFilePath -DestinationPath $escDesFilePath
}
以下是補充說明
- 路徑中單獨的 . 等同 $PWD.Path
- Get-ChildItem 'path\to\dir' 等同 Get-Item 'path\to\dir\*'
- 用參數 -LiteralPath 指定輸入,則不會將路徑中的任何字元視為特殊字元
- 若只是要在路徑中使用 * 字元,則可用 -replace 跳脫路徑中的方括號字元
- 工作目錄中帶有特殊字元可能會導致某些 cmdlet 找不到相對路徑的目標,所以餵給 cmdle
t 的路徑最好是絕對路徑。
例如把 .\file.ext 轉成絕對路徑的方法如下
$ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath('.\file.ext')
大概就這樣…