2013-07-16 56 views
5

我需要在PowerShell中的列表中創建每個目錄的.zip。由於某種原因,我不知道如何更改爲每個目錄來運行相對於該路徑的命令。使用PowerShell在列表中的每個目錄上運行命令

這裏是我的情況:

$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不會返回任何內容。它實際上並沒有枚舉變量屬性中包含的目錄路徑,而是試圖列出包含在該值中的項目,當然這些項目是空的。

什麼給?我該怎麼做呢?

+0

因此,我在另一個論壇中發現了另一種方法。我基本上需要將我的目錄導航功能與我的命令構建分離開來,並且我正在推翻一些東西。事實上,我忘記了通過數組遞歸的ForEach($ var in $ vars)方法。 http://sourceforge.net/p/sevenzip/discussion/45797/thread/49a7a85b/ – FoxDeploy

+0

爲了讓您的zip調用tidier使用別名: Set-Alias sz「C:\ Windows \ 7za.exe」; sz A -tzip「$($ _。Name).rar」$ _。Path –

回答

9

您不需要設置位置,只需提供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 
} 
相關問題