Warum ändert Powershell immer Font und größe des Batch Scripts?

1 Antwort

Vom Beitragsersteller als hilfreich ausgezeichnet

Eigentlich ist es nicht möglich (mit nativen Mitteln) aus einem Powershellscript heraus den Font eines Consolefenstes zur Laufzeit des Scripts zu ändern.

Es wäre durchaus interessant das Script einmal zu Gesicht zu bekommen.

Zudem irritiert mich das Du von einem Batchtscript redest?

Ich vermute mal, das sich mit dem Aufruf von PowerShell die für das Fenster eingestellte Codepage ändert. Wenn der aktuelle Font des Fensters "vermeintlich" nicht den "neu" zu setzenden Zeichensatz (1252) unterstützt, gibt es einen "Fallback" in einen Font welcher dies "könnte". Das liegt weder an Batch noch an Powershell, sondern daran wie das System mit grundsätzlich unterschiedlichen Codepages umgeht.

@echo off
  rem setze UTF-8 Codepage
chcp 65001 
timeout 2
powershell "[System.Text.Encoding]::Default|fl"
pause

Das tritt nicht nur beim Aufruf von Powerschell auf:

@echo off
  rem zeige aktuellen Zeichensatz
chcp
timeout 2
 rem umschalten auf Häbräisch dürfte von keinem "unserer" vorinstallierten Standardfonts unterstütz werden.
chcp 1255 
pause

Gegen diesen "Fallback" kannst Du nichts machen, da Powershell <6.0 immer mit der Codepage 1252 startet und nicht ohne weiteres mit UTF-8 zurechtkommt. ab Powershell 6.0 ist die Standardcodepage 65001

Entweder du setzt in Deiner Batch keine Codepage. oder du installierst Powershell 7 und rufst dieses auf.

Für den Download von Dateien in einer Batch benötigst Du jedoch kein Powershellscript.

DownloadDemo.cmd

curl "https://img2.dreamies.de/img/901/b/5uzu36uou6w.gif" -o "erzesel-Target.gif"
start "" "erzesel-Target.gif"
pause
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

Nutzer4596 
Beitragsersteller
 20.10.2022, 13:10

Das umstellen auf chcp 1252 >nul vor dem PowerShell Befehl und der darauf folgende Wechsel auf chcp 65001 >nul nach dem ausführen des Befehls hat es behoben.

Hatte etwas vor deiner Antwort kurzzeitig auch einfach das hier benutzt.

start cmd /c powershell -Command Invoke-WebRequest...

Damit hat es auch Einwand frei geklappt

Vielen dank für die hilfe

Erzesel  20.10.2022, 15:18
@Nutzer4596

Mit start... lagerst Du die Ausführung von Powershell in ein neues Fenster aus, welches allein Powershell gehört. Klar.

Allerdings solltest Du erwägen statt des Weges über Powershells Invoke-WebRequest, curl zu nutzen. Mir curl hast du nicht den Overhead zum laden von Powershell und kannst anhand des zurückgegebenen %errorlevel% auf misslungene Downloads reagieren.

@echo off
chcp 65001 >nul

curl "https://img2.dreamies.de/img/901/b/5uzu36uou6w.gif" -o "erzesel-Target.gif"2>nul &&(
    echo Download erfolgreich
    rem  oder was immer passieren  soll
)||(
    echo download misslungen
)

curl "https://fails-blubb.blubb/nix.txt"  -o "nix.txt" 2>nul &&(
    echo Download erfolgreich
)||(
    echo download misslungen
)
pause
Erzesel  20.10.2022, 09:25

nichtWirklichSchön.cmd

@echo off
  rem setze UTF-8 Codepage
chcp 65001 >nul
  rem mache  Deine UTF8 anzeigen
echo τούβλο
echo ÄÖÜäöü߀²³µ
  rem schalte  wieder  auf Powershellstandard
chcp 1252 >nul
powershell -c "'Ich  bin Powershell';[System.Text.Encoding]::Default|fl"
 rem  mach mit utf8 weiter
chcp 65001 >nul
echo Da  liegt der Hase im Peffer ...griechisch: Αυτό είναι το εμπόδιο
pause