2016-11-10 4 views
1

Hey, ich muss eine Menge Dateien mit einem Powershell-Skript bewegen und ich brauche irgendwie Hilfe.Powershell finde und verschiebe Objekte

Die Wurzel ist wie folgt

> tree . 
\ 
├───Folder1 
│ ├───Sub1 
│ │ └───Stockfile 
│ └───Sub2 
└───Folder2 
    ├───Sub1 
    │ └───Stockfile 
    └───Sub2 

Das Skript die stockfiles finden muß und müssen sie in den Sub2 Ordnern jeden Hauptordner verschieben.

Ich habe das folgende Skript alle stockfiles in einer Liste anzuzeigen:

$var = get-childitem -Filter *stock* -recurse 
foreach ($file in $var) { 
write-host ($file.FullName) 
} 
+2

Ist der Name des Ordners 'Sub2' konsistent? Wie kennen Sie den Namen des Zielordners? Wird es immer explizit "Sub2" genannt? – gravity

+0

Die Ordner haben nicht den Namen Sub1 und Sub2. Es gibt 400 Ordner, die mit TM beginnen und dann 6 Zufallszahlen. –

Antwort

1

Versuchen Sie Folgendes:

Get-ChildItem -File -Recurse -Filter *_stock.csv | 
    Move-Item -WhatIf -Destination { $_.FullName -replace '^(.*)\\Sub1\\','$1\Sub2\' } 

Der Ansatz extrahiert die Pfadpräfix bis zu ...\Sub1 aus dem vollständigen Pfad jeder Aktie Datei und macht ...\Sub2 den Zielpfad (Verzeichnis).

Auf diese Weise werden die Bestandsdateien von einer beliebigen Stelle im ...\Sub1 Unterbaum direkt in ...\Sub2 verschoben.

Hinweis:

  • -WhatIf zeigt Ihnen, was würde passieren zuerst; entfernen Sie es, um den tatsächlichen Umzug durchzuführen.

  • Die Annahme ist, dass die Aktiendateipfade enthalten nur einSub1 Komponente, und dass es keine Lager-Dateien mit doppelten Namen in der Sub1 Unterstruktur.

  • -replace interpretiert seinen ersten Operanden als regulären Ausdruck, weshalb die \ Zeichen. muss als \\ maskiert werden, um als Literale erkannt zu werden; Zeichen im tatsächlichen Ordnernamen könnten auch das Entkommen erfordern (aber in diesem Fall nicht).

    • Wenn Sie nicht auf den Ordnernamen im Voraus wissen, können Sie es sicher entkommen mit [regex]::Escape($folderName)
+0

Ok, ich habe das -WhatIf entfernt, weil es zu funktionieren scheint. Aber ohne die WhatIf-Anweisung bekomme ich die folgende Nachricht: –

+0

Move-Item: Es konnte kein Teil des Pfades gefunden werden. [Move-Item], DirectoryNotFoundException + FullyQualifiedErrorId: MoveFileInfoItemIOError, Microsoft.PowerShell.Commands.MoveItemCommand –

+0

Ok, es funktioniert jetzt, die nächste Herausforderung besteht darin, Dateien aus Ordnern zu verschieben, die mit TM * beginnen. Also die Ordnernamen sind wie TM123456, TM456789 und so weiter. In diesen Ordnern befinden sich die 2 Unterordner. Wie verschiebe ich Dateien aus Ordnern, die mit TM beginnen? –

1

Ordner alle sub1 und sub2 genannt werden wird angenommen.

$var = get-childitem -Filter *stock* -recurse 
foreach ($file in $var) { 
    $parent = Split-Path $file.fullname -parent 
    Move-Item $file.FullName -destination $parent\..\sub2\1.txt 
} 

Ich weiß, das ist nicht schön, aber es funktioniert;)

0

Ich habe es auf diese Weise arbeiten, vielen Dank.

$var = get-childitem -Filter *_stock.csv -recurse 
foreach ($file in $var) 
{ Move-Item $file.FullName ($file.FullName -replace '^(.*)\\Sub1\\','$1\Sub2\') } 
+1

Dies ist im Wesentlichen die Lösung, die ich vorgeschlagen habe, und da meine Antwort prägnanter ist und auch eine Erklärung bietet, akzeptiere meine Antwort und entferne diese. Erlauben Sie mir, Ihnen den Standardratschlag für Neulinge zu geben. Wenn eine Antwort Ihr Problem löst, akzeptieren Sie es, indem Sie auf das große Häkchen (✓) daneben klicken und es optional auch nach oben abstimmen (Up-Voting erfordert mindestens 15 Reputationspunkte). Wenn Sie andere Antworten hilfreich fanden, stimmen Sie sie bitte ab. Akzeptieren und Up-Voting hilft zukünftigen Lesern. Weitere Informationen finden Sie in [dem entsprechenden Hilfeartikel] (http://stackoverflow.com/help/someone-answers). – mklement0

Verwandte Themen