Ausgabe eines Konsolen-Programmes via Powershell weiter verarbeiten
Hallo zusammen,
ich stehe vor der (vermeintlich) einfachen Aufgabe, dass ich ein Skript (am liebsten Powershell, möglich wäre aber auch Batch) schreiben soll/muss, welches die Daten aus einem Ordner in einen anderen Ordner kopiert. Das ganze soweit recht simpel, jetzt kommt das aber:
Ordner A liegt in einem ungesicherten Bereich unseren eigenen Netzes. Dort haben die Kollegen teilweise administrativen Zugriff und es ist erforderlich, dass externe Partner dort Ihre USV Sticks, etc. einstecken dürfen.
Ordner B liegt im gesicherten Bereich unseres eigenen Netzes, keine Adminrechte, keine USB-Sticks.
Dazwischen hängt eine Firewall, die den Verkehr steuert und überwacht, bzw. zu 95% blockiert. Und ja, wir haben eine Firewall zwischen zwei unser eigenen Netze. Nun ist es aber so, dass zwischen den Ordnern nur ausgewählte Dateitypen kopiert werden sollen. Auch das an sich noch keine Herausforderung, wenn es da nicht die Dienstleister gäbe, die ihre Setup-Dateien einfach mal von Setup.exe zu Setup.zip oder Setup.pdf umbenennen. Die Firewall erkennt diese umbenannten Dateien leider nicht zuverlässig. Ich brauche also eine Möglichkeit zu ermitteln um welchen Dateityp es sich handelt, ohne mich bei der Erkennung auf die Dateiendung zu fokussieren.
Bei meiner Suche nach einer Lösung bin ich auf auf TrID (Link zur Seite) gestoßen. Das ganze funktioniert super. Es werden umbenannte Dateitypen (zumindest im Test bislang) zuverlässig erkannt:
Wie man sieht wird die von Setup.exe zu Setup.zip zuverlässig als Exe erkannt. Eine native Zip-Datei sieht hingegen so aus:
Mein Plan. Jede Datei im Vorfeld mit Trid zu prüfen und anschließend anhand der Auswertung zu entscheiden ob die Datei kopiert werden soll oder nicht scheitert allerdings. Leider funktioniert die Abfrage nur via CMD. Führe ich TrID aus Powershell heraus aus, so öffnet sich kurz ein schwarzes Fenster, allerdings wird das Ergebnis nicht nach PS übergeben. Weder mittels:
noch mittels
gelingt es mir die Ausgabe für die weitere Verarbeitung zu speichern. Aus der CMD kann ich Problemlos das Ergebnis in eine Datei schreiben, aus PS leider nicht.
Daher jetzt die Frage: geht das überhaupt? Mach ich es mir zu kompliziert? Gibt es eine andere Möglichkeit?
Mir würde noch einfallen, dass ich via Batch erstmal alle Dateien mit TrID prüfe, dann für jede Datei eine entsprechende Log-Datei erstelle, diese Log-Dateien dann auswerte und mit der Auswertung weiter arbeite, aber die Lösung gefällt mir nicht. Ich würde gerne das ganze in einem Powershell-Skript umsetzen. Fällt da jemanden etwas ein?
Gruß
Doskias
ich stehe vor der (vermeintlich) einfachen Aufgabe, dass ich ein Skript (am liebsten Powershell, möglich wäre aber auch Batch) schreiben soll/muss, welches die Daten aus einem Ordner in einen anderen Ordner kopiert. Das ganze soweit recht simpel, jetzt kommt das aber:
Ordner A liegt in einem ungesicherten Bereich unseren eigenen Netzes. Dort haben die Kollegen teilweise administrativen Zugriff und es ist erforderlich, dass externe Partner dort Ihre USV Sticks, etc. einstecken dürfen.
Ordner B liegt im gesicherten Bereich unseres eigenen Netzes, keine Adminrechte, keine USB-Sticks.
Dazwischen hängt eine Firewall, die den Verkehr steuert und überwacht, bzw. zu 95% blockiert. Und ja, wir haben eine Firewall zwischen zwei unser eigenen Netze. Nun ist es aber so, dass zwischen den Ordnern nur ausgewählte Dateitypen kopiert werden sollen. Auch das an sich noch keine Herausforderung, wenn es da nicht die Dienstleister gäbe, die ihre Setup-Dateien einfach mal von Setup.exe zu Setup.zip oder Setup.pdf umbenennen. Die Firewall erkennt diese umbenannten Dateien leider nicht zuverlässig. Ich brauche also eine Möglichkeit zu ermitteln um welchen Dateityp es sich handelt, ohne mich bei der Erkennung auf die Dateiendung zu fokussieren.
Bei meiner Suche nach einer Lösung bin ich auf auf TrID (Link zur Seite) gestoßen. Das ganze funktioniert super. Es werden umbenannte Dateitypen (zumindest im Test bislang) zuverlässig erkannt:
Wie man sieht wird die von Setup.exe zu Setup.zip zuverlässig als Exe erkannt. Eine native Zip-Datei sieht hingegen so aus:
Mein Plan. Jede Datei im Vorfeld mit Trid zu prüfen und anschließend anhand der Auswertung zu entscheiden ob die Datei kopiert werden soll oder nicht scheitert allerdings. Leider funktioniert die Abfrage nur via CMD. Führe ich TrID aus Powershell heraus aus, so öffnet sich kurz ein schwarzes Fenster, allerdings wird das Ergebnis nicht nach PS übergeben. Weder mittels:
$Auswertung=start c:\test\trid\trid.exe c:\test\setup.exe
start c:\test\trid\trid.exe c:\test\setup.exe > C:\test\ergebnis.txt
Daher jetzt die Frage: geht das überhaupt? Mach ich es mir zu kompliziert? Gibt es eine andere Möglichkeit?
Mir würde noch einfallen, dass ich via Batch erstmal alle Dateien mit TrID prüfe, dann für jede Datei eine entsprechende Log-Datei erstelle, diese Log-Dateien dann auswerte und mit der Auswertung weiter arbeite, aber die Lösung gefällt mir nicht. Ich würde gerne das ganze in einem Powershell-Skript umsetzen. Fällt da jemanden etwas ein?
Gruß
Doskias
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 7298750978
Url: https://administrator.de/forum/ausgabe-eines-konsolen-programmes-via-powershell-weiter-verarbeiten-7298750978.html
Ausgedruckt am: 22.12.2024 um 08:12 Uhr
6 Kommentare
Neuester Kommentar
Mal auf die Schnelle übersetzt
Verwurstbares Objekt als Ergebnis:
Gruß
$Auswertung = c:\test\trid\trid.exe "c:\test\setup.exe" | ?{$_ -match '^\s*([\d\.]+)% \(([^\)]+)\) (.*)'} | select @{n='Percent';e={$matches[1]}},@{n='Extension';e={$matches[2]}},@{n='Description';e={$matches[3]}}
$Auswertung
Verwurstbares Objekt als Ergebnis:
Percent Extension Description
------- --------- -----------
80.0 .ZIP ZIP compressed archive (4000/1)
20.0 .PG/BIN PrintFox/Pagefox bitmap (640x800) (1000/1)
Gruß
Suchst du sowas?
Manuel
$prgconf = New-Object System.Diagnostics.ProcessStartInfo
$prgconf.FileName = "<pfadzurexe>"
$prgconf.RedirectStandardOutput = $true
$prgconf.UseShellExecute = $false
$prgconf.Arguments = "<parameter>"
$prgstart = New-Object System.Diagnostics.Process
$prgstart.StartInfo = $prgconf
$prgstart.Start() | Out-Null
$prgstdout = $prgstart.StandardOutput.ReadToEnd()
$prgstart.WaitForExit()
Write-Host $prgstdout
Manuel
Zitat von @Doskias:
Ach manno. Manchmal probiert man soviel rum, dass man auf die einfachste Lösung nicht kommt. Aber ja genau sowas meinte ich und dennoch:
Ach manno. Manchmal probiert man soviel rum, dass man auf die einfachste Lösung nicht kommt. Aber ja genau sowas meinte ich und dennoch:
Start ist ein Alias für Start-Process. Letzteres hätte einem einen Hinweis auf das Problem geben können