2016-04-14 27 views
0

Her dosya için bir dosya oluşturulduğunda her bir döngü için bir komut kümesi ayarlıyorum. Döngüde bir dosya başka bir klasöre taşınır ve aynı dosyanın 3 kez taşınması gerekiyorsa, dosyayı farklı bir tabloya taşır ve kayıt tablosunu hash tablosundan kaldırır.Powershell - Script her döngü için girilmiyor

Sorunum, komut dosyasını çalıştırdığımda, her döngü için yazdığım her şeyi yapmadığıdır. Sadece üstünde senaryo yazıyorsam. Birisi size tavsiyede bulunabilir mi?

$folder = 'C:\Users\jnwankwo\Documents\IUR Test\r' # Enter the root path you    want to monitor. 
$Failedfolder = 'C:\Users\jnwankwo\Documents\IUR Test\r' 
$filter = '*.*' # You can enter a wildcard filter here. 
$Files = @{} 
$Counter = 1 


$folder = 'C:\Users\jnwankwo\Documents\IUR Test\r' # Enter the root path you    want to monitor. 
$Failedfolder = 'C:\Users\jnwankwo\Documents\IUR Test\r' 
$filter = '*.*' # You can enter a wildcard filter here. 
$Files = @{} 
$Counter = 1 


# In the following line, you can change 'IncludeSubdirectories to $true if   required.       
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property   @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName,  LastWrite'} 

Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action { 


    ForEach ($file in $folder) 
    { 
     $fName = $file.Name 

     if (-not $Files.ContainsKey($fName)) 
     { 
      $Files.Add($fName,$Counter) 
     } 

     if (($Files.ContainsKey($fName)) -and ($Files.Item($fName) -lt 3)) 
     { 
      Move-Item 'C:\Users\jnwankwo\Documents\IUR Test\r\*.txt'  'C:\Users\jnwankwo\Documents\IUR Test' -force 
      $Files.Set_Item($fName,$Counter++) 

     } 
     ElseIf (($Files.ContainsKey($fName)) -and ($Files.Item($fName) -eq  3)) 
     { 
      $Files.clear() 
      Move-Item 'C:\Users\jnwankwo\Documents\Failed\' $Failedfolder -force 
     } 
    } 
} 

# To stop the monitoring, run the following commands: 
# Unregister-Event FileCreated 
+2

Ne '$ dosyadan veri var sağlayacak gerekir? – PetSerAl

+0

klasör değişkenini betik bloğu dışında bildirirsiniz ve '' $ folder' komut dosyası içinde boş olduğundan ($ counter' ve '$ Files' için de aynısı geçerlidir) argüman olarak aktarmazsınız. parametre olarak iletin veya scriptblock içinde ilan edin, ayrıca @AgentK ne yazdı – Paul

+0

Ne yazdığını gösterebilir misiniz? Ben şimdiye kadar farklı bir sonuç alamıyorum. – Hitmand

cevap

0

, sen :)

olsa geri klasörleri değiştirmek zorunda kalacak
$folder = 'C:\temp\test' # Enter the root path you    want to monitor. 
$filter = '*.*' # You can enter a wildcard filter here. 

# In the following line, you can change 'IncludeSubdirectories to $true if   required.       
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName,LastWrite'} 

Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action { 
$folder = 'C:\temp\test' # Enter the root path you    want to monitor. 
$Failedfolder = 'C:\temp\test3' 
$Files = @{} 
$Counter = 1 

ForEach ($file in (gci $folder)) 
{ 
    $fName = $file.Name 

    if (-not $Files.ContainsKey($fName)) 
    { 
     $Files.Add($fName,$Counter) 
    } 

    if (($Files.ContainsKey($fName)) -and ($Files.Item($fName) -lt 3)) 
    { 
     Move-Item $file.Fullname 'C:\Users\jnwankwo\Documents\IUR Test' -force 
     $Files.Item($fName) = $Counter++ 

    } 
    ElseIf (($Files.ContainsKey($fName)) -and ($Files.Item($fName) -eq 3)) 
    { 
     $Files.clear() 
     Move-Item $file.Fullname $Failedfolder -force 
    } 
} 
} 

Ekleme:

aşağıdaki kodu kullanabilirsiniz sonraki kaçan bir dosya ve yeniden ithalat bunun için Hashtable depolamak için:

#store hashtable to file 
$Files.GetEnumerator() | % { "$($_.Name)=$($_.Value)" } | Out-File files_ht.txt 

#to import again 
$Files = Get-Content files_ht.txt | Convertfrom-StringData 

Bu demek şimdi folder` Doları cinsinden hashtable kalıcı

+0

Hash tablosu her seferinde yeniden oluşturuluyor ve bu yüzden foreach döngüsünün başka bir yere ulaşması engelleniyor. Tüm değişkenler ve karma tablosu küresel olsaydı daha iyi olacağını düşünüyorum. Bunu nasıl yapacağımı söyler misin? – Hitmand

+0

@ user3162426 şudur ki, komut bloğunu bir kez verdiğinizde, her seferinde tetiklenir ve kendi bağlamında çalışır. Bir çalışmadan diğerine veri almanız gerekiyorsa, örneğin kayıt defterinde, komut dosyasının dışında saklamanız gerekir. Powershell değişkenleri, yalnızca afaik, global veya – Paul

+0

@ user3162426'da oluşturuldukları oturum kadar uzun sürdüğü sürece, ishtable'ları bir dosyadan depolamanıza ve yüklemenize izin veren bir kod ekledim. Ancak hashtabı boşalttığınızda veya problemlerle karşılaştığınızda dosyayı boşaltmayı unutmayın;) – Paul

2

Kodunuzda bir şey buldum.

Değişim ForEach ($ klasöründe $ dosyası)ForEach ((GCI $ klasöründe) 'de $ dosyası) bakalım

İlgili konular