Toplu iş, tüm zip arşivlerini alt dizinlerde açar; her arşivin içeriği, arşivden sonra adlandırılan yeni dizine


4

Bir ton alt klasör içeren bir klasörüm var, bu alt klasörlerin içinde sıkıştırılmış dosyalar var.

Bu dosyaları zip dosyasından sonra adlandırılan bir klasöre nasıl açacağınızı merak ediyordum. Örneğin:

C:\Archives\Photos\A.zip
C:\Archives\Videos\B.zip
C:\Archives\Documents\C.zip

dönüşürdü

C:\Archives\Photos\A\
C:\Archives\Videos\B\
C:\Archives\Documents\C\

Bunu şu anda yapabilirim, ancak sadece bir kerede bir klasör yaparsam, hepsini bir kerede yapmanın bir yolu olup olmadığını merak ediyordum, bir .bat dosyası düşünüyordum.

Yanıtlar:


2
@Echo off
For %%F in (Photos,Videos,Documents) Do (
    For /F "delims=" %%Z in ('Dir /B/S/A-D "C:\Archives\%%F\*.zip" 2^>Nul') Do (
        7z x "%%~fZ" -o"%%~dpnZ\" && Rem Del "%%~fZ"
    )
)

Sıkıştırılmış dosyayı bir kez başarılı bir şekilde açtıktan sonra çıkarmak istiyorsanız Rem, del.

Toplu iş , tam dosya adının yalnızca bölümlerini kullanmak için değişken ~ değiştiricileri için kullanır.


1

Bunu elde etmek için bir PowerShell tek astar:

Get-ChildItem -Filter *.zip -Recurse C:\Archives | % { $_.FullName } | Split-Path | Get-Unique | % { cd $_ ; &'C:\Program Files\7-Zip\7z.exe' x *.zip -o* }

Bir sonraki bölüme aktarılan ve böylece Powershell tarafından sırayla gerçekleştirilen her bölümün açıklaması:

  • Get-ChildItem -Filter * .zip -Recurse C: \ Archives : C: \ Archives altındaki tüm zip dosyalarını bul
  • % {$ _. FullName} : sonuçta ortaya çıkan nesne için, tam yolu ve adı göster
  • Bölünmüş Yol : Her bir sıkıştırmanın yalnızca yolunu (dosya adını değil) gösterir.
  • Benzersiz Eşitlik : listeden kopyaları kaldır
  • % {cd $ _; & 'C: \ Program Files \ 7-Zip \ 7z.exe' x * .zip -o *} : Son olarak, bulunan her bir dizine geçmek için oluşturulan listeyi kullanın; Her dizinde bulunan tüm zip dosyalarını açmak için 7z.exe aracını kullanın, -o * argümanıyla, her bir zip dosyasının içeriğini bu zip dosyasının adını içeren bir dizine sıkıştırın

Varsayımlar:

  • C: \ Archives, tüm zip dosyalarınızın depolandığı dizindir.
  • 7 Zip'iniz varsayılan konuma kurulur

Bu soruyu araştırırken, PowerShell'e göre bash'ı tercih ettiğim sonucuna vardım :-)


Ben 6 komut artı 7z sayıyorum. Ve verilen klasörlerle sınırlı değilsiniz. Posta isimleri A, B, C alıntı yapmaya ihtiyaç duymayacak ama asla bilemeyeceksin. gci C:\Archives\*.zip -r|%{&'7z.exe' x $_.FullName -o$_.Directory+$_.BaseName }ayrıca yapardı.
LotPings,

Yalnızca 7z komutu diskteki her şeyi değiştirir. Diğerleri son 7z komutuna aktarılır. Cevabımı, semantik gözleminizi yansıtmak için "tek bir PowerShell komutu" ndan "bir PowerShell tek astar" a çevirdim. Orijinal soruda üst düzey C: \ Archives \ dışında "verilen klasörlerle kısıtlama" hakkında bir şey görmedim, bu yüzden bunu denemedim. Ya "bir ton alt klasör", "üç alt klasör" anlamına gelir ya da örnek klasörlerle kısıtlamama konusunda haklıydım.
FosseWay

@FosseWay Komut dosyasını çalıştırmayı denedim ve aşağıdaki hatayı almaya devam ediyorum: Get-ChildItem: '%' argümanını kabul eden konumsal bir parametre bulunamıyor. Satırda: 1 karakter: 1 + Get-ChildItem -Filter * .zip -Recurse H: \ Literature \ Sıralamaya% {$ _. Fu ... + ~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~ + CategoryInfo: InvalidArgument: (:) [Get-ChildItem], ParameterBindingException + FullyQualifiedErrorId: PositionalParameterNotFound, Microsoft.PowerShell.Commands.GetChildItemCommand
Chris Jackson

Bunu duyduğuma üzüldüm, @ Chris Jackson. Sadece Get-ChildItem -Filter *.zip -Recurse C:\Archiveskendi başına koşarsan ne olur ?
FosseWay
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.