Warum ändert Powershell immer Font und größe des Batch Scripts?
In meinem Script versuche ich momentan ein Feature einzubauen um Dateien von Google Drive über die PowerShell herunter zu laden was auch hervorragend klappt.
Allerdings habe ich immer das Problem das nachdem der PowerShell Command ausgeführt worden ist, sich die Größe und Font des CMD Fensters permanent ändert.
(Beim erneuten Starten des Batch Scripts ist wieder alles Normal)
Vorher:
Direkt nach dem Ausführen des Powershell Commands:
Das ist unfassbar nervig und ich möchte nicht immer zwingend das Script neu starten müssen.
Wenn es keine Lösung gibt bleibt mir natürlich nichts anderes übrig, das ist mir klar.
Ich bin für jegliche Hilfe sehr dankbar!
1 Antwort
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
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
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
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.
Damit hat es auch Einwand frei geklappt
Vielen dank für die hilfe