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:
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
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
Please also mark the comments that contributed to the solution of the article
Content-ID: 667115
Url: https://administrator.de/contentid/667115
Printed on: October 15, 2024 at 03:10 o'clock
8 Comments
Latest comment
Moin
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
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
Ich hab ehrlich gesagt noch nicht ganz verstanden, was du vor hast, aber ein Paar Dinge irritieren mich an deinem Skript:
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.
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.
$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.
Also Code dann etwa so:
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
$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
Ich würde es so machen, statt zu verschieben am Ende der Datei eine eindeutige Erweiterung anbringen,
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.
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'
Gruß w.