Wie gut seit ihr mit der Windows Comandozeile (CMD) vertraut?
Wenn ja, woher kennt ihr euch aus?
z.B. hatte schon ein MSDos,...
Das Ergebnis basiert auf 30 Abstimmungen
13 Antworten
Meine "Spielwiese": https://www.gutefrage.net/home/thema/batch-trick/neue
Wenn man viele Jahrzehnte in der Console "zuhause" ist, sollte man schon einiges an Erfahrungen gesammelt und noch mehr Überraschungen erlebt haben.
CMD ist lediglich eine Weiterentwicklung des command.com aus der Dos-Ära.
Es sind einige interne Erweiterungen hinzugekommen um (mehr schlecht als recht) den Anforderungen von Windows gerecht zu werden:
- lange Dateinamen, welche auch Leer- und Sonderzeichen enthalten können.
- Starten von parallel laufenden Prozessen (unter Dos war ja nur ein laufender Prozess möglich)
- Extensionen und verzögerte Variablenexpansion
- fix des leidigen Errorlevelbugs. (hier kommt es darauf an, welche Endung eine Batchdatei hat: .cmd =neues Errorhandling , .bat Doskompatibles Errorhandling.
- einige neue interne und externe Befehle
Alles im Einzelnen aufzuführen würde ein Buch füllen.
Da es zu jeder Zeit eine große Menge Administrativer Scripte gab, welche trickreich Bugs oder andere Unzulänglichkeiten umgingen, nutzen, missbrauchten konnte cmd nie in dem Maße gefixed werden wie es nötig gewesen wäre um alle Fehler zu beseitigen.
wäre dies geschehen, wäre folgendes unmöglich:
set "str=Hallo. Ich bin ein kleiner Blindtext..maeh.. Und zwar schon so lange ich denken kann."
rem entferne Punkte. (normales Stringreplace)
echo %str:.=%
rem entferne alles links vom ersten Punkt.
echo %str:*.=%
rem Tausche alle l gegen R
echo %str:l=R%
rem ...soweit normales Vehalten
rem jetzt wird es misteriös:
rem entferne alles rechts vom ersten Punkt
rem Hintergrund: ersetze den Punkt durch .&Kommanndo...
rem das wird intern für jede Vorkommen getan ...(nur das der Parser dies auch gleich ausführt)
rem ...&rem:tut nichts , also werden alle folgenden vorkommen verschluckt...
rem was bleibt ist der erste Teil das Strings
echo %str:. =.&rem:%
rem ...folglich geht dies auch:
echo %str:. =.&echo:%
rem und nur nach letztem trenner ausgeben
echo %str:. =.& set last=%
echo blubb %last%
rem teile und nummeriere
(echo %str:. =.&echo:%)|find /n /v ""
rem verteile auf mehrere Variablen (ohne delayedExp.)
for /f "tokens=1* delims=[]" %%a in ('^(echo %str:. =.^&echo:%^)^|find /n /v ""') do (set str.%%a=%%b)
set str.
...ok, dass man in einer Ersetzungsvariable einen String gegen einen Befehl austauschen kann, welcher auch sofort ausgeführt wird, weiß fast niemand...
...und so gibt es tausende Tricks, welche man benötigt um einigermaßen vernünftig mit cmd/Batch arbeiten zu können .
Wie andere ältere Herrschaften zum Zeitvertreib Kreuzworträtsel lösen, war es in den vergangen Jahren mein Hobby die Möglichkeiten von Cmd/Batch bis an die Grenzen des Möglichen auszureizen. Immer in dem Wissen, dass sich vieles in einer Anderen Sprache wesentlich bequemer lösen ließe. Einfach die Sportliche Herausforderung (Gewichtheber stemmen 250 kilo und mehr , dass könne man auch mit einem Gabelstabler erledigen😅) ... also haltet mich nicht für total durchgeknallt)
Im realen Leben schätze ich stattdessen moderne Programmier-/Scriptsprachen wie C# oder Powershell.
- Um mal schnell eine Abfolge von Programmen zu starten ist Batch in jedem Fall effizienter, als Powershell,
- geht es jedoch darum, automatisch komplexe Daten als Entscheidungskriterien für Dateioperationen, auszuwerten, ist Powershell die bessere Wahl. und extem Mächtig:
Taskleiste verstecken (und wieder Sichtbar machen):
toggleTaskBar.ps1
$myType=Add-Type -MemberDefinition @'
[DllImport("user32.dll")] public static extern int FindWindow(string className, string windowText);
[DllImport("user32.dll")] public static extern int ShowWindow(int hwnd, int command);
'@ -Namespace WNDtools -Name WND -passthru
$hwnd = $myType::FindWindow("Shell_TrayWnd","");
if (($myType::ShowWindow($hwnd,0)) -eq 0) {$Null=$myType::ShowWindow($hwnd,1)}
Da es aber lästig ist Powershellscripte mit Rechtsklick zu starten, kann man ein ganzes PowershellScript auch in eine Batch verpacken, dann geht normaler Doppelklick. damit findet sich doch wieder ein nutzen für cmd/batch:
toggleTaskbar.cmd
@echo off
powershell "$myType=Add-Type -m '[DllImport("""user32.dll""")] public static extern int FindWindow(string className, string windowText);[DllImport("""user32.dll""")] public static extern int ShowWindow(int hwnd, int command);' -Name WND -pass;$hwnd=$myType::FindWindow('Shell_TrayWnd','');if (($myType::ShowWindow($hwnd,0)) -eq 0) {$Null=$myType::ShowWindow($hwnd,1)}"
Ich kann damit umgehen aber auch hier müsste ich die Befehle nachsehen. Das letzte Mal dass ich CMD oder Powershell verwendet habe, war um einen Datenträger zu partitionieren oder formatieren, weil es mit den normalen Mitteln nicht funktionierte.
Für mehr brauche ich es eigentlich nicht.
Computerferwaltung > Datenträgerferwaltung.
Da findetman die Funktionen. (WINDOWS 10/11 bei anderen müsste es genausosein, aber ich habe das nie getestet)
Meine Linux Kenntnisse sind da besser, aber gerade, wenn es um komplettes Scripting geht, mit der CMD, habe ich extra Tools, damit ich dieses Scripting in C# machen kann, ohne Visual Studio zu benutzen. Für mich, als .NET Entwickler, macht es das um einiges einfacher.
- dotnet-repl
- dotnet-script
Das sind so die Tools, die ich benutze. Die funktionieren sehr gut.
CMD an sich, wie auch PowerShell bekomme ich hin (mit Google als Hilfe). Eigenständig nur sehr eingeschränkt. Auf Linux bin ich da viel mehr erfahren. Das liegt einfach daran, dass ich einen Linux Server habe, welcher nur über die Commandline läuft und bei Windows habe ich viel UI, weshalb ich es meistens nicht brauche.
User Interface. Vielleicht dann doch eher GUI sagen, denn das G steht für Graphical. Ist eventuell verständlicher. In dem Fall meint es den grafischen Bereich, der hilft, eine Kommunikation mit dem Gerät herzustellen. Beispiel: Labels (Text), Klickbare Elemente, wie Buttons und Links, usw.. Vereinfacht ausgedrückt
Gut, aber nicht sehr gut. Batch wird in der Regel nicht verwendet, da greife ich lieber zu PowerShell.
Einfach, weil ich Entwickler bin und immer wieder die CLI nutze von verschiedenen Betriebssystemen.
Was macht man mit der Powershell ?
Habe bisher keinen Nutzen gesehen!
PowerShell ist eben ein Skript, das direkt auf die Windows Ressourcen zugreifen kann, ohne große Umwege oder Libraries und dabei auch Windows Tools wie Active Directory verwenden kann.
Naja,
wenn man einst DOS gelernt hat,
kommt einem das schon leicht von den Fingern.
Wobei [F1] die zur wichtigen Taste wird,
wenn man die Syntax wieder mal verhaut hat.
Aber man muss immer wieder auffrischen und dazu lernen.
Ist halt irgendwie aus der Steinzeit, aber man kommt (fast) an Alles ran.
Wo es hieß: Aufschreiben ist gut fürs Merken.
Da hat man mit Linux bessere Möglichkeiten.
Hansi
Was bedeutet eigentlich immer dieses UI?