Python unter Windows 10 Mai 2019 Update 1903 installieren

22 Mai 2019

Mit jedem Release öffnet sich Microsoft immer mehr der Open Source Welt. Neuestes Beispiel ist die nun supereinfache Installation von Python unter Windows 10 Mai 2019 Update (1903).

Gibt man Python in der Eingabeaufforderung oder bei Powershell ein, dann kommt nicht etwa diese erwartete Fehlermeldung:

C:\Users\Tester>python
Der Befehl "python" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.

Statt dessen öffnet sich der Microsoft Store mit der Möglichkeit Python als App zu installieren.

Microsoft Windows [Version 10.0.18362.113]
(c) 2019 Microsoft Corporation. Alle Rechte vorbehalten.

C:\Users\Tester>python
C:\Users\Tester>

Man bekommt also keine Fehlermeldung mehr, sondern die Möglichkeit das fehlende Programm zu installieren.

Dabei handelt es sich um Python Version 3.7. Python 2.7 macht keinen Sinn denn Python 2.7 wird 2020 eh Geschichte sein: https://www.heise.de/developer/artikel/Die-Tage-sind-gezaehlt-End-of-Life-fuer-Python-2-4427023.html.

Man könnte nun den Errorlevel abragen, ob dieser gesetzt ist und in Batchdateien oder Skripten darauf reagieren. Wir nehmen dazu wie immer Powershell, damit kann man die betreffenden Werte einfacher abfragen:

PS C:\Users\Tester> $LASTEXITCODE
PS C:\Users\Tester> python
PS C:\Users\Tester> $LASTEXITCODE
9009
PS C:\Users\Tester>

Wir sehen also, dass der Errorlevel als 9009 zurückgegeben wird und keine Fehlermeldung erfolgt. Die Fehlermeldung müsste normalerweise lauten:

python : Die Benennung "python" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines
ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern
enthalten), und wiederholen Sie den Vorgang.
In Zeile:1 Zeichen:1
+ python
+ ~~~~~
    + CategoryInfo          : ObjectNotFound: (python:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Es gibt aber eine Besonderheit die es zu beachten gilt. Der Microsoft Store wird nur bei einer interaktiven Eingabe aufgemacht, sollte man die Abfrage nach dem Errorlevel nun Skripten wollen, dann kann man ewig warten. Aus diesem Grund hier ein kleines Powershell-Skript welches das Vorhandensein von Python prüft, gegebenenfalls den Storelink aufmacht und auf dessen Installation wartet:

$v=python –version
if ($v -eq $null) {
  start ‚ms-windows-store://pdp/?ProductId=9NJ46SX7X90P‘
};
do {
  $v=python –version
} until (($LASTEXITCODE -ne 9009) –or ($v -ne $null) )

An dieser Stelle kann man nun davon ausgehen, dass man Python auf dem Rechner hat. Zumindest für den aktuellen Benutzer, denn die Apps über den Store werden in der Regel pro Benutzer installiert. Dies verdeutlich sich auch bei der Suche nach den betreffenden Dateien. So sah es vor der Installation aus:

C:\Users\Tester>dir python.* /s
Volume in Laufwerk C: hat keine Bezeichnung.
Volumeseriennummer: 6247-3F6E

Verzeichnis von C:\Users\Tester\AppData\Local\Microsoft\WindowsApps

08.05.2019  00:16                 0 python.exe
               1 Datei(en),              0 Bytes

Verzeichnis von C:\Users\Tester\AppData\Local\Microsoft\WindowsApps\Microsoft.
DesktopAppInstaller_8wekyb3d8bbwe

08.05.2019  00:16                 0 python.exe
               1 Datei(en),              0 Bytes

Es gibt also eine Python.exe mit 0 Bytes, wenn man nach Python3.exe sucht wird man ebenfalls fündig.

Nach der Installation aus dem App Store gesellt sich ein weiteres Verzeichnis hinzu:

C:\Users\Tester\AppData\Local\Microsoft\WindowsApps\Python
SoftwareFoundation.Python.3.7_qbz5n2kfra8p0

In diesem Verzeichnis befinden sich nun weitere 0 Byte EXE-Dateien:

22.05.2019  07:48    <DIR>          .
22.05.2019  07:48    <DIR>          ..
22.05.2019  07:48                 0 idle.exe
22.05.2019  07:48                 0 idle3.7.exe
22.05.2019  07:48                 0 idle3.exe
22.05.2019  07:48                 0 pip.exe
22.05.2019  07:48                 0 pip3.7.exe
22.05.2019  07:48                 0 pip3.exe
22.05.2019  07:48                 0 python.exe
22.05.2019  07:48                 0 python3.7.exe
22.05.2019  07:48                 0 python3.exe
22.05.2019  07:48                 0 pythonw.exe
22.05.2019  07:48                 0 pythonw3.7.exe
22.05.2019  07:48                 0 pythonw3.exe

Man bekommt also durch die Installation des Python Pakets alle relevanten Python-Zusatzprogramme frei Haus geliefert.

Neben dem paketspezifischen Verzeichnis finden oben aufgeführte Pythonprogramme auch Einzug in das Verzeichnis C:\Users\Tester\AppData\Local\Microsoft\WindowsApps. Der Hintergrund dürfte sein, dass sich C:\Users\Tester\AppData\Local\Microsoft\WindowsApps bei den Umgebungsvariablen für die automatische Suche nach Programm also PATH aufgeführt wird. D. h. durch diese Vorgehensweise erreicht man, dass das Programm automatisch gestartet werden kann, egal wo man sich befindet. Gesagt getan:

C:\>python
Python 3.7.3 (tags/v3.7.3:ef4ec6ed12, Mar 25 2019, 22:05:12) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> quit()

Klappt also tatsächlich. Und wie verhält es sich mit anderen Programmen?

C:\>pip list
You are using pip version 19.0.3, however version 19.1.1 is available.
You should consider upgrading via the ‚python -m pip install –upgrade pip‘ command.

Klappt also auch, wobei, wenn man ein aktuelles Paket bezogen hat muss man nochmal Hand anlegen um PIP auf den aktuellen Stand zu bekommen? Tja ist leider so. Auch bei TAR, SSH und CURL geht Microsoft äußert konservativ vor und langt einmal hinzugefügte Programme nicht mehr an. Ob dies bei Python auch zutrifft werden wir sehen.

Aber die spannende Frage ist, kann ich pip trotzdem updaten?

C:\>python -m pip install –upgrade pip
Collecting pip
  Downloading https://files.pythonhosted.org/packages/5c/e0/be401c003291b
56efc55aeba6a80ab790d3d4cece2778288d65323009420/pip-19.1.1-py2.py3-none-any.whl
(1.4MB)
    100% |████████████████████████████████| 1.4MB 468kB/s
Installing collected packages: pip
  Found existing installation: pip 19.0.3
    Uninstalling pip-19.0.3:
Could not install packages due to an EnvironmentError: [WinError 5] Zugriff verweigert: ‚c:\\program files\\windowsapps\\pythonsoftwarefoundation.python.3.7_3.7.
1008.0_x64__qbz5n2kfra8p0\\lib\\site-packages\\pip-19.0.3.dist-info\\entry_points.txt‘
Consider using the `–user` option or check the permissions.

You are using pip version 19.0.3, however version 19.1.1 is available.
You should consider upgrading via the ‚python -m pip install –upgrade pip‘ command.

Also der erste Versuch ging schief aber ist auch nachvollziehbar, denn das Python-Paket würde dem Benutzer zugeordnet, mal sehen, ob es mit dem passenden Parameter klappt:

C:\>python -m pip install –upgrade pip –user
Collecting pip
  Using cached https://files.pythonhosted.org/packages/5c/e0/be401c003291b
56efc55aeba6a80ab790d3d4cece2778288d65323009420/pip-19.1.1-py2.py3-none-any.whl

Installing collected packages: pip
Successfully installed pip-19.1.1
You are using pip version 19.0.3, however version 19.1.1 is available.
You should consider upgrading via the ‚python -m pip install –upgrade pip‘ command.

Das sieht ja schon mal nicht schlecht aus:

C:\>pip list
Package Version
——- ——-
pip     19.1.1

Also man hat nun eine recht schnelle, einfache Methode Python auf seinen Rechner zu bekommen.

Soweit so gut! Allerdings, wie so oft gibt es einen Pferdefuß und der wird wahrscheinlich erst mit Python 3.8 oder 3.9 aus der Welt geschafft. Denn möchte man wirklich produktiv mit Python arbeiten, dann sollten solche Dinge nicht passieren:

C:>pip install flask

Installing collected packages: Werkzeug, MarkupSafe, Jinja2, click, itsdangerous, flask
  WARNING: The script flask.exe is installed in ‚C:\Users\Tester\AppData\Local\Packages\PythonSoftwareFoundation.
Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\Scripts‘ which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use –no-warn-script-location.
Successfully installed Jinja2-2.10.1 MarkupSafe-1.1.1 Werkzeug-0.15.4 click-7.0 flask-1.0.3 itsdangerous-1.1.0

D. h. ein einfacher Aufruf von “flask run” ist später nicht möglich. Als Lösung gibt es zwei Möglichkeiten, entweder man ruft

C:\Users\Tester\AppData\Local\Packages\PythonSoftwareFoundation.
Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\Scripts\flask.exe run

direkt auf oder man fügt den Pfad der Umgebungsvariablen PATH manuell hinzu:

set path=%path%;C:\Users\Tester\AppData\Local\Packages\PythonSoftware
Foundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\Scripts

Hier der Link zum Aufhängerartikel: https://devblogs.microsoft.com/python/python-in-the-windows-10-may-2019-update/

Möglich Probleme beim Erkennen ob Python installiert ist: https://github.com/Microsoft/PTVS/issues/5189, die Lösung ist das Beachten der PATH-Umgebungsvariablen.

Noch der Link zum Store: ms-windows-store://pdp/?ProductId=9NJ46SX7X90P sowie die Publisher-ID: qbz5n2kfra8p0

Werbeanzeigen

Thunderbird als Standard-E-Mail-Programm

14 Mai 2019

Bei einem aktuellen Thunderbird 60.6.1 unter Windows 7 wurde bei jedem Start nachgefragt, ob Thunderbird sich als Standard-E-Mail-Programm registrieren soll. Unabhängig was man auswählte, er war sowieso das Standard-E-Mailprogramm. Ein Aufruf aus einer anderen Anwendung funktionierte per SimpleMAPI also zuverlässig. Blöd war halt die Meldung. Aber gut. Die einfachste Lösung war einfach in den Thunderbirdeinstellungen das Häkchen für die Überprüfung wegzunehmen. Alles andere funktionierte trotzdem.

Links zum Thema:

https://bugzilla.mozilla.org/show_bug.cgi?id=1509918
https://support.mozilla.org/en-US/kb/make-thunderbird-default-mail-client
http://kb.mozillazine.org/Default_mail_client#Windows

VirtualBox auf Mac installieren und Fehlermeldungen wegen Kernel Extensions

10 Mai 2019

Auf einem aktuellen High Sierra 10.13.6 Mac OS System sollte VirtualBox 6.0.6 installiert werden. Bereits bei der Installation von VirtualBox gab es eine Fehlermeldung, mit dem Hinweis in den Systemeinstellungen unter Sicherheit das Laden der Oracle America Treiber zuzulassen. Nur leider funktionierte die Vorgehensweise nicht. Nach mehreren Versuchen mit De- und jeweils Neuinstallation von VirtualBox lief es immer noch nicht. Man konnte zwar VirtualBox aufrufen allerdings beim Start einer neu eingerichteten VM bekam man die Fehlermeldung “Systemerweiterung wurde blockiert” rc=-1908.

Nach einigem Suchen wurde ich auf diesen Eintrag aufmerksam: https://forums.virtualbox.org/viewtopic.php?f=8&t=84092. Da wird das Problem mit möglichen Lösungswegen beschrieben. Am Ende hat aber erst dieser Artikel die Lösung gebracht: https://ilgthegeek.wordpress.com/2018/01/27/macos-install-oracle-virtualbox-on-10-13/. Apple Dokument was abläuft: https://developer.apple.com/library/archive/technotes/tn2459/_index.html.

Kurz zusammengefasst:

  1. Mac herunterfahren
  2. Mit Command-R die Wiederherstellungskonsole aufrufen
  3. Im Dienstprogrammemenü das Terminal auswählen
  4. “spctl kext-consent add VB5E2TV963” ausführen
  5. Mac neu starten

Wie kommt man an das VB5E2TV963, welches die Entwicker-ID-Signatur darstellt? Bei der Installation von VirtualBox gibt es im Installationsassistenten oben rechts ein Schlosssymbol, klickt man dieses an, erhält man die nötige Info.

Wie man aktuell schnell Windows 7 aufsetzt

9 Mai 2019

Muss man Windows 7 aktuell neu aufsetzen dann ist die aktuelle offizielle Reihenfolge

1) Servicing Stack Update, z .B KB4490628

2) Kumulatives monatliches Rollup, z. B. KB4493472

3) .Net Framework 4.8 ndp48-x86-x64-allos-enu alternativ ndp472-KB405430-x86-x64-allos-enu

4) Windows Management Framework 4 (WMF4) – KB2819745

5) Reboot

6) WMF51 – KB3191566

zu 1)
Beschreibung zu Servicing Stack Updates: https://docs.microsoft.com/de-de/windows/deployment/update/servicing-stack-updates, hier findet man die neuesten Versionen für alle Betriebssysteme: https://portal.msrc.microsoft.com/en-us/security-guidance/advisory/ADV990001

zu 2)
Im Windows 7 Updateverlauf kann man das aktuelle Kumulative Update ausfindig machen: https://support.microsoft.com/de-de/help/4009469

zu 3) 4.8 wird die letzte .Net-Frameworkversion sein, 4.9 wird es nie geben!

zu 4) Muss leider vor WMF 5.1 installiert werden, sonst klappt WMF 5.1 nicht!

zu 5) ist leider zwingend erforderlich

Netgear Nighthawk M1 Ressourcen

1 Mai 2019

Der Netgear Nighthawk M1 (MR1100) ist ein kleiner, mobiler LTE-Router der viele Features mitbringt. Durch Anbringung einer externen Antenne lässt er sich auch bei schwächerem Signal einsetzen. Im Innern werkelt ein Qualcomm Snapdragon X16 LTE Modem als Basis.

Allerdings gibt es manche Features die sind nicht per Web-GUI einstellbar. Um hier zum Zuge zu kommen muss man Telnet verwenden. Um Telnet bei einer aktuellen Windowsversion installiert zu bekommen hier weiterlesen: ?????

Ist man mittels WLAN mit dem Router verbunden, ruft telnet mit der Standard-IP-Adresse des Routers 192.168.1.1 oder DNS-Namen m1login.net auf, so erhält man diese Meldung.

PS > telnet 192.168.1.1
Verbindungsaufbau zu 192.168.1.1…Es konnte keine Verbindung mit dem Host hergestellt werden, auf Port 23: Verbindungsfehler

Schaut man sich um Internet um, so gibt es Hinweise darauf, dass der Port 5510 verwendet werden muss

PS > telnet 192.168.1.1 5510
Verbindungsaufbau zu 192.168.1.1…Es konnte keine Verbindung mit dem Host hergestellt werden, auf Port 5510: Verbindungsfehler

Liest man weiter, dann erfährt man, dass die Verbindung über den USB-Port bzw. den Ethernetport im Bridgemodus gemacht werden muss.

Dann klappt es tatsächlich und man wird von einem leeren Bildschirm mit blinkendem Cursor begrüßt.

Am Anfang dachte ich die Telnetsession hängt, aber faktisch ist es kein Zugang zu einer Linuxshell sondern nur zu einer Console für AT-Kommandos.

Also gibt man für die Interaktion AT-Kommandos ein. Dabei wird in meinem Fall jede sinnvolle Eingabe gespiegelt. D. h. man tippt AT ein und es wird AATT angezeigt. Dadurch kann man schnell rausfinden welche Befehle erlaubt sind und welche nicht. Denn nicht erlaubte Befehle werden einfach nicht Rückgekoppelt.

Das einfachste Kommando ist AT, welches dann so aussieht:

AATT

OK

AT Kommandos kommen noch von uralten Modemzeiten. Man nennt sie auch Hayes-Befehle von einem damaligen Modemhersteller.

Hier nun ein paar Beispiel welche AT-Kommandos welche Ausgabe zur Folge haben (ohne eingelegte SIM-Karte!):

AT+CGMI

Netgear, Incorporated

AT+CGMM

MR1100

AT!PACKAGE?

MR1100-100EUS_NTG9X50C_12.06.03.00_Generic_05.01

ATI

Manufacturer: Netgear, Incorporated
Model: MR1100
Revision: NTG9X50C_12.06.03.00 r3480 ntgrbc-fwbuild2 2018/10/12 11:29:56
IMEI: xxxxxxxxxxxxxxx
IMEI SV: 10
FSN: xxxxxxxxxxxxx
+GCAP: +CGSM,+DS,+ES

AT!GSTATUS?

!GSTATUS:
Current Time:  416              Mode:        ONLINE
System mode:   WCDMA            PS state:    Not attached
Tx Power (dBm):
GMM (PS) state:DEREGISTERED     NO IMSI
MM (CS) state: IDLE             NO IMSI

RxM RSSI C0:    —             RxD RSSI C0:  —
RxM RSSI C1:    —             RxD RSSI C1:  —

AT!CUSTOM?

!CUSTOM:
            PCSCDISABLE         0x03
            GPSSEL              0x01
            AUTONETWORKMODE     0x02
             CFUNPERSISTEN       0x01
            SINGLEAPNSWITCH     0x04
            USBSERIALENABLE     0x02
            NATENABLED          0x01
            HSICON              0x01
            SECCENABLE          0x01
            TFTPSERVERDISABLE   0x01

AT!BAND=?

Index, Name,                        GW Band Mask     L Band Mask      L ext Band Mask
00, Auto,                           0002000004C00000 000001A0080800C5 0000000000000000
01, WCDMA All,                      0002000004C00000 0000000000000000 0000000000000000
02, LTE All,                        0000000000000000 000001A0080800C5 0000000000000000

                                                     0000010000000000 – B41
                                                      0000008000000000 – B40
                                                     0000002000000000 – B38
                                                      0000000008000000 – B28
                                                      0000000000080000 – B20
                                                      0000000000000080 – B8
                                                     0000000000000040 – B7
                                                      0000000000000004 – B3
                                                      0000000000000001 – B1
                                     0002000000000000 – B8  (900)
                                     0000000004000000 – B5  (850)
                                     0000000000800000 – B2 (1900)
                                     0000000000400000 – B1 (2100)

AT!BCINF

SBL1
Addr: 8FFFF204
Ver:  NTG9X50C_12.06.03.00 r3480 ntgrbc-fwbuild2 2018/10/12 11:29:56
Date: 10/12/18
Size: 0001753C
CRC:  1DB74524

NVBF
Addr: Not applicable
Ver:
Date: 01/06/80
Size: 00048770
CRC:  6EA81F1B

NVBO
Addr: Not applicable
Ver:
Date: 01/06/80
Size: 00004ED1
CRC:  5B83691E

NVBU
Addr: Not applicable
Ver:
Date: 01/06/80
Size: 0001160F
CRC:  3273A3BE

NVBC
Addr: Not applicable
Ver:
Date: 01/06/80
Size: 000002FF
CRC:  5F408E03

SPLA
Addr: C435CC90
Ver:  BtSplash_01.01.29.00  r20046 carmd-vmwsk11 2017/07/27 15:16:03
Date: 07/27/17
Size: 0000C234
CRC:  669958E6

AT^SYSINFO

^SYSINFO: 1,0,1,5,255

AT!ERR

QDSP6                     ARM9 (not saved)
00   01 bsunused 00121
01   02 gsnvif   00698
02   02 sys_eplm 00591
03   04 sys_eplm 00762

AT!RESET

Soll den M1 neu booten.

AT!BOOTHOLD

Nicht probiert, soll aber funktionieren und wartet beim Bootvorgang, bzw. öffnet wahrscheinlich weitere Ports für Firmwareupdates… In diesem Zusammenhang sei noch auf den Windows Update Catalog verwiesen mit dem Stichwort HS-USB QDLoader, welcher ein Qualcomm Driver Loader(?) darstellt. Ein weiteres Stichwort ist Sierra Wireless bzw. .

Wenn man Informationen sucht, dann gibt es einige Foren wo über den M1 diskutiert wird. Zu allererst wäre das Netgear eigene Community-Forum zu nennen: https://community.netgear.com/t5/Nighthawk-WLAN-Router/bd-p/de-heim-wlan-router-nighthawk, https://community.netgear.com/t5/Mobile-Routers-Hotspots-Modems/bd-p/aircard, dann gibt es noch ein aktives Forum in Österreich: https://www.lteforum.at/mobilfunk/das-erste-1gbit-lte-netgear-mr1100-nighthawk-m1.6908/, auch ein russisches Forum kümmert sich drum: https://4pda.ru/forum/index.php?showtopic=778715&st=700, gleich in Übersetzung: https://translate.google.de/translate?sl=auto&tl=de&u=https%3A%2F%2F4pda.ru%2Fforum%2Findex.php%3Fshowtopic%3D778715%26st%3D700, viele technische Daten sind hier verzeichnet: https://wikidevi.com/wiki/Netgear_Nighthawk_M1_(MR1100).

Als letztes noch die offizielle Supportseite von Netgear: https://www.netgear.de/support/product/MR1100EUS.aspx

Microsoft baut mal wieder um, Technet und MSDN Blogs sind nun unter TechCommunity zu finden

1 Mai 2019

Wer sich teilweise wundert, warum die Links in verschiedenen Artikeln in diesem Blog wo mit blogs.msdn oder blogs.technet anfangen im Nirgendwo landen, dem sei gesagt, dass Microsoft mittlerweile alles in seine seit 2016 bestehende techcommunity umzieht. Leider gehen dabei auch so originäre Posts wie der Grund für den Umzug verlustig: https://blogs.msdn.microsoft.com/iotdev/2018/10/22/blog-migration/.

Hier die erste Ankündigung was es mit techcommunity auf sich hat: https://techcommunity.microsoft.com/t5/Tech-Community-Blog/Announcing-the-Microsoft-Tech-Community/ba-p/8691. Damals 2016 waren die anderen Blogs alle noch separat, aber bei den Kommentaren wird bereits der Gedanke eröffnet technet und msdn mit rüberzunehmen.

Hier ein ZDNet-Artikel der die Sache nochmal kurz umreißt: https://www.zdnet.com/article/as-microsoft-moves-more-blogs-off-its-msdn-and-technet-sites-heres-how-to-stay-current/.

Ein Eintrag speziell für Entwickler: https://devblogs.microsoft.com/visualstudio/microsofts-developer-blogs-are-getting-an-update/.

Wenn man nun alte alte Artikel sucht wo im Nirgendwo landen, was kann man machen?

Man sucht z. B.

https://devblogs.microsoft.com/iotdev/blog-migration/

man kann dazu das Internetarchiv befragen:

https://web.archive.org/web/20190108032919/https://blogs.msdn.
microsoft.com/iotdev/2018/10/22/blog-migration/

Man kann die meisten der Seiten über web.archive.org/web einsehen.

Künftig sind auf jeden Fall alle Blogs zentral hier zu finden: https://techcommunity.microsoft.com/t5/custom/page/page-id/Blogs.

Manchmal findet man aber im web.archive nicht alle Blogs dann sind die Informationen meist verloren. Wenn man im Vorfeld mitbekommt, dass ein Blog verschwinden soll, dann kann man diesen mittels eines Powershell Script noch schnell versuchen zu sichern. Zum Thema hat sich Vadims Podāns hier https://www.sysadmins.lv/blog-en/how-to-save-disappearing-msdn-and-technet-blogs-with-powershell.aspx ausgelassen und das passende Script erzeugt.

Weitere Erkenntnisse zu Tar unter Windows 10

25 März 2019

In diesem Artikel bin ich schon auf TAR.EXE unter Windows 10 eingegangen: https://newyear2006.wordpress.com/2018/10/21/tar-exe-unter-windows-10-der-neue-tausendsassa/. Nun habe ich weitere Erkenntnisse und diese möchte ich in diesem Artikel beschreiben. Dies wird sicher nicht der letzte Artikel zu diesem Thema sein, denn es gibt noch einiges zu entdecken bzw. es gibt noch die eine oder andere Ungereimtheit aber dazu ein anderes Mal mehr.

Genereller Hinweis:

Da macht man sich Mühe und testet alles durch, danach ladet man den Artikel hoch doch dann grätscht WordPress rein und zerhaut einem die mühsam hinterlegte Formatierung Sad smile. Also überall wo in diesem Artikel ein langer Bindestrich steht sollten eigentlich zwei Minuszeichen stehen. Also Hirn einschalten beim Copy und Paste…

Kurze und lange Parameterangaben
Tar kennt kurze wie lange Parameter, z. B. sind diese alle drei Zeilen identisch:

tar -caf test.zip *

tar -c –a -f test.zip *

tar –create –auto-compress –file test.zip *

Teilweise findet man im Internet Beispiele wo tar anstatt mit dem Parameter -caf  einfach nur mit caf, also so angegeben wird, auch dies ist zulässig:

tar caf test.zip *

Nicht direkt aber dennoch auch von Bedeutung ist die Angabe von Parametern mit Gleichheitszeichen, so sind diese beiden Aufruf identisch:

tar –format=7zip –options=7zip:compression=STORE -cf ..\testNeu.7z *

tar –format 7zip –options 7zip:compression=STORE -cf ..\testNeu.7z *

Tar ist so schlau und erkennt die einzelnen Parameter und kann sie problemlos auseinanderhalten, selbst wenn doppelte Gleichheitszeichen wie im zweiten Beispiel angegeben sind.

Einfaches Erzeugen von ZIP-Dateien
Die einfachste Variante ein ZIP-Archiv zu erstellen ist, indem man tar automatisch anweist die Dateiendung zu analysieren um daraus auf das zu verwendende Format zu schließen, dazu gibt man den Parameter a mit an:

tar.exe -caf test.zip *

Unterverzeichnisse ausschließen
Gibt man keinen speziellen Parameter an, werden alle Dateien inklusive deren Unterverzeichnisse gesichert bzw. zurückgespielt. Man kann dieses Verhalten ändern indem man den Parameter -n bzw. die Langform –norecurse bzw. –no-recursion verwendet. Aber nicht erschrecken, obwohl man diesen Parameter angegeben hat wird der eigentlich Verzeichnisname mitgesichert, nur der Inhalt darunter liegenden Dateien nicht!

tar.exe -cnaf test.zip *

Obige Zeile erzeugt also eine ZIP-Datei ohne die Unterverzeichnisinhalte mit zu nehmen.

Groß-/Kleinschreibung ist ein Problem
BSDtar kommt aus der Unix-Welt und da ist die Groß-/Kleinschreibung wichtig! D. h. testex.txt, Testex.txt und z. B. TESTEX.TXT sind alles unterschiedliche Dateien.

Dies wirkt sich auch an unerwarteter Stelle aus, wenn man obiges Beispiel zum Erzeugen einer ZIP-Datei z. B. so schreibt:

tar.exe -caf test.ZIP *

so erhält man keine ZIP-Datei! Statt dessen wird ein konventionelles Tar-Archiv erzeugt.

Ausschließen von Dateien
Sollen bestimmte Dateien nicht gesichert werden dann kann man diese mit dem Parameter –exclude angeben. Exclude kann auch mehrfach angegeben werden, ja muss in Einzelfällen sogar mehrfach angegeben werden, wenn man z. B. im Vorfeld nicht weiß, ob der Dateinamen groß- oder kleingeschrieben wurde.

Am sichersten verwendet man diese drei Varianten, wobei es sicher noch Fälle gibt, wo es nicht klappt:

tar.exe –exclude testex.txt –exclude Testex.txt –exclude TESTEX.TXT -caf test.zip test*

Unter GNU-Tar gibt es den tollen Parameter –ignore-case, doch leider funktioniert dieser bei BSDtar nicht:

tar –ignore-case –exclude testex.txt -caf test.zip test*
tar.exe: Option –ignore-case is not supported

Natürlich wird der Aufruf dadurch schnell unübersichtlich, zum Glück gibt es den Parameter –exclude-from welcher die Angabe eines Dateinamens erlaubt. Mit Powershell kann man dann z. B. sowas machen:

"testex.txt","Testex.txt","TESTEX.TXT" | set-content -Path exclude.txt
tar.exe –exclude-from exclude.txt  -caf test.zip test*

Verhinderung unnötiger Meldung
Manchmal muss man ein Archiv in genau dem Verzeichnis erstellen, welches man sichern möchte. Wenn man alles ohne Ausnahme sichert, dann versucht tar das eigene Archiv nochmals mit zu sichern. Dies wird erkannt und durch folgende Meldung quittiert:

tar.exe -caf Sicherung.zip *
tar.exe: Couldn’t open Sicherung.zip: Permission denied
tar.exe: Error exit delayed from previous errors.

Das Archiv wird trotzdem erstellt, also kein Problem. Sieht halt nur unschön aus. Das Thema kann über einen Aufruf über Powershell und dem expliziten Ausschließen des Archivnamens verhindert werden:

$archive=’Sicherung.zip‘; tar.exe –exclude=$archive -caf $archive *

Verwendung von Optionen
Jedes Format welches von Tar unterstützt wird kennt seine eigenen Optionen. Optionen werden immer eingeleitet durch den Parameter –options. Gibt man Optionen speziell für ein bestimmtes Format an, so gibt man den Formatnamen z. B. zip gefolgt von einem Doppelpunkt und dann dem eigentlichen Optionsparameter. Dadurch kann man bei ZIP-Dateien den Kompressionsfaktor angeben. So erzeugt diese Option die höchste Kompression, Standard ist anscheinend 6, welches von der ZLib-Bibliothek vorgegeben ist.

–options zip:compression-level=9

Weiß man, dass man in einem Archiv mehr als 4GB an Daten speichern muss, kann man gleich den Parameter für die Zip64-Unterstützung angeben:

–options zip:zip64

Will man das ZIP-Archiv schützen, dann kann man noch eine Verschlüsselung mitangeben, es werden drei Varianten unterstützt:

–options zip:encryption=zipcrypt

–options zip:encryption=aes128

–options zip:encryption=aes256

Komplett könnte ein Aufruf also so aussehen:

tar.exe –format=zip –options zip:zip64 –options zip:encryption=aes256 –passphrase=MeinPassword -cf test.zip *

7Zip-Unterstützung
Tar unterstützt eigentlich 7Zip, wenn man jedoch eine 7Zip-Datei versucht zu entpacken, dann passiert folgendes:

tar -xvf .\test.7z
x test.txt: LZMA codec is unsupported
tar.exe: Error exit delayed from previous errors.

Trotzdem kann aber Tar das Verzeichnis des Archivs auflisten:

tar -tvf .\test.7z
-rw-rw-rw-  0 0      0           7 Mrz 25 09:26 test.txt

Man könnte nun sagen, ok vielleicht klappt es nicht mit LZMA aber es gibt ja noch LZMA2, doch leider:

tar -c –format 7zip –options 7zip:compression=lzma1 -f .\test.7z test.txt
tar.exe: `lzma1′ compression not supported on this platform
tar -c –format 7zip –options 7zip:compression=lzma2 -f .\test.7z test.txt
tar.exe: `lzma2′ compression not supported on this platform

Als Bestätigung, dass der Parameter korrekt angegeben wurde, kann man einfach etwas unsinniges angeben:

tar -c –format 7zip –options 7zip:compression=lzma3 -f .\test.7z test.txt
tar.exe: Unknown compression name: `lzma3′

Also müssen wir davon ausgehen, dass Microsoft das zugehörige lzma-Modul für hochwertige Kompression von 7Zip-Dateien nicht mit eingebaut hat. Schade.

Man kann jedoch problemlos 7Zip-Dateien erstellen, diese sind dann allerdings nicht hochgradig komprimiert sondern nur mit einem einfachen Deflate-Algorithmus gestaucht.

TAR.exe Rückgabe von Fehlercode
Tar.exe gibt immer einen Errorlevel zurück, unter Powershell kann dieser mittels $LastExitCode ganz einfach abgefragt werden. Ist dieser 0 war die Abfrage erfolgreich, ist er 1 trat ein Fehler auf.

Parameter –fast-read
Der Parameter –fast-read macht auf den ersten Blick keinen Sinn, denn er sorgt dafür, dass die weitere Verarbeitung eines Archivs gleich gestoppt wird.

Dieser Parameter ist aber nützlich um schnell eine Information über ein Archiv zu erhalten ohne es komplett verarbeiten zu müssen. Vor allem bei großen Archiven sorgt dies für eine enorme Zeitersparnis.

Möchte man also nur wissen, ob eine bestimmte Datei enthalten ist, ruft man

tar.exe –fast-read -tf archiv Datei

auf und fragt den $LastExitCode ab.

Anwendung bei .CAB-Dateien
Unter Windows hat man es ab und an mit .CAB-Dateien zu tun, welche z. B. für Updates benötigt werden. Seither musste man mit dem Befehl Expand.exe arbeiten, alternativ kann man nun tar.exe verwenden. So sind diese beiden Aufrufe identisch, sie geben beide den Inhalt des Archivs aus:

expand.exe -D  CabDatei.CAB
tar -tvf CabDatei.CAB

Man kann zwar CAB-Dateien entpacken, allerdings nicht mit tar.exe packen, denn tar kann nur lesend auf CAB-Dateien zugreifen!

Wildcards bzw. Patterns
Man kann bei den Verzeichnis- und Dateinamenparametern wie –exclude auch Wildcards angeben, diese richten sich nach den “Filename substitution”-Richtlinien aus https://www.freebsd.org/cgi/man.cgi?query=tcsh. Es sind zwar keine vollständigen RegEx-Ausdrücke möglich aber Angaben wie

Zur Vereinfachung zur Erzeugung der nötigen Patterns kann man diese Funktion verwenden:

Function New-GKPattern ($String) { (($String.ToLower().tochararray()) | % {$t=[System.Convert]::ToString($_); If ($t.ToLower() -ceq $t.ToUpper()) {$t} else {"[$($t.ToLower())$($t.ToUpper())]"}}) -join “}

Die Funktion macht aus

New-GKPattern "Agent§$%"

den String "[aA][gG][eE][nN][tT]§$%", jeder Buchstabe wird als groß und klein angegeben, Zeichen oder Buchstaben wie ß wo es keine unterschiedliche Schreibweise gibt, werden direkt übernommen.

Mit dieser Methode könnte man obiges Beispiel wo der exclude-Parameter beschrieben war so verwenden:

tar.exe –exclude $(New-GKPattern ‚testex.txt‘)  -caf test.zip test*

Verwendung unter WinPE und WinRE
Man kann Tar direkt unter WindowsPE kurz WinPE bzw. im Windows Recovery Environment kurz WinRE verwenden. Doch leider ist Tar in diesem Umgebungen nicht direkt enthalten (Stand 1903, Build 18361). Man kann allerdings von einer anderen Windows 10 (64-Bit) Maschine aus dem Verzeichnis C:\Windows\System32 die Dateien tar.exe sowie archiveint.dll kopieren um Tar wie gewohnt verwenden zu können. Übrigens kann man auch curl.exe gleich mitnehmen, dies könnte in bestimmten Situationen auch hilfreich sein. Bei curl.exe scheint es keine weiteren Abhängigkeiten zu geben.

Weitere Infos zu Tar
Möchte man etwas speziell über Möglichkeiten von Tar.EXE wissen, dann ist ein Blick in den Sourcecode hilfreich. Man holt sich einfach die Version durch

tar –version

und geht mit der libarchive Version auf ein definiertes Tag z. B.

https://github.com/libarchive/libarchive/tree/v3.3.2

Oder automatisiert:

$version = (((tar.exe –version) -split ‚-‚)[1] -split ‚ ‚)[2]
start "https://github.com/libarchive/libarchive/tree/v$version"

Windows Desktop mit FFMPEG aufzeichnen

28 Februar 2019

Um mal schnell etwas in Windows als Video aufzuzeichnen gibt es viele verschiedene Möglichkeiten. Bei Windows 10 gibt es mittlerweile die GameBar bzw. Spielleiste aus dem App-Store. Allerdings kann die Spielleiste nur 3D Spiele oder Anwendungen aufzeichnen, also braucht man etwas anderes. Da kommt FFMPEG zur Hilfe,das ultimative Werkzeug wenn es um Video-oder Audio-Dateien geht. https://ffmpeg.zeranoe.com/builds/.

Um nun den Desktop aufzuzeichnen verwendet man

.\ffmpeg.exe -f gdigrab -draw_mouse 1 -framerate 30 -i desktop -f dshow -i audio="@device_cm_{33455762-9558-1340-BD43-34453454CE86}\wave_{E3453455-0445-4D3F-92FF-573453453E3E}" output.mp4

Zum Beenden der Aufzeichnung holt man das Fenster mit obigem Befehl wieder in den Vordergrund und bricht die Aufzeichnung mittels STRG+C ab. Die Aufzeichnung landet in output.mp4 im aktuellen Verzeichnis.

Durch die Angabe von –f gdigrab und –f dshow benutzt man zwei Filter, einmal für die Videoaufzeichnung mit –i desktop und bei –i audio… für die Audioaufzeichnung.

Der Parameter –draw_mouse 1 zeichnet die Maus mit auf, bei –draw_mouse 0 würde die Maus nicht mitaufgezeichnet.

Um den Mauszeiger größer zu bekommen verwendet man

start main.cpl

bzw. unter Windows 10 gleich

start ms-settings:easeofaccess-mouse

Für die Soundeinstellunge um z. B. das Mikrofon anzupassen verwendet man

start mmsys.cpl

control /name Microsoft.Sound

oder unter Windows 10

start ms-settings:sound

Zur Ermittlung der zur Verfügung stehenden Audioquellen verwendet man diesen Befehl:

ffmpeg -list_devices true -f dshow -i dummy

Dabei kann das Problem entstehen, dass ein Umlaut wie im Wort Kopfhörer zu Windows-typischen Problemen führt, wie hier:

[dshow @ 0000354540145480]  "Kopfh├Ârermikrofon (Plantronics Blackwire 5220 Series)"
[dshow @ 00000114d01e8a80]     Alternative name "@device_cm_{33455762-9558-1340-BD43-34453454CE86}\wave_{E3453455-0445-4D3F-92FF-573453453E3E}"

Die Zeichen ├ sollte eigentlich ein ö für Kopfhörer sein. In solch einem Fall verwendet man den alternativen Namen:

"@device_cm_{33455762-9558-1340-BD43-34453454CE86}\wave_{E3453455-0445-4D3F-92FF-573453453E3E}"

Hier noch die offizielle Doku zur Desktopaufzeichnung: https://trac.ffmpeg.org/wiki/Capture/Desktop und zu DirectShow: https://trac.ffmpeg.org/wiki/DirectShow. Sowie https://ffmpeg.org/ffmpeg.html#Video-and-Audio-grabbing.

Farbe für die Kommandozeile und was man dagegen tun kann

26 Februar 2019

In immer mehr Kommandozeilenausgaben findet man farblich unterlegte Ausgaben. Dies ist sicher sinnvoll und gut gemeint aber teilweise auch problematisch beim Weiterverarbeiten der Ausgaben. Selbst Microsoft hat aber diesen Trend erkannt und unterstützt bei neueren Windows 10 Versionen VT-Escapecodes https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences.

Wenn nun aber alles schön bunt wird, man es aber nicht so bunt mag oder es gar nicht brauchen kann, findet man sich bei dieser Initiative wieder: https://no-color.org/. Hier wird auch teilweise beschrieben wie man bei verschiedenen Programmen die bunte Ausgabe auch unterdrücken kann.

Lenovo versteckte Tastaturbelegungen

22 Februar 2019

Tastaturen bei Lenovo Notebooks sind ja nicht schlecht. Allerdings sind auf den neueren Tastaturen viele Tastenkombinationen nicht mehr offensichtlich die man ab und an mal braucht.

Z. B. Break oder Pause-Taste.

Break (FN + B) or (FN + Ctrl + B)
SysRq (FN + S)
ScrLK (FN + K)
Pause (FN + P) or (FN + Alt + P) or (FN + Ctrl + P)

https://support.lenovo.com/by/en/solutions/ht074004
https://support.lenovo.com/by/en/solutions/ht503647

Übersichtsseite von Lenovo zu Tastatur und Maus-Themen: https://support.lenovo.com/by/en/solutions/ht503907

Da wir gerade bei Tastaturen sind, vielleicht noch der Verweis auf Windows 10 Tastenkürzel:

https://support.microsoft.com/en-us/help/12445/windows-keyboard-shortcuts