我有一个包含多个子文件夹的文件夹。每个子文件夹可能/可能不包含一些* .ZIP文件。
我正在尝试将每个zip文件解压缩到与原始zip文件同名的单独文件夹中(如果存在则覆盖文件夹),然后删除存档。
但是我从下面的代码得到的是提取父目录中的所有ZIP文件,这不是我想要的。
这是我的代码:
foreach ($file in (dir -recurse *.zip)) { & "c:\Program Files\7-zip\7z" x "$file" -aoa }; rm dir -recurse *.zip
有人可以帮我这个吗?
答案 0 :(得分:1)
您正在进行字符串扩展。做以下练习,以了解这一点。
$r = Get-ChildItem c:\Windows\System32\cmd.exe
"$r"
$r.FullName
以下代码应解决您的问题
foreach ($file in (dir -recurse *.zip)){
& "c:\Program Files\7-zip\7z" x $file.FullName -aoa
}
rm dir -recurse *.zip
答案 1 :(得分:1)
我刚刚找到了我的问题的完美答案,我愿意在这里发布给所有遇到此问题的人。
我有几个问题。其中一个是处理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
}