2017-01-04 6 views
1

ich eine Liste von Dateien sagen ...Powershell - Erstellen Sie einen Ordner aus einem Dateinamen, legen Sie dann die Datei in dem Ordner

T123_Product_1.jpg 
T123_Product_2.jpg 
T123_Product_3.jpg 
T456_Product_1.jpg 
T456_Product_2.jpg 
T456_Product_3.jpg 

etc. etc. etc. für etwa 900 weitere Dateien

Was ich tun muss, ist einen Ordner basierend auf den Zeichen vor dem ersten Unterstrich zu erstellen, aber nicht zu wiederholen, da es mehrere Dateien gibt.

Also im obigen Beispiel würde ich nur zwei Ordner mit dem Namen T123 und T456 wollen.

Dann würde ich das Skript benötigen, um die entsprechenden Dateien in den Ordner zu legen.

Ich hatte einige Codes in diesem Thread gefunden, aber sie tun nicht genau das, wonach ich suche.

https://superuser.com/questions/306890/windows-batch-script-to-create-folder-for-each-file-in-a-directory-name-it-tha

$Files = Get-ChildItem -Path 'C:\Info\AUGUST 2011\Checklists\' -Filter 'DET1__*' 
$Files | ForEach-Object { 
    $FileFullName = $_.FullName 
    $TempFileName = "$($FileFullName).tmp" 
    $DestinationFileName = "$FileFullName\$($_.Name)" 
    Move-Item $FileFullName $TempFileName 
    New-Item -Path $FileFullName -ItemType Directory 
    Move-Item $TempFileName $DestinationFileName 
} 

Jede Hilfe?

+0

Hallo, was hast du versucht? – sodawillow

+0

Ich habe mir diesen Code angesehen, aus einem anderen Thread den ich gefunden habe, aber es ist nicht genau das. Dies ist, was dieser Code oben tut. Erstellen Sie einen Ordner mit dem Rest des Dateinamens (nach DET1__) als Titel des Ordners verschieben, die @sodawillow –

Antwort

2

Der einfachste Weg hier wäre Gruppe die Dateien durch den ersten Teil, die dann den Verzeichnisnamen werden. In typischer Powershell-Pipeline Weise ist dies ziemlich kurz und knapp:

Get-ChildItem -File | # Get files 
    Group-Object { $_.Name -replace '_.*' } | # Group by part before first underscore 
    ForEach-Object { 
    # Create directory 
    $dir = New-Item -Type Directory -Name $_.Name 
    # Move files there 
    $_.Group | Move-Item -Destination $dir 
    } 
+0

Schöne in diesen speziellen Ordner-Datei !!!!!! –

0
$directory="c:\temp\" 

#explicit and long version 
Get-ChildItem -File -Path $directory -Filter "*.jpg" | 
ForEach-Object { 
New-Item -ItemType Directory "$directory$($_.Name.Split("_")[0])" -Force; 
Move-Item -Path $_.FullName -Destination "$directory$($_.Name.Split("_")[0])\$($_.Name)"  
} 

#short version 
gci -File -Path $directory -Fi "*.jpg" | 
%{ ni -ItemType Directory "$directory$($_.Name.Split("_")[0])" -Force;mvi $_.FullName "$directory$($_.Name.Split("_")[0])\$($_.Name)" } 
0

auch versuchen.

cd <path to your folder> 
    $files = Get-ChildItem -file; 
    ForEach ($file in $files) 
    { 
    $folder = New-Item -type directory -name ($file.BaseName -replace "_.*"); 
    Move-Item $file.FullName $folder.FullName; 
    } 

Sie können auch die Substring-Methode auf dem $ File.basename verwenden.

cd <path to your folder> 
$files = Get-ChildItem -file; 
ForEach ($file in $files) 
{ 
    $fileName = $file.BaseName; 
    $folder = New-Item -type directory -name $fileName.Substring(0, $fileName.Length-10); 
    Move-Item $file.FullName $folder.FullName; 
} 

The same posted here with explanation.

Verwandte Themen