2017-02-10 5 views
0

Ich bin immer noch neu in Powershell, und ich versuche ein Programm zu erstellen, das Dateien basierend auf ihrem Namen nimmt und sie in Ordner mit einem ähnlichen Namen, aber nicht genau die verschieben gleich. Zum Beispiel, sagen wir, ich habe 3 Dateien, Apples.txt, Grapes.txt und Oranges.txt. Und ich möchte sie in entsprechende Ordner verschieben, ApplesUSA, GrapesNY, OrangesFL. Ich könnte es nur hart mit einer Schleife und einer Wenn-Dann-Anweisung codieren. Wenn Apples.txt vorhanden ist, wechseln Sie zu AppleUSA. Aber ich möchte, dass es dynamisch ist, also wenn andere Dateien und Ordner später hinzugefügt werden, muss ich den Code nicht aktualisieren. Gibt es eine Möglichkeit, eine Anweisung zu schreiben, die besagt, dass FileA und FolderB ihrem Namen nach ähnlich sind (beide enthalten Äpfel im Namen), dann fileA nach FolderB und so weiter. Jede Hilfe wird geschätzt. Vielen Dank!!!!Dateisortierung basierend auf ähnlichen Datei- und Ordnernamen

+0

In Powershell ersetzt werden, 'Get-Help About_Comparison_Operators' – user4317867

+0

Wenn Sie klar das Muster beschreiben kann, zum Beispiel "Der vollständige Dateiname stimmt mit dem Anfang des Ordnernamens überein", dann ja, von leicht bis erschöpfend - Suche nach jedem überlappenden Zeichensatz. Wenn es kein Muster gibt, das einfacher ist als Englisch zu verstehen, um die Verbindung herzustellen, dann https://xkcd.com/1425/ – TessellatingHeckler

+0

Nun, sagen Sie, 80 Prozent der Dateien sind tot auf Übereinstimmungen mit dem Ordner, wohin sie sich bewegen werden. Das ist der einfache Teil, es ist die anderen paar Dateien, die das Problem sind, aber das Muster ist das gleiche. Apples.txt bewegt sich in den Ordner ApplesUSA. Erraten Sie die Hauptfrage ist, wie mache ich einen Vergleich, der am Anfang des Dateinamens aufnehmen könnte? –

Antwort

0

versuchen so etwas wie dieses

$PathWithFile="C:\temp\Test" 
$PathWithDir="C:\temp\Test" 

Get-ChildItem $PathWithFile -file -Filter "*.txt" | %{ 
$CurrentFile=$_ 
$Dirfounded=Get-ChildItem $PathWithDir -Directory | where {$_ -match $CurrentFile.BaseName} | select FullName -First 1 
if ($Dirfounded -ne $null) 
{ 
    move-Item $CurrentFile.FullName -Destination $Dirfounded.FullName -WhatIf 
} 

} 
0

A oneliner ähnlich wie @ Esperento der

gci *.txt -af|%{$File=$_.FullName;gci "$($_.BaseName)*" -ad|%{Move $File -Dest $($_.FullName) -whatif}} 

Die ausführliche Version:

PushD "X:\path\to\base\folder" 
Get-ChildItem *.txt -File | ForEach-Object{ 
    $File = $_.FullName 
    Get-ChildItem "$($_.BaseName)*" -Directory | ForEach-Object { 
    Move-Item $File -Destination $_.FullName -whatif 
    } 
} 
PopD 

Beide Varianten erfordern Powershell V3 für die -File und -Directory Parameter (und ihre Pseudonyme -af/-ad) Dies kann durch einen zusätzlichen |Where-Object{ $_.PSIsContainer} jeweiligen | Where-Object{!$_.PSIsContainer}

Verwandte Themen