Powershell Encodingproblem

Blubmann1337

Ensign
Registriert
Dez. 2009
Beiträge
241
Hallo zusammen,

ich bin gerade etwas sehr ratlos und hoffe, dass mir hier ein Powershell-Profil weiterhelfen kann. Ich versuche für unser Unternehmen ein Script zu basteln, welches automatisch über die Aufgabenplanung ein SFC/DISM durchführt und im Fehlerfall eine Mail an den Admin verschickt. Ich habe erstelle einen Backgroundjob und lese dann das Ergebnis des Jobs in eine Datei ein.
Soweit hier mal mein Code:

PowerShell:
$Path= 'C:\JobLogs'

$Date= get-date -format "dd MM yyyy"
$LogFile= "C:\JobLogs\Ergebnis$date.txt"
start-job -name SFC -ScriptBlock {sfc /scannow}
if (test-path $path) {
        write-host "$Path gefunden, exportiere Logs"
    }
    else {
        new-item C:\JobLogs -itemtype directory;
        Write-Host "$Path nicht gefunden, erstelle Pfad und exportiere Logs"
    }
wait-job -name SFC | receive-job | out-file -FilePath $LogFile

Anschließend möchte ich eine Stringsuche durchführen, die Prüft, ob es einen Fehler gab und dann entsprechend weiter agieren. Jedoch bringt mich das Encoding zur Verzweiflung. Der Inhalt der Textdatei sieht wie folgt aus:

▄ b e r p r ³ f u n g 9 9 % a b g e s c h l o s s e n .
▄ b e r p r ³ f u n g 1 0 0 % a b g e s c h l o s s e n .

D e r W i n d o w s - R e s s o u r c e n s c h u t z h a t k e i n e I n t e g r i t õ t s v e r l e t z u n g e n g e f u n d e n .

Umlaute sind falsch und es wird zwischen den Buchstaben noch eine Leerzeichen gesetzt. Mit dem Parameter -Encoding hinter out-file habe ich keine Änderung, da die Encodierung bereits bei receive-job irgendwie verhunzt wird. Auch habe ich am Anfang des Scripts $PSDefaultParameterValues['*:Encoding'] = 'oem' bzw. utf8 usw. gesetzt aber ich habe keine Änderung in der Datei. Eine Stringsuche läuft ins leere. Hat wer eine Idee oder alternativ eine andere Lösung?
 
Mit der Powershell hat das Ganze erstmal nichts zu tun, da Du ja ein Programm schreiben willst das Fehlermeldungen weiter leitet, und dafür nimmt man einen Editor z. B. Notepad++.

Das Programm sieht aus wie PHP . . . Du könntest jetzt mal sehen, wie Du aus den Logfiles von SFC, wie schon erwähnt, daß für Deine Aufgabe relevante extrahierst, Deinem Admin den ganzen Log-Krempel hinzuklatschen dürfte dem wohl nicht gefallen.

Eigentlich ist für so was der WSH (Windows Scripting Host) das ideale Werkzeug.
 
Sieh dir mal den Hexdump ($_ | Format-Hex | Out-Host) davon an. Es sind mit Sicherheit Null-Bytes drin, was auf UTF-16 hindeutet. Das Output-Encoding kannst du mit
PowerShell:
[Console]::OutputEncoding = New-Object System.Text.UnicodeEncoding
ändern.
 
  • Gefällt mir
Reaktionen: Phrasendreher
Shio schrieb:
SFC erzeugt doch schon ein Log:
Stimmt an das Logfile habe ich gar nicht gedacht. Jedoch sieht das CBS-Log recht "unübersichtlich" aus. Es wäre zum Auswerten etwas einfacher, wenn ich das Ergebnis habe "keine Integritätsverletzung" gefunden.
KernelpanicX schrieb:
Deinem Admin den ganzen Log-Krempel hinzuklatschen dürfte dem wohl nicht gefallen.
Ne soweit wollte ich tatsächlich nicht gehen:D. Eine Mail mit SFC/DISM-Fehler an PC xy würde reichen.
Aber ich schau mal vielleicht sehe ich doch was brauchbares im CBS-Log wie z.B. No Error found oder so
 
Nur zur Sicherheit, zumindest laut Microsoft soll DISM die Aufgaben von SFC vollständig übernehmen können. Wobei ich nicht 100% sicher bin. ob das tatsächlich so stimmt... ich traue dem Frieden an der Stelle nicht.

DISM selber kann über das DISM-Modul angesteuert werden, da ist keine Anpassung der Codierung erforderlich. Zugehörige cmdlets wären *-WindowsImage .

Ansonsten reicht es, wenn Console::InputEncoding, Console::OutputEncoding und das, was CHCP liefert, zusammenpassen. Normalerweise ist das 850 auf europäischen Systemen. Aber 65001 kann man auch machen (UTF8), wenn man nicht grad alten console-basierten Kram hat.
 
flatika schrieb:
Eine Mail mit SFC/DISM-Fehler an PC xy würde reichen.
Aber ich schau mal vielleicht sehe ich doch was brauchbares im CBS-Log wie z.B. No Error found oder so
Der WSH wäre meiner Ansicht nach für solche das Windows-System betreffende Aufgaben wirklich am besten geeignet, aber das kann in diesem Fall nicht helfen, da man sich erst einarbeiten muß. Müssen allerdings öfters solche Aufgaben gelöst werden wie Deine jetzige, solltest Du das vielleicht im Auge behalten.

Ein erstklassiges Buch zur Einarbeitung in den WSH ist (Gibt es wohl nicht mehr neu):
Inside Windows Scripting Host - Günter Born

Hier mal ein kleines Beispiel. Es ging um die Frage, ob man auch unter Windows Ordner etc. löschen kann ohne Nachfrage - wie etwa in Linux. Dafür mußte ich auch erst wieder im Born blättern, denn das letzte Mal hatte ich damit so etwa 2003 zu tun. - Das Progrämmchen erstellt einen Ordner auf E:\TEMP, wartet 5 Sekunden, und löscht ihn dann wieder ohne Nachfrage.

Code:
'Windows Scripting Host Beispiel, 15. April 2019
'Erstellen und Loeschen eines Ordners ohne Abfrage

'Variablendeklaration erzwingen
Option Explicit

Dim Pfad, OrdnerAnzeigen
Dim fso, fo

'Ordner Beispiel erstellen
Pfad = "E:\TEMP\Beispiel"

'FileSystemObject erzeugen fuer Zugriff
Set fso = WScript.CreateObject("Scripting.FileSystemObject")

'Ordner erstellen
Set fo = fso.CreateFolder(Pfad)

'Neu erstellten Ordner anzeigen
OrdnerAnzeigen = fso.GetParentFolderName(Pfad)
Set fo = fso.GetFolder(OrdnerAnzeigen)

'5 Sekunden warten
WScript.Sleep 5000

'Ordner ohne Nachfrage loeschen
fso.DeleteFolder(Pfad)
WScript.Quit
'***Ende
 
Erm, der WSH ist abgekündigt. Kann man machen, klar, besonders wenn man JS und / oder VBS mag. Oder ein Erweiterungsplugin hat /findet für andere Sprachen.

Aber absehbar wird auch der WSH der Powershell-Infrastruktur weichen.
 
  • Gefällt mir
Reaktionen: NotNerdNotDau
RalphS schrieb:
Erm, der WSH ist abgekündigt.

Aber absehbar wird auch der WSH der Powershell-Infrastruktur weichen.
Der ist nicht abgekündigt! Unter Windows ist der so nutzbar, wie von Beginn an.

Und die Power Shell ist keine Script oder Programmiersprache, sie ist nichts weiter als eine Kommandozeile. Noch mehr Möglichkeiten bietet übrigens das Windows Terminal. Nennt sich zwar auch Power Shell bietet aber eben mehr Einstellmöglichkeiten:

Windows Terminal
 

Anhänge

  • WindowsTerminal2022-02-23.jpg
    WindowsTerminal2022-02-23.jpg
    33,5 KB · Aufrufe: 238
Zuletzt bearbeitet von einem Moderator: (Denk und Schreibfehler!)
KernelpanicX schrieb:
Und die Power Shell ist keine Script oder Programmiersprache, sie ist nichts weiter als eine Kommandozeile.
Das steht bei Wikipedia aber anders. Danach ist es sowohl eine Skriptsprache als auch eine Kommandozeile (ich hab auch keine Ahnung, warum sich das widersprechen sollte):
https://de.wikipedia.org/wiki/PowerShell

KernelpanicX schrieb:
Dein Terminal ist noch mal was anderes als eine Kommandozeile(/shell). Hast Du auch mal auf den Link draufgeklickt und Dir die Seite durchgelesen?
 
andy_m4 schrieb:
Das steht bei Wikipedia aber anders.
Wikipedia ist in vielen Teilen nützlich, und in manchen auch wirklich gut, aber es ist nicht das Wort Jesu.

Kurz um, zeig mir doch mal, wie man in der Power Shell ein allzeit verfügbares Script erstellt. Allzeit, nicht jedes mal neu eingeben.
 
KernelpanicX schrieb:
Wikipedia ist in vielen Teilen nützlich, und in manchen auch wirklich gut, aber es ist nicht das Wort Jesu.
Na dann nochmal von Microsoft - Entwickler von PowerShell:
As a scripting language, PowerShell is commonly used for automating the management of systems.
https://docs.microsoft.com/en-us/powershell/scripting/overview?view=powershell-7.2

KernelpanicX schrieb:
Kurz um, zeig mir doch mal, wie man in der Power Shell ein allzeit verfügbares Script erstellt. Allzeit, nicht jedes mal neu eingeben.
Hier ein Script von mir: https://www.computerbase.de/forum/t...chen-intervallen.2035980/page-2#post-25912088
(EDIT: oder nehm das vom TE im ersten Post)
Pack es in eine .ps1 Datei und fertig ist dein allzeit verfürgbares Script
 
  • Gefällt mir
Reaktionen: NotNerdNotDau
KernelpanicX schrieb:
Wikipedia ist in vielen Teilen nützlich, und in manchen auch wirklich gut, aber es ist nicht das Wort Jesu.
Du solltest mal etwas kürzer treten...

https://github.com/janikvonrotz/awesome-powershell

Es ist ne übliche Programmiersprache, die das komplette .NET im Hintergrund umfasst.
KernelpanicX schrieb:
Kurz um, zeig mir doch mal, wie man in der Power Shell ein allzeit verfügbares Script erstellt. Allzeit, nicht jedes mal neu eingeben.
Was ist ein "allzeit verfügbares Script"?
PowerShell:
Write-Host "Hello World"
speicher das als HelloWorld.ps1 ab und führ es manuell aus oder starte es via Rechtsklick → Ausführen.
 
  • Gefällt mir
Reaktionen: NotNerdNotDau
Nein, da muß ich nicht kürzer treten! Wer nicht völlig besoffen ist von Wikipedia, der erkennt es: Es ist nicht das Wort Jesu!

Um es abzukürzen: Zeig mir ein Beispiel der Programmiersprache Power Shell.

Was Du da zeigst ist ein Programm, daß unter(!) der Power Shell ausgeführt wird. So wie hier:
 

Anhänge

  • PS-Get-Help-24-02-2022.png
    PS-Get-Help-24-02-2022.png
    66,4 KB · Aufrufe: 262
flatika schrieb:
Es wäre zum Auswerten etwas einfacher, wenn ich das Ergebnis habe "keine Integritätsverletzung" gefunden.
Schon mal den Exit Code geprüft?
KernelpanicX schrieb:
Zeig mir ein Beispiel der Programmiersprache Power Shell.
PowerShell:
Add-Type -Assembly System.Windows.Forms

$mainForm = New-Object System.Windows.Forms.Form

$mainForm.Text = "Hello World"
$mainForm.Width = 640
$mainForm.Height = 480

$button = New-Object System.Windows.Forms.Button
$button.Location = New-Object System.Drawing.Size(48,48)
$button.Size = New-Object System.Drawing.Size(240,48)
$button.Text = "Click me"
$mainForm.Controls.Add($button)

$button.Add_Click( {
    $button.Text = "Clicked at $([datetime]::Now)"
} )

$mainForm.ShowDialog()
Ab davon hast du bereits 3+ Beispiele in dem Thread gepostet bekommen...
KernelpanicX schrieb:
Was Du da zeigst ist ein Programm, daß unter(!) der Power Shell ausgeführt wird.
Aha und ein Programm wird durch Blümchen und Bienen beschrieben oder was? Was du zeigst ist übrigens Windows Terminal (ein Terminal Emulator). Was darin gerendert wird ist die CLI, die üblicherweise von conhost dargestellt wird. Die CLI ist aber unabhängig der Sprache im Hintergrund bzw. ist das auch nur ein interaktiver Modus im Interpreter. Führ python oder php -a aus und landest 1:1 im selben interaktiven Modus des Interpreters anderer Sprachen.

Willst du mit deinem Kauderwelsch jetzt wirklich sagen, dass eine CLI-Anwendung "kein Programm" ist, weil es in der CLI läuft?

Ab davon hat die Diskussion überhaupt nichts mit dem Thema zu tun...

Was du in #7 verbrochen hast nennt sich übrigens Visual Basic und ist eine Programmiersprache. Aber nach deiner Definition läuft es ja "unter" der cmd (der Shell command) innerhalb von conhost und ist somit keine Programmiersprache. JavaScript/JScript ist dann wohl auch keine Programmiersprache, schließlich läuft die auch im Scripting Host. Und JS läuft auch im Browser. Also ist JS dann wohl einfach keine Programmiersprache... Außer wohl wenn JS durch Electron gejagt wird, dann ist es wohl eine Programmiersprache, weil es nirgendwo "unter" läuft.

1645694646768.png
 
  • Gefällt mir
Reaktionen: andy_m4
Yuuri schrieb:
Aha und ein Programm wird durch Blümchen und Bienen beschrieben oder was? . . .
Erstmal, daß mit Bienen & Co entspricht dem Niveau der @Heise-Kiddies von vor zwanzig Jahren, aber manche verlassen das Niveau nie.

Als nächstes, was soll das Rumgeschwurbel a la conhost, CLi und so weiter? Will Du damit Eindruck machen? Du plapperst nur, ohne wirklich etwas zu verstehen. Das Command Line Interface ist natürlich ein Programm, aber man erstellt doch damit keine Programme. Die Kommandozeile oder die Power Shell dienen der Interaktion mit dem System, und man kann unter ihnen Programme kompilieren etc., mehr nicht.

Zu Deinem nächsten Geistesblitz: Das ist nicht Visual Basic, sondern Visual Basic Script. Ich hoffe, so ein Profi wie Du kennt den Unterschied. Wie war das mit dem etwas verbrochen haben?

Und schließlich, was den Troll anbetrifft, sieh mal in einen Spiegel, da siehst Du einen echten Troll.

Damit bin ich raus aus dieser zur Schmierenkomödie mutierten Diskussion.
 
KernelpanicX schrieb:
aber manche verlassen das Niveau nie.
Dich eingeschlossen. ;-)

KernelpanicX schrieb:
Das Command Line Interface ist natürlich ein Programm, aber man erstellt doch damit keine Programme.
Och. Dann frag ich mich grad, wie wir das früher gemacht haben. :-)

KernelpanicX schrieb:
Die Kommandozeile oder die Power Shell dienen der Interaktion mit dem System, und man kann unter ihnen Programme kompilieren etc., mehr nicht.
Ja. Oder Editoren aufrufen die dann im Terminal auch im Textmode laufen. Man kann sogar aus diesem Textmode-Editor weitere Shellkommandos oder auch Compiler oder auch beliebige andere weitere Programme starten.

KernelpanicX schrieb:
Zu Deinem nächsten Geistesblitz: Das ist nicht Visual Basic, sondern Visual Basic Script
Nach Visual Basic Script sieht Dein geposteter Quelltext aus. Seiner war ein Powershell-Script (seit wann kennt Visual Basic Script New-Object? ).

KernelpanicX schrieb:
Und schließlich, was den Troll anbetrifft, sieh mal in einen Spiegel, da siehst Du einen echten Troll.
Na ich gucke da auch eher in Deine Richtung. Die Klappe aufreißen und sich auf der anderen Seite zu einem Stück Brot machen ..... aber ich leg es zu Deinem Gunsten mal so aus, das Du einfach noch jung und unerfahren bist. ;-)
 
Geht doch nicht auf diesen merkwürdigen Vogel ein und bietet ihm keine Plattform.
Schaut euch doch nur die Beiträge von dem an, nichts als die pure Provokation.
Der gehört gebannt, denn es ist nicht zu erwarten, dass von dem jemals irgendetwas Konstruktives kommen wird.

Die Lösung des hier thematisierten Problems wird doch im Grunde bereits in Beitrag #4 präsentiert. Wozu also noch dieses Nachkarten?
 
Das Problem ist, das es evtl. noch andere Unerfahrene gibt die den Thread lesen und dann alles für bare Münze nehmen, wenn man dem nicht entgegentritt.

Die "Bösen" gewinnen in der Regel deshalb, weil die "Guten" tatenlos zusehen. Ist jetzt in dem Kontext vielleicht zuuuu pathetisch formuliert, aber Du weißt vielleicht worauf ich hinaus will. :-)
 
  • Gefällt mir
Reaktionen: Fusionator und NotNerdNotDau
Zurück
Oben