Ordner durchsuchen - wenn "bestimmter Text" in einer Datei enthalten, diese Datei in einen anderen Ordner kopieren oder verschieben
Hallo zusammen,
ich habe ein Problem bei der Erstellung einer *.bat, welche innerhalb eines zu definierenden Ordners alle Dateien nach einer bestimmten "Begrifflichkeit" (so z.B. "Fehler XY an TXVcs2") durchsuchen soll. Die zu durchsuchende Datei hat die Dateiendung=*.MSG, diese kann jedeoch z.B. mit dem Editor regulär gelesen werden.
Wird die *.bat fündig, so soll die *.MSG in ein zu definierendes Verzeichnis kopiert/verschoben werden.
Dieses Code hier habe ich im Netz gefunden ...
... und ihn entsprechend auf meine Bedürfnisse abgeändert ...
An verschiedenen Stellen habe ich nun auch schon Änderungen im Code vorgenommen aber was ich auch mache ... die *.bat arbeitet nicht und mir fehlt leider die Kenntnis um die Ursache dafür ausfindig zu machen.
Wäre toll wenn mir hier jemand helfen könnte.
Gruß
Con
ich habe ein Problem bei der Erstellung einer *.bat, welche innerhalb eines zu definierenden Ordners alle Dateien nach einer bestimmten "Begrifflichkeit" (so z.B. "Fehler XY an TXVcs2") durchsuchen soll. Die zu durchsuchende Datei hat die Dateiendung=*.MSG, diese kann jedeoch z.B. mit dem Editor regulär gelesen werden.
Wird die *.bat fündig, so soll die *.MSG in ein zu definierendes Verzeichnis kopiert/verschoben werden.
Dieses Code hier habe ich im Netz gefunden ...
Find /i "FEHLER" Update_AV_log.txt
if errorlevel 1 goto notfound
copy F:\Update_AV_log.txt "C:\Dokumente und Einstellungen\Plancad-SK\Desktop\Update_AV_log_copy.txt"
REN "C:\Dokumente und Einstellungen\Plancad-SK\Desktop\Update_AV_log_copy.txt" AV_%date%.txt
:notfound
... und ihn entsprechend auf meine Bedürfnisse abgeändert ...
set root=%~dp0
set MSGunpacked=%~dp0TYP_LOGS\entpackt\
set MSGneed=%~dp0TYP_LOGS\zu_verwenden\
set mydate=%date:~-4%-%date:~-7,2%-%date:~-10,2%
md TYP_LOGS\zu_verwenden\%mydate%
Find /i "Fehler XY an TXVcs2!" "%MSGunpacked%*.MSG"
if errorlevel 1 goto notfound
copy "%MSGunpacked%*.MSG" "%MSGneed%\%mydate%\*.MSG"
:notfound
pause
An verschiedenen Stellen habe ich nun auch schon Änderungen im Code vorgenommen aber was ich auch mache ... die *.bat arbeitet nicht und mir fehlt leider die Kenntnis um die Ursache dafür ausfindig zu machen.
Wäre toll wenn mir hier jemand helfen könnte.
Gruß
Con
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 320511
Url: https://administrator.de/contentid/320511
Ausgedruckt am: 22.11.2024 um 05:11 Uhr
14 Kommentare
Neuester Kommentar
Moin.
"...arbeitet nicht..." ist im Zweifel nicht hilfreich...
Powershell:
Grüße,
Tiberius
"...arbeitet nicht..." ist im Zweifel nicht hilfreich...
Powershell:
clear-host
$source = ".\Desktop\test"
$destination = ".\Desktop\ziel"
$files = gci $source
foreach ($f in $files){
$match = $false
$content = gc $source\$f
foreach ($c in $content){
switch($c){
"Fehler XY an TXVcs2"{$match = $true}
}
}
if ($match -eq $true){
Move-Item $source\$f -Destination $destination
}
}
Grüße,
Tiberius
Kein Problem
um das ganze übersichtlicher zu machen
C:\windows\system32\WindowsPowerShell\v1.0\powershell_ise.exe (das ist quasi die Entwicklerumgebung)
Code sieht erstmal in Ordnung aus (btw. Unterordner werden nicht durchsucht.)
Ich habe mir eine *.bat erstellt, die dann die *.ps1 ausführt (ich hatte bis dato noch nix mit Powershell zu tun und hatte erstmal Schwierigkeiten beim "Starten".
Warum den über Batch/CMD? Das ist veraltete Technik. Wenn du WIn7 oder höher hast, führe die Powershell doch direct aus.um das ganze übersichtlicher zu machen
C:\windows\system32\WindowsPowerShell\v1.0\powershell_ise.exe (das ist quasi die Entwicklerumgebung)
Hier aber nun Dein Code, mit dem ich bedauerlicherweise auch so meine Schwierigkeiten habe ... mein CMD bleibt nach der *.bat, also wenn dann die *.ps1 ausgeführt wird schwarz
In der cmd gibt es nur eine Ausgabe, wenn die cmd etwas macht. Das ist hier aber nicht der Fall, da darüber nur die Powershell gestartet wird.> clear-host
>
> $source = "X:\X2Z\TYP_Daten_CS\TYP_LOGS\entpackt"
> $destination = "X:\AK0\TYP_Daten_CS\TYP_LOGS\zu_verwenden"
>
> $files = gci $source
>
> foreach ($f in $files){
> $match = $false
> $content = gc $source\$f
> foreach ($c in $content){
> switch($c){
> "10314973.28T 10314973.28T"{$match = $true}
> }
> }
> if ($match -eq $true){
> Move-Item $source\$f -Destination $destination
> }
> }
>
Hallo Con,
Beispiel wenn der gesuchte String im Body der Mail vorkommt:
Du kannst auch andere Teile der Nachricht durchsuchen, das kann man nach Belieben anpassen.
Das Outlook auf dem Rechner auf dem das Script ausgeführt wird, vorhanden sein muss, ist für das obige Script Voraussetzung.
Falls das nicht in Frage kommt und die MSG-Files einheitlich in Unicode vorliegen dann geht's auch ohne so als Einzeiler wenn man die Variablendefrinitionen der Übersicht halber abzieht.
Grüße Uwe
Ich habe nun mal aus einer *.MSG ein *.txt gemacht und dann nach einem Text gesucht der in der *.txt steht ...
der Grund ist das RAW ausgelesen die Strings in Unicode anders kodiert sind. In der Textdatei sieht das zwar so aus, dem ist aber nicht so (Öffne die Datei mal im Hexeditor dann siehst du es). Deswegen empfehle ich dir den Inhalt der Mail zuverlässiger gleich über das Outlook-Com-Object auszulesen, damit kommst du an den Plaintextinhalt der Mail.Beispiel wenn der gesuchte String im Body der Mail vorkommt:
$objOL = new-object -Com Outlook.Application
$searchstring = 'ZGFNTFMT'
$source = 'C:\quelle'
$destination = 'C:\ziel'
gci $source -Filter *.msg -recurse | %{
$mail = $objOL.CreateItemFromTemplate($_.Fullname)
if ($mail.Body -like "*$searchstring*"){
$_ | move-item -Destination $destination -Force -Verbose
}
$mail.Close(1)
}
Das Outlook auf dem Rechner auf dem das Script ausgeführt wird, vorhanden sein muss, ist für das obige Script Voraussetzung.
Falls das nicht in Frage kommt und die MSG-Files einheitlich in Unicode vorliegen dann geht's auch ohne so als Einzeiler wenn man die Variablendefrinitionen der Übersicht halber abzieht.
$searchstring = 'deinsuchstring'
$source = 'C:\quelle'
$destination = 'C:\ziel'
gci $source -Filter *.msg -recurse | ?{(gc $_.Fullname -Encoding Unicode | out-string) -like "*$searchstring*" } | move-item -Destination $destination -force -verbose
Grüße Uwe
um Hilfe bin ich dankbar.
Drei vier deiner Dateien gezippt zur Verfügung stellen und das simple Thema wäre schon längst erledigt, und die aufwendige Testerei unnötig gewesen! Das ist doch nur trial & error was du da treibst. Für uns ist das ein einfacher Blick in die Raw-Daten der Datei dann können wir dir das passende Skript liefern. Alles andere wäre hier Glaskugel polieren. DANKE!Du siehst ja in meinem zweiten Script gehe ich davon aus das alle Dateien im Unicode vorliegen (-Encoding Unicode). Ob das der Fall ist kann ich ja von hier aus nicht wissen, denn die Annahme beruhte darauf das es sich um binäre E-Mail Dateien handelt, die meist im Unicode Format vorliegen. Auch das war Spekulation, also bitte helfe uns damit wir dir "effektiv" helfen können. Dazu eine "klare" Beschreibung welche Arten von Dateien vorkommen können, wie gesucht werden soll etc. pp., dann ist das hier mit einem Post abgehandelt!
Vom Encoding hängt es ab wie die Daten von der Shell interpretiert werden und ob Strings korrekt gefunden werden oder eben nicht, dazu müssen wir wissen was für Files du da hast.
Wenn ich klar weis das mixed files vorkommen können kann man eine zusätzliche dafür Abfrage einbauen, da nicht jede Datei ein BOM enthält, aber eben nur wenn man das weiß.