2016-07-06 5 views
0

Ich habe den folgenden Code, um alle Dateien einschließlich derjenigen in Unterordnern aus dem Stammordner an neues Ziel zu kopieren, aber ich muss trennen sie in Gruppen und behalten die ursprüngliche Ordnerstruktur.Verschieben Sie alle Dateien aus allen Unterordnern zu neuen Ziel mit gruppenweise gruppenweise in powershell

Wenn ich es ausführen, werde ich eine Fehlermeldung erhalten, dass der angegebene Pfad, Dateiname oder beide zu lang sind. Es sieht so aus, als würde es Dateinamen und Pfade zusammenführen oder so ähnlich. Ich kann nicht herausfinden, wie ich es beheben kann.

Was mache ich falsch?

# Get List Of All Files 
$FileList1 = gci $path -recurse 

# Remove Last Slash From The Path 
$pathnoslash = $path.Substring(0,$path.Length-1) 

# Add Escape Slash To The Path For Regex 
$regexpath = $pathnoslash -replace "\\", "\\" 

# Move All Files From All Folders 
For($i=1;$i -le [Math]::Ceiling(($FileList1.count)/$NumberOfFilesPerFolder);$i++){ 
    # Get Directory Names 
    $newpath = (gci $path -recurse).DirectoryName | 

    # Replace Source Root Folder By Destination Root Folder 
    ForEach-Object { $_ -replace "$regexpath", "c:\ZIPPINGFOLDER\$i" } 

    # Move Files Form Source To Destination 
    gci $path -recurse -File | Select-Object -First $NumberOfFilesPerFolder | 
    %{$_.moveto("$newpath\$($_.name)")} 
} 
+0

'$ _ moveto ("$ newpath \ '- $ newpath ist ein Array, so etwas wie'" c:. \ Zippingfolder \ 1" ," c: \ zippingfolder \ 1 "," c: \ zippingfolder \ 1 "' und so weiter für so viele * Dateien *, wie es in Ihrem ursprünglichen Pfad ist. Und wenn Sie ihn in 'moveto' einfügen, wird er einfach in eine riesige Zeichenfolge zusammengefügt voll von sich wiederholenden Pfaden. "Was mache ich falsch?" - Ich weiß nicht genau, zufälliger Code zusammendrücken und die Finger kreuzen? Ich kann mir nicht vorstellen, dass dieser Code irgendetwas tut, was er will. – TessellatingHeckler

+0

Gut danke für das Aufzeigen Was ist los, hast du auch eine Lösung für mich? –

Antwort

0

dies für mich gearbeitet

$NumberOfFilesPerFolder = 2 
$newbase = 'c:\temp\zippingfolder' 
$path = 'c:\temp\new' 
$files = dir $path -Recurse -File 
$pathnoslash = $path.TrimEnd('\') 
$regexpath = [regex]::Escape($pathnoslash) 

$filecount = 0 
$foldernum = 0 
foreach ($file in $files) { 
    if (!($filecount % $NumberOfFilesPerFolder)) { 
     $foldernum++ 
    } 
    $filecount++ 

    $destdir = Join-Path $newbase $foldernum 

    if (!(Test-Path $destdir)) { 
     $null = md $destdir -Force 
    } 

    # if the file.txt already exists, rename it to file-1.txt and so on 
    $num = 1 
    $base = $file.basename 
    $ext = $file.extension 
    $newname = Join-Path $destdir "$base$ext" 
    while (Test-Path $newname) { 
     $newname = Join-Path $destdir "$base-$num$ext" 
     $num++ 
    } 

    move $file.fullname $newname 
} 
+0

Danke Anthony, ich habe deinen Code ausprobiert und es hat keine Ordnerstruktur in neuen Zielen erstellt, alle Dateien wurden in das Stammverzeichnis neuer Gruppenordner verschoben. –

+0

Können Sie besser erklären, was Sie tun möchten? Können Sie ein Beispiel geben, was Sie haben, ein Beispiel dafür, was Ihr Code tut, was Sie nicht wollen, und ein Beispiel für Ihr gewünschtes Ergebnis? Siehe auch: http://stackoverflow.com/help/mcve –

Verwandte Themen