Ist Powershell nur eine Erweiterung von Windows cmd?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Powershell ist eine eigenständige, moderne und extrem mächtige Script-/Programmiersprache.

Cmd/Batch ist hingegen ein verbugtes Relikt aus der Vergangenheit. Seit über 30 Jahren wird daran herumgeflickt um es mit den Features eines Modernen Betriebssystems kompatibel zu machen und gleichzeitig uralte Batchdateien lauffähig zu erhalten. Welche "Blüten" dieser "Spagat" zwischen zwei Welten in der praktischen Anwendung tragen kann, darfst Du gern auf meiner hiesigen Spielwiese beäugen : https://www.gutefrage.net/home/thema/batch-trick/neue . Wenn du wert auf eine "sehr langärmlige" Jacke legst empfehle ich: https://www.gutefrage.net/frage/csv-daten-in-batch-anzeigen#answer-451313130 ....wie gesagt für mich eine schrullige Spielerei...

Das ich dabei gelegendlich auch Powershell-Einzeiler und Hybridscript in Batch verwende ist oft nur dem Umstand geschuldet das das Powershellscripte gewissen Restriktionen unterliegen, welche sich mit einer Batch aushebeln lassen.

(bezogen auf ein StandardWindows)

  • Man kann ein Powershellscript nicht per Doppelklick starten.
  • Man kann keine markierten Dateien auf ein Powershellscript droppen um diese automatisiert abzuarbeiten.
  • bis Powershell 5.1 ist die Unterstützung von Unicode (Umlaute etc) pain in the ass.

Lösungen:

  • Poweshelleinzeiler.

Man kann ein komplettes Powershellscript live in der Kommandozeile an Powershhell übergeben

alle meine Entchen.cmd

Powershell -c "$x=@((523,300),(587,300),(659,300),(700,300),(784,300),(784,300),(880,300),(880,300),(880,300),(880,300),(784,600),(700,300),(700,300),(700,300),(700,300),(659,300),(659,300),(587,300),(587,300),(587,300),(587,300),(523,600));$x|foreach{[console]::beep($_[0],$_[1])}"

Möchte man Parameter auf ein Powershellscript droppen muss man etwas tiefer in die Trickkiste greifen und und die alte Welt mit der Neuen "versöhnen". (dafür sind Programmierer schlaue Kerlchen)

Wir gaukeln dem System vor, das Powershelscript sei eine Batchdatei. in Wirklichkeit reicht der kleine Batchstub am Anfang lediglich die gedroptenParameter an das Powershellscript weiter...

PoshHybrid-DropTarget.cmd

<# : Batch Abschnitt ,Batch sieht in dieser Zeile die Eingabe aus der Datei # an ein SprungLabel, Powershell sieht den begin eines Kommentars. 
@echo off 
  rem alles von hier  bis  :run dient der Demo....
if "%~1" neq "" goto :run
echo das ist die Batch...
echo Hilfe: Ziehe  Dateien auf  die die Batch "%~nx0"...
echo ...oder auch nicht 
echo Die Dateinamen werden an das Powershellscript weitegeleitet.
timeout 2 >nul
color 1f
cls
:run
  rem Diese Zeile  nicht veränden! startet Powershell ohne Rechtevergabe und übergibt Parameter über die Pipe
(for %%I in ("%~f0" %*) do @echo:%%~I)|powershell -noprofile "[Array]$argv = $input|?{$_}; iex (gc '%~f0' -Encoding UTF8 -ReadCount 0 | out-string)"
  rem das folgende  pause hält das Fenster  offen....
pause
exit /b
: Ende Batch  
:: Ab der nächsten Zeile  beginnt das eigentliche PowershellScript, da kannst Du Powershellcode einfügen wie es Dir beliebt... #>
#ab hier  Dein Code...
"Jetzt bin ich in der Powershell"
$ScriptName=$argv[0]
$Params=$argv|Select -Skip 1
Write-Host "Name der Hybridbatch:" -fo green
$ScriptName
if ($Params) {
    Write-Host "übergebene Parameter:" -fo red
    $Params
}

jetzt wo Du auch weist wie man mit dem guten alten cmd die Fesseln von Powershell abstreift,

...können wir uns der Moderne zuwenden

...und dass ist Powershell. (du kannst Powershellscripte natürlich auch mit der Extension .ps1 speichern und per Rechtsklick starten)

gibt es Features die nur auf der PS verfügbar sind

Powershell...

  • arbeitet nicht Textbasiert, wie cmd/Batch (oder LinuxShells).
  • ist Objektorientiert (dem Nutzer kann es oft völlig egal sein wie komplex die übergebenen Datenobjecte sind, diese ermitteln in der regel selbständig, wo sie am besten passen)
  • verfügt über extrem flexible und nutzerfreundliche Cmdlets (..auch hier kann der Nutzer sündigen, abkürzen und verstümmeln):
Write-Host 'Hallo Welt' -ForegroundColor Yellow
Write-Host 'Hallo Welt' -fo ye
Write-Host 'Hallo Welt' -fore 14
  • hat vollen Zugriff auf native Systemfunktionen (PInvoke) und .Net

Demo gefällig?

demo.ps1

using namespace System.Windows.Forms
using namespace System.Drawing


$WindowTitle='MeineUhr'

 #ConsoleFenster verstecken (native sytenfunktion)
$user32=Add-Type -m '[DllImport("user32.dll")] public static extern void ShowWindow(IntPtr hWnd, int nCmdShow);' -Name myAPI -passthru
$hwnd=(gps -id $PID).MainWindowHandle
$user32::ShowWindow($hwnd, 0)

 #nur eine Instanz zulassen (.Net Funktion)
$Mut = New-Object System.Threading.Mutex($True, $WindowTitle)
if (!$Mut.WaitOne(0)) {
    $Mut.Close();
    (New-Object -c Wscript.Shell).Popup("$WindowTitle is running",2,"",0)
    exit
}


Add-Type -a 'System.Windows.Forms'
$Form = New-Object 'Form'
$Form.Text = $WindowTitle 
$Form.BackColor = '0,0,0' #wie schlampig...Powershell weiß aber  das der String auf ein ARGB-object passt
$Form.TransparencyKey = $Form.BackColor 
$Form.TopMost = $True
$Form.FormBorderStyle = 0 
$Form.Size = '250,90'
$Form.StartPosition = 'manual'
$Form.Location = '30,30'

$ClockDisplay = New-Object 'Label'
$ClockDisplay.Font = [Font]::new("Consolas",32,[FontStyle]3)
$ClockDisplay.Text = '{0:HH\:mm\:ss}' -f (Get-Date)
$ClockDisplay.AutoSize = $True
$ClockDisplay.ForeColor = '255,0,0'

$Form.Controls.Add($ClockDisplay)

$Timer1 = New-Object 'Timer'
$Timer1.Enabled = $True
$Timer1.Interval = 100
$Timer1_Action={
    $ClockDisplay.Text = '{0:HH\:mm\:ss}' -f (Get-Date) 
}
$Timer1.add_Tick($Timer1_Action)

$Null=$Form.ShowDialog()
$Mut.ReleaseMutex(); 
$Mut.Dispose();

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
Dragonscope 
Fragesteller
 23.04.2023, 13:55

Hi vielen Dank für die ausführliche Antwort ich habe vor kurzem angefangen die wichtigsten commands der cmd zu lernen, aber ich glaube es macht mehr Sinn auf die PS umzusteigen.

1
Erzesel  23.04.2023, 14:18
@Dragonscope

Batch ist im sterben und es wird Zeit dafür. Die Leute, welche aus "Gewohnheit" Batch am "Tropf" erhalten haben (Altadminastratoren) gehen langsam in Rente. die sahen keinen Grund um etwas zu ändern. Ihr Sammelsurium am uralten Batchdateien funktioniert bis heute bestens , Sie hatten 30 Jahre Zeit um Ihre "Faulheit" in Batch zu "zementieren"

Es ist nicht verkehrt den einen oder anderen Batchbefehl zu kennen und in etwa zu wissen, wie man kleine Mängel im "System" durch Kombination der vorhandenen Mittel "austrickst" ... ich bin mal gespannt, ob ChatGPT &Co jemals in der Lage sein werden die Möglichkeiten mehrer Sprachen geschickt zu kombinieren?

Powershell ist "geil" und wenn man richtig gut ist, auch richtig schnell. Naja, selbst ohne optimierungen ist es schneller als beispielsweise Python...

Wenn ich manchmal sehe wie hirnrissig Pythoner herumwursteln könnte ich mich totlachen.

0

Die PowerShell ist keine Erweiterung der Eingabeaufforderung, sondern der leistungsfähigere Nachfolger.

In der Eingabeaufforderung kann man z.B. nicht die Funktionen des .NET-Frameworks verwenden, in der PowerShell geht das..

Dragonscope 
Fragesteller
 21.04.2023, 19:36

also kann PS alles was cmd kann oder

0