PowerShell Inhalt in Textdatei umlenken
Windows Server 2008 Enterprise R2
Exchange 2010
Hi,
ich importiere gerade ein paar PST Dateieien in ein Postfach.
Dann holt unsere E-Mail Archivierungssoftware die Mails ab und löscht sie.
Danach wird wieder eine PST imporiert . . . usw. . . .
Nun möchte, dass die PowerShell mir ein Logfile ausgibt.
Als Batch würde ich einfach in eine Datei umlenken
aber in der Shell bekomm ich das Ergebnis des Imports nicht in eine Textdatei umgelenkt.
Wie kann ich mir so ein Logfile von der Shell erstellen lassen?
Freue mich über jede Rückmledung.
Grüße
Tray
Exchange 2010
Hi,
ich importiere gerade ein paar PST Dateieien in ein Postfach.
Import-Mailbox -Identity Migration -PSTFolderPath "D:\PST-Import\PST01.pst" -AllowDuplicates
Dann holt unsere E-Mail Archivierungssoftware die Mails ab und löscht sie.
Danach wird wieder eine PST imporiert . . . usw. . . .
Nun möchte, dass die PowerShell mir ein Logfile ausgibt.
Als Batch würde ich einfach in eine Datei umlenken
Ping 10.10.10.10 >> "test-ext"
aber in der Shell bekomm ich das Ergebnis des Imports nicht in eine Textdatei umgelenkt.
Wie kann ich mir so ein Logfile von der Shell erstellen lassen?
Freue mich über jede Rückmledung.
Grüße
Tray
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 144791
Url: https://administrator.de/forum/powershell-inhalt-in-textdatei-umlenken-144791.html
Ausgedruckt am: 08.04.2025 um 15:04 Uhr
64 Kommentare
Neuester Kommentar
Hi,
mit dem Befehl den ich dir oben gegeben habe wir automatisch die Datei erweitert.
Du importierst doch die PST Dateien mit einer Schleife oder ????
Innerhalb der Schleife musst du dann einfach die Log Datei erstellen, das machst du wie oben nur das du im Dateinamen eine Variable drin hast (z.B. ein Zahler),
so wird pro importierte PST Datei ein Log Datei erstellt.
In diesem Beispiel werden 5 Dateien angelegt in der das Ergebnis von ping an heise.de hineingeschrieben werden.
Du müsstest es nur so umbauen das die liste der zu importierenden Dateien durchlaufen wird.
Gruß Miyamoto
mit dem Befehl den ich dir oben gegeben habe wir automatisch die Datei erweitert.
Du importierst doch die PST Dateien mit einer Schleife oder ????
Innerhalb der Schleife musst du dann einfach die Log Datei erstellen, das machst du wie oben nur das du im Dateinamen eine Variable drin hast (z.B. ein Zahler),
so wird pro importierte PST Datei ein Log Datei erstellt.
In diesem Beispiel werden 5 Dateien angelegt in der das Ergebnis von ping an heise.de hineingeschrieben werden.
for($i=1;$i -le 5;$i++){
Ping www.heise.de | out-file -filepath "d:\ping$i.txt" -encoding Default -Append
}
Gruß Miyamoto
eine frage hast du schon mal mit Powershell gearbeitet????
du kannst dir mal diesen Artikel durchlesen in dem findest du die Grund legenden Sachen von Powershell
Klick mich
Eine Variable erstellst du so:
du kannst dir mal diesen Artikel durchlesen in dem findest du die Grund legenden Sachen von Powershell
Klick mich
Eine Variable erstellst du so:
$var = "Inhalt"
Da ich ein netter Mensch bin habe ich dir schon mal den Anfang gebastelt 
Du musst nur die Dateiendung in Zeile 10 ändern, damit deine PST-Dateien aufgelistest werden.
Wichtig ist bei der Eingabe des Pfades das du immer ein "\" (natürlich ohne "") eingibst.
Du musst das Skript nur noch um deinen Code erweitern, dein Code kommt in die "foreach" Schleife
Bei fragen frag einfach 
Du musst nur die Dateiendung in Zeile 10 ändern, damit deine PST-Dateien aufgelistest werden.
Wichtig ist bei der Eingabe des Pfades das du immer ein "\" (natürlich ohne "") eingibst.
Du musst das Skript nur noch um deinen Code erweitern, dein Code kommt in die "foreach" Schleife
#Variablen
$pfad=""
$pfad = Read-Host "Bitte geben Sie den Dateipfad ein, wo die PST-Dateien liegen:"
if ((test-path $pfad) -and (($pfad.Chars($pfad.Length-1) -eq '\') -or ($pfad.Chars($pfad.Length-1) -eq '/') )){
Write-Host "Der Pfad ist ok"
$pst_daten=Get-ChildItem -Path $pfad -Name -Include *.txt
foreach ($i in $pst_daten){
Write-Host $i
}
} else{
Write-Host 'Ungültiger Pfad' -ForegroundColor Red
}
Hi,
ja in der Variable $pfad steht der Pfad den man eingeben muss.
Du brauchst nicht den ganzen Pfad (z.B. d:\Test\Import.pst ) angeben sondern nur das Verzeichnis in der die Datei sich befindet (z.B. d:\Test\ ).
So brauch man nicht jede Datei Einzelt angeben.
Die abfrage die ich gemacht habe prüft als erstes ob der Pfad auch wirklich existiert dann wird geschaut ob eine / oder ein \ das letzte Zeichen ist.
Wenn das alles zu trifft, wird ein dir gemacht, das Ergebnis wird in die Variable $pst_daten gepackt.
Die schleife läuft so oft durch wie es Dateien, in dem Verzeichnis gibt die die Endung pst haben.
Und dann kommen ja auch schon deine Anweisungen.
ja in der Variable $pfad steht der Pfad den man eingeben muss.
Du brauchst nicht den ganzen Pfad (z.B. d:\Test\Import.pst ) angeben sondern nur das Verzeichnis in der die Datei sich befindet (z.B. d:\Test\ ).
So brauch man nicht jede Datei Einzelt angeben.
Die abfrage die ich gemacht habe prüft als erstes ob der Pfad auch wirklich existiert dann wird geschaut ob eine / oder ein \ das letzte Zeichen ist.
Wenn das alles zu trifft, wird ein dir gemacht, das Ergebnis wird in die Variable $pst_daten gepackt.
Die schleife läuft so oft durch wie es Dateien, in dem Verzeichnis gibt die die Endung pst haben.
Und dann kommen ja auch schon deine Anweisungen.
#Variablen
$pfad = Read-Host "Bitte geben Sie den Dateipfad ein, wo die PST-Dateien liegen:"
if ((test-path $pfad) -and (($pfad.Chars($pfad.Length-1) -eq '\') -or ($pfad.Chars($pfad.Length-1) -eq '/') )){
Write-Host "Der Pfad ist ok"
$pst_daten=Get-ChildItem -Path $pfad -Name -Include *.pst
foreach ($i in $pst_daten){
Write-Host "$pfad$i"
# Disable-Mailbox -Identity "Migration"
# Enable-Mailbox -Identity "Migration"
Import-Mailbox -Identity "Migration" -PSTFolderPath "$pfad$i" -AllowDuplicates
Move-Item "D:\Microsoft\Exchange Server\V14\Logging\MigrationLogs\*.*" -destination "D:\PST-Import\Logs"
}
} else{
Write-Host 'Ungültiger Pfad' -ForegroundColor Red
}
Klar geht das du musst das nur innerhalb der "foreach" Schleife machen.
Ich würde es den so machen
mit Copy:
oder Rename:
Gruß Miyamoto
Ich würde es den so machen
mit Copy:
Move-Item "D:\Microsoft\Exchange Server\V14\Logging\MigrationLogs\*.*" -Destination "D:\PST-Import\PST-Files\$i.txt"
Rename-Item -Path "D:\Microsoft\Exchange Server\V14\Logging\MigrationLogs\*.*" -NewName "$i.text"
Gruß Miyamoto
Hi,
du möchtest doch schauen ob der Prozess läuft oder gar nicht gelaufen ist oder???
wenn du dir sicher bist das der Prozess läuft, davon gehe ich mal aus, den du kannst das so machen:
so musst du nicht zu 100% den Richtigen Prozess Namen angeben.
Mann muss nur drauf achten das es wirklich nur ein Prozess gibt mit den Namen ansonsten könnte es Probleme geben.
Edit: es ist egal was der Task-Manager anzeigt, wichtig ist nur was Get-Process anzeigt
Gruß Miyamoto
du möchtest doch schauen ob der Prozess läuft oder gar nicht gelaufen ist oder???
wenn du dir sicher bist das der Prozess läuft, davon gehe ich mal aus, den du kannst das so machen:
$p = Get-Process java* # Hier steht der Prozessname
if ($p)
{
$p.WaitForExit()
Write-Host "| Der Mail-Import wurde beendet! |" -ForegroundColor Yellow
}
else
{
Write-Host "| Der Mail-Import wurde nicht gestartet |" -ForegroundColor Yellow
}
Mann muss nur drauf achten das es wirklich nur ein Prozess gibt mit den Namen ansonsten könnte es Probleme geben.
Edit: es ist egal was der Task-Manager anzeigt, wichtig ist nur was Get-Process anzeigt
Gruß Miyamoto
Also, nein es hat keine Auswirkungen auf den Code, wenn du Zeilen löscht die du eh auskommentiert hast.
Es ist einfach nur schöner, wenn man nach einiger zeit sich das Skript anschaut. Es kommen sonst zu solchen Gedanken wie, warum habe ich das mal geändert, wenn nun die Zeilen nicht mehr drine stehen den kommt man nicht auf die Gedanken.
Das was du nicht bedacht hast, das habe ich doch schon bedacht.
Du gibst ja bei Start ein Verzeichnis ein, die Schleife läuft so lange wie Dateien existieren mit der Endung .pst
z.B. wenn 2 Dateien(a.pst und b.pst) im Verzeichnis liegen den wird die Schleife genau 2 mal durchlaufen einmal für Datei 1 (a.pst) und einmal für Datei 2 (b.pst)
die Variable $i beinhaltet beim schleifen Durchlauf 1 a.pst und beim schleifen Durchlauf 2 b.pst
Oder habe ich dein Problem nicht richtig verstanden???
Gruß Miyamoto
Es ist einfach nur schöner, wenn man nach einiger zeit sich das Skript anschaut. Es kommen sonst zu solchen Gedanken wie, warum habe ich das mal geändert, wenn nun die Zeilen nicht mehr drine stehen den kommt man nicht auf die Gedanken.
Das was du nicht bedacht hast, das habe ich doch schon bedacht.
Du gibst ja bei Start ein Verzeichnis ein, die Schleife läuft so lange wie Dateien existieren mit der Endung .pst
z.B. wenn 2 Dateien(a.pst und b.pst) im Verzeichnis liegen den wird die Schleife genau 2 mal durchlaufen einmal für Datei 1 (a.pst) und einmal für Datei 2 (b.pst)
die Variable $i beinhaltet beim schleifen Durchlauf 1 a.pst und beim schleifen Durchlauf 2 b.pst
Oder habe ich dein Problem nicht richtig verstanden???
Gruß Miyamoto
Jap oder du arbeitest mit einem rekursive Durchlauf.
Das würde den so aussehen:
Ich habe in Zeile 32 Folgendes angehängt
nun muss man nur noch den Obersten Ordner angeben.
Edit: sprich
Das würde den so aussehen:
#
# Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010 << Aufruf von der PowerShell zur Exchange Management Shell
#
#################################################
# Ausgangspunkt ist ein User mit einem Postfach #
#################################################
# Variablen werden definiert.
$pfad=""
# $datei=""
# Benutzer wird aufgefordert die Variable mit dem Pfad zu füllen.
$pfad = Read-Host "Bitte geben Sie den Dateipfad ein"
# Benutzer wird aufgefordert die Variable mit dem Dateinamen zu füllen.
# $datei = Read-Host "Bitte geben Sie den Dateinamen ein"
# Überprüfung ob der Pfad im Filesystem mit dem eingegebenen Pfad übereinstimmt.
if (test-path $pfad)
# Überprüfung ob der Dateiname im Filesystem mit dem eingegebenen übereinstimmt.
# if ((test-path $datei) -and . . .)
{
Write-Host ""
Write-Host "-------------------------------------" -ForegroundColor Blue
Write-Host "| Der Pfad ist okay! |" -ForegroundColor Yellow
Write-Host "-------------------------------------" -ForegroundColor Blue
Write-Host ""
#$pause = Read-Host "PAUSE"
# Inhalt des Ordners und Name der PST-Datei im Filesystem werden ausgelesen und in eine weitere Variable geschrieben.
$pstdaten=Get-ChildItem -Path $pfad -Name -Include *.pst -Recurse
# Schleife führt den Importvorgang durch und startet das Archivierungsprogramm.
foreach ($i in $pstdaten)
{
# Postfach wird deaktiviert.
Disable-Mailbox -Identity "Migration" -Confirm:$false
Write-Host "| Postfach wurde deaktiviert |" -ForegroundColor Yellow
#$pause = Read-Host "PAUSE"
# Postfach wird aktiviert.
Enable-Mailbox -Identity "Migration" -Confirm:$false
Write-Host "| Postfach wurde aktiviert |" -ForegroundColor Yellow
#$pause = Read-Host "PAUSE"
# PST-Datei wird importiert.
# Import-Mailbox -Identity "Migration" -PSTFolderPath "D:\PST-Import\PST-Files\$pfad$i" #-AllowDuplicates
Import-Mailbox -Identity "Migration" -PSTFolderPath "$pfad$i" #-AllowDuplicates
Write-Host "| Mailbox wurde importiert |" -ForegroundColor Yellow
#$pause = Read-Host "PAUSE"
# Log-Datei wird kopiert.
# Move-Item "D:\Microsoft\Exchange Server\V14\Logging\MigrationLogs\*.*" -Destination "D:\PST-Import\PST-Files\$i.*"
Move-Item "D:\Microsoft\Exchange Server\V14\Logging\MigrationLogs\*.xml" -Destination "D:\PST-Import\PST-Files\$i.xml"
Get-ChildItem D:\PST-Import\PST-Files\ *.pst.xml | Rename-Item -NewName { $_.name -replace '\.pst.xml','.xml' }
Move-Item "D:\Microsoft\Exchange Server\V14\Logging\MigrationLogs\*.log" -Destination "D:\PST-Import\PST-Files\$i.log"
Get-ChildItem D:\PST-Import\PST-Files\ *.pst.log | Rename-Item -NewName { $_.name -replace '\.pst.log','.log' }
Write-Host "| Log-File wurde geschrieben |" -ForegroundColor Yellow
# $pause = Read-Host "PAUSE"
# Java-Programm wird aufgerufen.
Invoke-Expression -Command "D:\PST-Import\Dialog.jar -$pfad$i"
# Es wird gewartet, bis das Java-Programm den Mail-Import beendet hat.
$p = Get-Process java* # Hier muss der Prozessname eingetragen werden.
if ($p)
{
$p.WaitForExit()
Write-Host ""
Write-Host "-------------------------------------" -ForegroundColor Blue
Write-Host "| Der Mail-Import wurde beendet! |" -ForegroundColor Yellow
Write-Host "-------------------------------------" -ForegroundColor Blue
Write-Host ""
}
else
{
Write-Host ""
Write-Host "-----------------------------------------" -ForegroundColor Red
Write-Host "| Der Mail-Import wurde nicht gestartet |" -ForegroundColor Yellow
Write-Host "-----------------------------------------" -ForegroundColor Red
Write-Host ""
}
#$pause = Read-Host "PAUSE"
}
# Stimmt der Pfad nicht überein, gibts ne Fehlermeldung.
}
else
{
Write-Host ""
Write-Host "-------------------------------------" -ForegroundColor Red
Write-Host "| Ungültiger Pfad! |" -ForegroundColor Yellow
Write-Host "-------------------------------------" -ForegroundColor Red
Write-Host ""
}
Ich habe in Zeile 32 Folgendes angehängt
-Recurse
Edit: sprich
Ordner #den muss ich angeben
|-Ordner
| |-Datei
| |-...
|
|-Ordner
| |-Datei
| |-...
Hi,
du kannst folgendes machen:
der Teil muss nur innerhalb deiner forech Schleife eingebaut werden.
Und alles was innerhalb der bisherigen forech Schleife gemacht worden ist muss innerhalb der IF Anweisung geschehen.
Gruß Miyamoto
du kannst folgendes machen:
$pfad_pst="d:\zzz\datei.pst"
$pfad_xml=$pfad_pst.Replace(".pst",".xml")
if(test-path $pfad_xml){
Write-Host "Ja eine xml Datei ist vorhanden"
}else{
Write-Host "Keine xml Datei Vorhanden"
}
Und alles was innerhalb der bisherigen forech Schleife gemacht worden ist muss innerhalb der IF Anweisung geschehen.
Gruß Miyamoto
Ganz einfach, mit dem Code den ich dir gegeben habe:
du übergibst deinen Pfad an die Replace Methode (Zeile 3) da wird die Endung pst zu ein xml, das Ergebnis wird in einen neue Variable gepackt.
jetzt wird die neue Variable an die IF Anweisung übergeben, die überprüft ob die Datei vorhanden ist.
Gehen wir mal davon aus das die Datei vorhanden ist. Nun musst du mit den Original Pfad weiter arbeiten, sprich in Zeile 6, wo auch dein andere Code hinein kommt.
Edit: Der Code kommt in deine "forech" Schleife
Gruß Miyamoto
$pfad_pst="d:\zzz\datei.pst"
$pfad_xml=$pfad_pst.Replace(".pst",".xml")
if(test-path $pfad_xml){
Write-Host "Ja eine xml Datei ist vorhanden"
}else{
Write-Host "Keine xml Datei Vorhanden"
}
jetzt wird die neue Variable an die IF Anweisung übergeben, die überprüft ob die Datei vorhanden ist.
Gehen wir mal davon aus das die Datei vorhanden ist. Nun musst du mit den Original Pfad weiter arbeiten, sprich in Zeile 6, wo auch dein andere Code hinein kommt.
Edit: Der Code kommt in deine "forech" Schleife
Gruß Miyamoto
Hi,
mit dem Batch Befehl,
startest du eine PowerShell und führst anschließend das Skript aus was du angegeben hast.
Keine Ahnung wie man ein Skript mit einem Doppelklick ausführen,
ich glaube aber mich zu erinnern das ich mal gelesen habe das man es mit Absicht so gemacht hat,
damit man nicht die verkehrten Skript ausführt.
Ich würde mir eine Batch schreiben und dann immer die starten, das geht mit den oben genannten Befehl.
Gruß Miyamoto
mit dem Batch Befehl,
powershell.exe -noexit .\Auto-Migration.ps1
Keine Ahnung wie man ein Skript mit einem Doppelklick ausführen,
ich glaube aber mich zu erinnern das ich mal gelesen habe das man es mit Absicht so gemacht hat,
damit man nicht die verkehrten Skript ausführt.
Ich würde mir eine Batch schreiben und dann immer die starten, das geht mit den oben genannten Befehl.
Gruß Miyamoto