12

我需要在 PowerShell 的列表中为每个目录制作一个 .zip。我出于某种原因无法弄清楚如何更改到每个目录以运行相对于该路径的命令。

这是我的情况:

$dir = Get-ChildItem d:\directory | ? {$_.PSIsContainer}

$dir | ForEach-Object {Set-Location $_.FullName;
Invoke-Expression "7z.exe A" +  $_.Name + ".rar " + $_.Path + "\"}

该命令很丑陋,但由于 7Zip 似乎解析文本的方式,我不得不这样做。我相信该命令应该在每个目录中创建一个 ZIP 文件,名称设置为与目录名称相同,并包含目录中的所有文件。

尽管出于某种原因我什至无法访问对象的值,但似乎我陷入了某种 PowerShell 地狱。

例如,如果我回显 $dir,我会看到我的目录列表。但是,如果我尝试

gci $dir[1]

PowerShell 什么也不返回。它实际上并没有枚举变量属性中包含的目录路径,而是试图列出该值中包含的项目,这当然是空的。

是什么赋予了?!我该怎么做呢?

4

2 回答 2

22

您无需设置位置,只需提供 7z.exe 的路径即可。另外,7zip 不压缩成 Rar,只解压缩。

$dir = dir d:\directory | ?{$_.PSISContainer}

foreach ($d in $dir){
    $name = Join-Path -Path $d.FullName -ChildPath ($d.Name + ".7z")
    $path = Join-Path -Path $d.FullName -ChildPath "*"

    & "C:\Program Files\7-Zip\7z.exe" a -t7z $name $path
}
于 2013-09-06T14:36:54.327 回答
3

如果您不想在压缩后删除日志,请注释掉第 3 行

function zip-log {
    Compress-Archive *.log Logs.zip 
    Get-Item *.log | Remove-Item -Force 
    }

$dir = Get-ChildItem d:\directory| ? {$_.PSIsContainer}
$dir | ForEach-Object {Set-Location $_.FullName; zip-log}
于 2020-03-29T20:13:11.770 回答