使用 Powershell 将 ZIP 文件解压缩到单独的文件夹中
Unzip ZIP files in separate folders using Powershell
我有一个文件夹,里面有几个子文件夹。每个子文件夹 may/may 不包含一些 *.ZIP 文件。
我正在尝试将每个 zip 文件解压缩到与原始 zip 文件同名的单独文件夹中(如果存在则覆盖该文件夹),然后删除存档。
但是我从下面的代码中得到的是父目录中所有 ZIP 文件的提取,这不是我想要的。
这是我的代码:
foreach ($file in (dir -recurse *.zip)) { & "c:\Program Files-zipz" x "$file" -aoa }; rm dir -recurse *.zip
有人可以帮我解决这个问题吗?
这里你正在做一个字符串扩展。做下面的练习来理解这一点。
$r = Get-ChildItem c:\Windows\System32\cmd.exe
"$r"
$r.FullName
下面的代码应该可以解决您的问题
foreach ($file in (dir -recurse *.zip)){
& "c:\Program Files-zipz" x $file.FullName -aoa
}
rm dir -recurse *.zip
我刚刚找到了我的问题的完美答案,我愿意 post 在这里为将来遇到此主题的任何人提供答案。
我有几个问题。其中之一是在 PowerShell (v5.1 Windows 10) 中处理长路径。为避免这种情况,用户应在 PowerShell 中安装和加载 PSAlphaFS
模块并使用 Get-LongChildItem
而不是 Get-ChildItem
。为此,首先您需要 运行 以下命令更新系统上的 PowerShell 执行策略:
Set-ExecutionPolicy RemoteSigned
接下来需要安装这个模块:
Install-Module -Name PSAlphaFS
最后用这个加载它:
import-module PSAlphaFS
现在我们准备好摇滚了。只需将以下代码粘贴到 PowerShell 中,它就可以完成工作。 (记得改第20行的路径)
Add-Type -AssemblyName System.IO.Compression.FileSystem
function Unzip
{
param([string]$zipfile, [string]$outpath)
try {
[IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $outpath)
echo "Done with unzip of file :) "
$true
}
catch {
echo "Oops....Can't unzip the file"
$false
}
}
$flag = $true
while($flag)
{
$zipFiles = Get-LongChildItem -Path "c:\Downloads\New Folder\FI" -Recurse | Where-Object {$_.Name -like "*.zip"}
if($zipFiles.count -eq 0)
{
$flag = $false
}
elseif($zipFiles.count -gt 0)
{
foreach($zipFile in $zipFiles)
{
#create the new name without .zip
$newName = $zipFile.FullName.Replace(".zip", "")
if(Unzip $zipFile.FullName $newName){
Remove-Item $zipFile.FullName
}
}
}
Clear-Variable zipFiles
}
我有一个文件夹,里面有几个子文件夹。每个子文件夹 may/may 不包含一些 *.ZIP 文件。
我正在尝试将每个 zip 文件解压缩到与原始 zip 文件同名的单独文件夹中(如果存在则覆盖该文件夹),然后删除存档。
但是我从下面的代码中得到的是父目录中所有 ZIP 文件的提取,这不是我想要的。
这是我的代码:
foreach ($file in (dir -recurse *.zip)) { & "c:\Program Files-zipz" x "$file" -aoa }; rm dir -recurse *.zip
有人可以帮我解决这个问题吗?
这里你正在做一个字符串扩展。做下面的练习来理解这一点。
$r = Get-ChildItem c:\Windows\System32\cmd.exe
"$r"
$r.FullName
下面的代码应该可以解决您的问题
foreach ($file in (dir -recurse *.zip)){
& "c:\Program Files-zipz" x $file.FullName -aoa
}
rm dir -recurse *.zip
我刚刚找到了我的问题的完美答案,我愿意 post 在这里为将来遇到此主题的任何人提供答案。
我有几个问题。其中之一是在 PowerShell (v5.1 Windows 10) 中处理长路径。为避免这种情况,用户应在 PowerShell 中安装和加载 PSAlphaFS
模块并使用 Get-LongChildItem
而不是 Get-ChildItem
。为此,首先您需要 运行 以下命令更新系统上的 PowerShell 执行策略:
Set-ExecutionPolicy RemoteSigned
接下来需要安装这个模块:
Install-Module -Name PSAlphaFS
最后用这个加载它:
import-module PSAlphaFS
现在我们准备好摇滚了。只需将以下代码粘贴到 PowerShell 中,它就可以完成工作。 (记得改第20行的路径)
Add-Type -AssemblyName System.IO.Compression.FileSystem
function Unzip
{
param([string]$zipfile, [string]$outpath)
try {
[IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $outpath)
echo "Done with unzip of file :) "
$true
}
catch {
echo "Oops....Can't unzip the file"
$false
}
}
$flag = $true
while($flag)
{
$zipFiles = Get-LongChildItem -Path "c:\Downloads\New Folder\FI" -Recurse | Where-Object {$_.Name -like "*.zip"}
if($zipFiles.count -eq 0)
{
$flag = $false
}
elseif($zipFiles.count -gt 0)
{
foreach($zipFile in $zipFiles)
{
#create the new name without .zip
$newName = $zipFile.FullName.Replace(".zip", "")
if(Unzip $zipFile.FullName $newName){
Remove-Item $zipFile.FullName
}
}
}
Clear-Variable zipFiles
}