Powershell: Dosya adından inital karakter dizisini alın ve dizeden dizin oluşturun, ardından dosyaları taşıyın


6

Aşağıdaki dosya adlarına sahip bir klasörüm var:

00150005D201110172338427995.vpf
00150005D201110180005318058.vpf
00150013D201110180014448082.vpf
00150013D201110180022268098.vpf
00150013D201110180056118137.vpf
00150004D201110180102008142.vpf
00150004D201110180105398145.vpf
00150016D201110180115378151.vpf
00150016D201110180122168161.vpf
00150003Z201110180143308169.vpf
00150050S201110180232190009.vpf

Her dosya, benzersiz bir tanımlayıcı olan 9 karakterli bir dize ile başlar. Her klasör için bu klasörleri trhouhg ile parslayabilmeyi ve 9 karakter önekini temel alarak önek adıyla bir klasör oluşturmayı ve ardından dosyaları yeni oluşturulan klasöre taşımayı isterim.

Örnek:

Önce:

f:\ION\2011291 Contains the following files
00150005D201110172338427995.vpf
00150005D201110180005318058.vpf
00150013D201110180014448082.vpf
00150013D201110180022268098.vpf
00150013D201110180056118137.vpf
00150004D201110180102008142.vpf
00150004D201110180105398145.vpf
00150016D201110180115378151.vpf
00150016D201110180122168161.vpf
00150003Z201110180143308169.vpf
00150050S201110180232190009.vpf

Sonra:

F:\ION\2011291 contins only folders no files 
F:\ION\2011291\00150005D contains
  00150005D201110172338427995.vpf
  00150005D201110180005318058.vpf
F:\ION\2011291\00150013D\ contains
  00150013D201110180014448082.vpf
  00150013D201110180022268098.vpf
  00150013D201110180056118137.vpf
F:\ION\2011291\00150004D \contains
  00150004D201110180102008142.vpf
  00150004D201110180105398145.vpf
F:\ION\2011291\00150016D\ contains
  00150016D201110180115378151.vpf
  00150016D201110180122168161.vpf
F:\ION\2011291\00150003Z\ contains
  00150003Z201110180143308169.vpf
F:\ION\2011291\00150050S
  00150050S201110180232190009.vpf

Parametreler:

  1. Bunu Powershell'de yapmam gerekiyor
  2. Bu okumanın nasıl başarılacağına, gerçek senaryo yazımında daha fazla okuyabileceğim veya hatta bazı rehberlere yer verebileceğim yönü çok takdir ediyorum.

Yanıtlar:


6

Bu komut dosyası işi yapmalı:

dir | %{ 
    $id = $_.Name.SubString(0,8); 
    if(-not (Test-Path $id)) {mkdir $id}; 
    mv $_ "$id\$_";}

Açıklama:

dizindeki foreach dosyası (% foreach için takma addır):

  • Kimliği ilk 9 karakterden al. $ _ Değişkeninin, geçerli dosyayı temsil eden powershell tarafından doldurulan otomatik bir değişken olduğunu unutmayın. Nesnenin Name özelliği , ilgilendiğiniz dosya adının bir kısmını döndürmek için kullanabileceğiniz SubString üye işlevine sahip bir .NET String nesnesi döndürür .
  • "İd" dizininin mevcut olup olmadığını kontrol edin. Olmazsa oluşturun (mkdir Yeni Öğe için bir takma addır).
  • Sonra dosyayı dizine taşıyın (mv, Move-Item için bir takma addır). Powershell, çift tırnaklı bir dizgenin içinde bir değişken gördüğünde, değerini otomatik olarak ortaya çıkan dizgeye genişlettiğini unutmayın.

Verdiğim örneğin, dosyalarınızın bulunduğu dizinden çalıştırdığınızı varsaydığını unutmayın.


mkdir takma isim değil bir fonksiyondur.
Helge Klein

1

Böyle bir şey yapabilirsin:

$Directory = "f:\ION\2011291";
$AllFiles = Get-ChildItem $Directory | where {$_.extension -eq ".vpf"};
$FileNames = New-Object System.Collections.ArrayList;
foreach($File in $AllFiles) 
{
    $FileNames.Add($File.Name.SubString(0,9));  
}
$UniqueNames = $FileNames | get-unique;
foreach($Name in $UniqueNames)
{
    New-Item $Directory\$Name -type directory
}
foreach($File in $AllFiles)
{
    $Dir = $File.Name.SubString(0,9);        
    Move-Item $Directory\$File $Directory\$Dir\$File;
}

Açıklama:

  1. Öncelikle $Directory".vdf" uzantılı tüm dosyaları bulun.
  2. Tüm dosya adlarından ilk 9 harfi bir $FileNames
  3. Her bir benzersiz adı $FileNamesiçine kaydet$UniqueNames
  4. İsimlerdeki yeni dizinleri oluşturun. $UniqueNames
  5. Her dosyayı ilk 9 karaktere göre ilgili dizine taşıyın

Komut dosyası her zaman dosyaların depolandığı dizinde çalıştırılacaksa ve uzantıya filtre uygulamak istemiyorsanız, daha kompakt ve zarif bir çözüm için @zdans yanıtına bakın.


Biraz rehberlik eder misiniz?
Tamara Wijsman,
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.