gabebu
Goto Top

Powershell - MSG-Dateien in Unterordner in einen Ordner kopieren

Hallo Zusammen

Ich habe eine Ordnerstruktur mit einer grossen Menge an MSG-Dateien, die ich gerne in einen einzelnen Ordner kopieren möchte, in dem nur noch die MSG-Dateien drin sind.

Dafür habe ich dieses Script erstellt:

#############################################################################

$SourceFile = "C:\Users\GBU101\Downloads\Mails_MSG_Empfangen_Nozip\Mails_Dietmar_Empfangen_MSG_Export\05.26.2021-1221PM\Exchange"  
Write-Host "Ich bin hier"  
$DestinationFile = "C:\Users\GBU101\Downloads\Empfangen"  
$Destinationgleich = "C:\Users\GBU101\Downloads\Empfangen\gleich"  
$check = Get-Childitem $SourceFile -recurse 
Write-Host "Jetzthier"  
$i = 0
foreach($dir in (Get-ChildItem $Sourcefile -recurse))
{


   if($check -eq $dir.name)
   {
           $dir.Name
           copy-item $dir.fullname -destination $Destinationgleich -Verbose
           $i += 1;
            
        if (-not(test-path "$destinationfile\*.msg"))  
        {
            $dir.FullName
            #copy-item $dir.fullname -destination $DestinationFile -Verbose
        }

   }
    
}
#############################################################################

Der Sinn der Sache sollte sein, dass falls eine Datei den gleichen Namen hat wie eine andere, diese Datei in einen anderen Ordner verschoben wird. Leider macht der die IF-Abfrage nicht...

seht ihr vielleicht, was ich falsch mache?

Danke für eure Hilfe.

Gruss,


GabeBU

Content-ID: 667115

Url: https://administrator.de/contentid/667115

Printed on: October 15, 2024 at 03:10 o'clock

Doskias
Doskias May 27, 2021 at 11:35:12 (UTC)
Goto Top
Moin
Zitat von @gabeBU:
Leider macht der die IF-Abfrage nicht...

Natürlich macht er die nicht. Dein $check beinhaltete alle Dateien und Verzeichnisse der Sourcfile, dein Dir.name beinhaltet lediglich einen String einer dieser Dateien/Ordner. Folglich ist deine Bedingung -eq nie erfüllt.

Gruß
Doskias
aqui
aqui May 27, 2021 updated at 11:36:24 (UTC)
Goto Top
Wäre dann nicht die hiesige Rubrik "Batch & Shell" zielführender ??
(Kann man übrigens selber über den Bearbeiten Button noch nachträglich verschieben !)
gabeBU
gabeBU May 27, 2021 at 11:36:17 (UTC)
Goto Top
Hallo Doskias

Wie könnte ich denn die Abfrage machen, damit er immer nur die nächste Datei abfragt?

Gruss,


Gabriel
Doskias
Doskias May 27, 2021 at 11:48:09 (UTC)
Goto Top
Ich hab ehrlich gesagt noch nicht ganz verstanden, was du vor hast, aber ein Paar Dinge irritieren mich an deinem Skript:

$SourceFile = "C:\Users\GBU101\Downloads\Mails_MSG_Empfangen_Nozip\Mails_Dietmar_Empfangen_MSG_Export\05.26.2021-1221PM\Exchange"
Das ist keine File sondern ein Folder.

$check = Get-Childitem $SourceFile -recurse
Ruft den Ordnerinhalt auf und die unterordnet. Willst du nur eine Datei prüfen oder einen ganzen Ordner?

Deine Zeilen 4 und 8 versteh ich jetzt auch überhaupt nicht. Was soll dieser Write-Host an der Stelle bewirken?

Ich würde wie folgt vorgehen, den Code kannst du selbst schreiben, da bin ich sicher.

1. $Dateien=get-childitem [Pfad]\*.msg
Damit hast dann alle MSG-Dateien in einer Variablen
2. For-Each ($Datei in $Dateien)
3. if test-path [zielpfad]/$datei.name copy-item zielpfad\gleich
4. else copy-item zielpfad

Dein Ansatz ist an sich richtig. Das Problem bei deiner if-Bedingung, dass du unterschiedliche Datenwerte vergleichst und das so gut wie nie (nur in einem speziellen Fall) zutreffen wird.
gabeBU
gabeBU May 27, 2021 at 12:03:49 (UTC)
Goto Top
Hallo Doskias

Die Write-Host kannst du ignorieren, das war nur zum überprüfen, wo er bei der Anfrage hängen bleibt.

Ich möchte alle MSG-Dateien in allen Ordner und Unterordner überprüfen.

1. $Dateien=get-childitem [Pfad]\*.msg

Habe ich eben versucht, das Problem ist ,dass manche Dateien noch weiter verschachtelt in einem zweiten Unterordner sind. Er hat eben damit nicht alle Dateien finden können.
Doskias
Doskias May 27, 2021 at 12:13:54 (UTC)
Goto Top
Also Code dann etwa so:

$dateien=Get-ChildItem C:\temp\Test\*.txt
foreach ($datei in $dateien)
{
$aktuelle_datei="C:\temp\Test\hier\"+$datei.name  
if (Test-Path $aktuelle_datei)
    {copy-item $datei C:\temp\test\hier\schonda\}
    else
    {copy-item $datei C:\temp\test\hier\}
}

Du musst folgendes Anpassen:
Zeile 1: natürlich dein Ordner und MSG-Dateien
Zeile 4: Dein Zielordner
Zeile 6: Dein Zielordner
Zeile 8: Dein Zielordner

Ich hatte jetzt keine Lust dafür Variablen zu deklarieren. Das Skript kopiert bei mir TXT-Dateien nach hier oder nach schonda, je nachdem ob sie in hier schon vorhanden sind. Da die Zieldateien im gleichen Ordner liegen wie die Zielordner, habe ich in Zeile 1 das -recurse weggelassen. Sonst würde er die Dateien aus den Unterordnern (wo sie ja rein kopiert werden sollen). Je nachdem wie deine Ordner aussehen musst du vielleicht mit einem recurse arbeiten.

Gruß
Doskias
148121
Solution 148121 May 27, 2021 updated at 17:09:13 (UTC)
Goto Top
Ich würde es so machen, statt zu verschieben am Ende der Datei eine eindeutige Erweiterung anbringen,
function Copy-Flat([string]$source,[string]$destination,[string[]]$Filefilter){
    gci $source -Include $FileFilter -Recurse -File | %{
        $dest = "$destination\$($_.Name)";$cnt = 1  
        while(Test-Path $dest){$dest = "$destination\$($_.Basename)_duplicate($cnt)$($_.Extension)"; $cnt++}  
        copy-item $_.Fullname -Destination $dest -verbose
    }
}

Copy-Flat -source 'C:\temp' -destination 'C:\temp\ziel' -Filefilter '*.msg'  
Das solltet ihr oben bei euren Skripten auch im Zielordner prüfen, denn dort könnte es ja u.U. auch Duplikate geben.

Gruß w.
gabeBU
gabeBU May 28, 2021 at 11:24:53 (UTC)
Goto Top
Das hat funktioniert, vielen Dank Warranty!


Gruss,


gabe