2016-03-28 5 views
1

Ich möchte eine Schleife für mein Programm verwenden, um die Dateinamen nur der .dll im Ordner und Unterordner dieses Verzeichnisses packt. Es durchsucht dann einen angegebenen Speicherort/Pfad für eine .dll mit demselben Dateinamen, und wenn es existiert, ersetzt es es. Bis jetzt kopiert mein Programm alle Dateien von einem Ort zum anderen und sobald sie kopiert sind, brauche ich das oben genannte, um ausgearbeitet zu werden.Powershell Schleife durch Ordner, Suche nach Dateinamen und Speicherort dann ersetzen

Mein größtes Problem ist Wie suchen Sie nach Dateinamen in einer Schleife an einem bestimmten Speicherort und wenn es existiert, ersetzen Sie es? Der folgende Code ist lokal an zufälligen Orten, bevor ich die richtigen Pfade mit Servern und anderen Laufwerken einstelle.

#sets source user can edit path to be more precise 

$source = "C:\Users\Public\Music\Sample Music\*" 

#sets destination 

$1stdest = "C:\Users\User\Music\Sample Music Location" 

#copies source to destination 

Get-ChildItem $source -recurse | Copy-Item -destination $1stdest 

#takes 1stdest and finds only dlls to variable 

#not sure if this is right but it takes the .dlls only, can you do that in the foreach()? 

Get-ChildItem $1stdest -recurse -include "*.dll" 

Antwort

1

Hier gehen Sie, werden Sie in Ihren Pfaden wieder bearbeiten müssen. Beachten Sie auch, dass $1stDest geändert wurde die Liste der Dateien im Zielordner aufzuzählen. Die Logik durchläuft alle Dateien in $ source und sucht nach einer Übereinstimmung in $1stDest. Wenn es welche findet, speichert es sie in $OverWriteMe. Der Code durchläuft dann jede zu überschreibende Datei und kopiert sie.

Wie geschrieben, verwendet es -WhatIf, so dass Sie eine Vorschau dessen haben, was passieren würde, bevor es ausgeführt wird. Wenn Sie mögen, was Sie sehen, entfernen Sie die -WhatIf auf der Leitung 15.

$source = "c:\temp\stack\source\" 

#sets destination 

$1stdest = get-childitem C:\temp\stack\Dest -Recurse 

#copies source to destination 

ForEach ($file in (Get-ChildItem $source -recurse)){ 

    If ($file.BaseName -in $1stdest.BaseName){ 
     $overwriteMe = $1stdest | Where BaseName -eq $file.BaseName 
     Write-Output "$($file.baseName) already exists @ $($overwriteMe.FullName)" 
     $overwriteMe | ForEach-Object { 
      copy-item $file.FullName -Destination $overwriteMe.FullName -WhatIf 
      #End of ForEach $overwriteme 
      } 

     #End Of ForEach $file in ... 
     } 


} 

OutPut

1 already exists @ C:\temp\stack\Dest\1.txt 
What if: Performing the operation "Copy File" on target "Item: C:\temp\stack\source\1.txt Destination: C:\temp\stack\Dest\1.txt". 
5 already exists @ C:\temp\stack\Dest\5.txt 
What if: Performing the operation "Copy File" on target "Item: C:\temp\stack\source\5.txt Destination: C:\temp\stack\Dest\5.txt". 
+0

Es ist ein Fehler mit dem Code oben. "Sie müssen einen Wertausdruck auf der rechten Seite des '-' Operators angeben." Wie würde ich das beheben? – user6124417

+0

Versuchen Sie, es erneut zu kopieren, ich denke, ich hatte vorher einen zusätzlichen Platz. Wenn es weiterhin fehlschlägt, antworten Sie auf diesen Thread mit einem Pastebin-Link zu Ihrem genauen Code und ich werde Ihnen helfen, es herauszufinden. – FoxDeploy

Verwandte Themen