doskias
Goto Top

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:
trid

Wie man sieht wird die von Setup.exe zu Setup.zip zuverlässig als Exe erkannt. Eine native Zip-Datei sieht hingegen so aus:
zip

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
noch mittels
start c:\test\trid\trid.exe c:\test\setup.exe > C:\test\ergebnis.txt
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

Content-ID: 7298750978

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

Ausgedruckt am: 10.11.2024 um 01:11 Uhr

Kraemer
Lösung Kraemer 25.05.2023 um 08:46:33 Uhr
Goto Top
Moin,

versuche es mal mit:

$Auswertung=c:\test\trid\trid.exe c:\test\setup.exe

Gruß
7010350221
Lösung 7010350221 25.05.2023 aktualisiert um 13:13:49 Uhr
Goto Top
Mal auf die Schnelle übersetzt
$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ß
manuel-r
manuel-r 25.05.2023 um 09:37:41 Uhr
Goto Top
Suchst du sowas?
$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
Doskias
Doskias 25.05.2023 um 14:36:08 Uhr
Goto Top
Zitat von @Kraemer:
versuche es mal mit:
$Auswertung=c:\test\trid\trid.exe c:\test\setup.exe

Ach manno. Manchmal probiert man soviel rum, dass man auf die einfachste Lösung nicht kommt. Aber ja genau sowas meinte ich und dennoch:

Zitat von @7010350221:
Mal auf die Schnelle übersetzt
$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

gefällt mir dann doch etwas besser, da das Ergebnis hier zur Weiterverarbeitung bereits aufbereitet ist.

Danke euch beiden.

Gruß
Doskias
Kraemer
Kraemer 25.05.2023 um 16:34:09 Uhr
Goto Top
Zitat von @Doskias:

Zitat von @Kraemer:
versuche es mal mit:
$Auswertung=c:\test\trid\trid.exe c:\test\setup.exe

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 face-wink
Doskias
Doskias 26.05.2023 aktualisiert um 08:44:27 Uhr
Goto Top
Stimmt. Da war ich gestern wohl irgendwie geistig nicht ganz anwesend.