2016-04-13 8 views
0

Ich versuche, einen Ordner durchzulaufen, den Dateinamen jeder Datei in dem Ordner abzurufen und diesen Dateinamen dann einer Variablen zuzuweisen. Ich würde dann diese Variable später in einer Hash-Tabelle verwenden. Dies ist, wo ich das Problem habe und halte diese Fehler empfangen:Powershell - Fehlender Attributfehler beim Zuweisen von Dateinamen zu einer Variablen mit einem für jede Schleife

At C:\Users\jnwankwo\Documents\IUR.ps1:19 char:16 
+ Files.Add(fName, Counter) 
+    ~ 
Missing argument in parameter list. 

Hier ist der Code:

$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 (Files.ContainsKey(fName) = false) 
{ 

Files.Add(fName, Counter) 

} 

if ((Files.ContainsKey(fName) = true) -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) = true) -and (Files.Item(fName) == 3)) 
{ 
Files.Remove(fName) 
Move-Item C:\Users\jnwankwo\Documents\IUR Test\r\*.txt Failedfolder -force 
} 

} 

} 

Kann jemand bitte helfen?

Antwort

1

Ihnen fehlen die $ vor den Variablen. So ersetzen Sie alle fName durch $fName. Sie müssen auch file.Name in $file.Name umbenennen. Sie vermissen auch eine $ auf Counter in Files.Add($fName, Counter) und Sie haben $false zu schreiben statt false ....

Dies ist die feste Version sein sollte:

$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.Remove($fName) 
      Move-Item 'C:\Users\jnwankwo\Documents\IUR Test\r\*.txt' $Failedfolder -force 
     } 
    } 
} 
+0

Hallo, habe ich versucht, diese und ich bekomme jetzt diesen Fehler: Fehlender Ausdruck nach ‚‘ – Hitmand

+0

ich meine Antwort aktualisiert –

0

Yep, wie jisaak sagte, man verpasst hatte die Variablen mit den Ausdrücken dazu.

so könnte das Problem durch Ersetzen aller Deklarationen durch Variablen behoben werden.

Auch eine weitere Sache, wenn Sie versuchen, eine Powershell-Skript das nächste Mal zu erstellen, versuchen PSDebug Cmdlets Ihre Skripte zu debuggen. Es kommt sehr praktisch. Ich finde es sehr nützlich.

Fügen Sie einfach den folgenden Code hinzu, bevor Sie Ihr Skript ausführen, oder oben im Skript.

Set-PSDebug Trace- 1