使用PowerShell在列表中的每个目录上运行命令

时间:2013-07-16 17:36:26

标签: powershell recursion

我需要在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什么都不返回。它实际上并不是枚举变量属性中包含的目录路径,而是尝试列出该值中包含的项目,这些项目当然是空的。

给出了什么?!我该怎么做?

2 个答案:

答案 0 :(得分:14)

您无需设置位置,只需提供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
}

答案 1 :(得分:0)

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

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}