logan000
Goto Top

PowerShell For Runaways - Part III

Moin Moin

Als Ergänzung zu den IHMO hervorragenden Anleitungen
PowerShell for Runaways - Part I
PowerShell For Runaways - Part II von @TuXHunt3R
habe ich mich durchgerungen eine Fortsetzung zu schreiben, da aus meiner Sicht ein paar wesentliche Dinge bisher nicht erwähnt wurden, die ich aber für ziemlich entscheidend halte.
Auf Geht's.

back-to-topAliase

Die Cmdlets der Powershell sind meist etwas lang und für jeden der damit anfängt natürlich erst mal neu.
Also greift man der Einfachheit halber meistens wieder auf die Kommandozeile zurück. (da kennt man sich wenigstens aus).
Unnötig. Die Powershell ist in der Lage jedes Cmdlet an einen alternativen Namen zu binden und auch darüber aufzurufen.
Eine Auflistung aller bereits mitgelieferten Aliase erhält man durch den Aufruf:
get-alias * 						#Liefert eine Liste aller bekannten Aliase
Bei der Durchsicht der Liste stellt man fest das bereits etliche bekannte Befehle (aus bash oder dos) an die entsprechenden Cmdlets gebunden sind.
Dies läßt sich natürlich noch erweitern., z.B.:
set-alias -name np -value notepad 	 		#So muss ich nur noch np tippen statt notepad

back-to-topFunktionen

Mit der Powershell lassen sich natürlich auch Funktionen deklarieren.
Der Aufbau einer Funktion ist recht simpel.
Das Schlüsselwort "function" gefolgt vom Funktionsnamen. Die Anweisungen werden in {} eingeschlossen und
jede Anweisung muss mit einem Semikolon beendet werden.
Das sieht wie folgt aus:
function FunktionsName {
	1. Anweisung;
	2. Anweisung;
	....
}
Als Beispiel bau ich hier mal eine Funktion die meinen Lieblings Editor Notepad++ aufruft.
(Selbstreden, das Notepad++ installiert sein muss.)
Kennstück ist das Cmdlet "start-process". Damit lassen sich, wie der Name schon sagt Prozesse starten.
Dies Cmdlet hat 2 wesentliche Argumente: -Fielpath (Pfad der Anwendung die wir starten möchten) und -Argumentlist (Argumente die wir unserem Programm übergeben möchten).
Also kurz den Pfad der exe ermittelt und ausprobiert
Function notepad+ {
	start-process -filepath "C:\Program Files (x86)\Notepad++\notpad++.exe"; # Notepad++.exe starten  
}
Fertig? Mitnichten. Der Programmpfad sollte schon aus einer Umgebungsvariablen kommen und mind. eine Pfadangabe als
Parameter wäre wohl auch praktisch.
Umgebungsvariablen kann man mit "get_Childitem env:" (bzw. dir env: ) auslesen.
dir env: 						# Liefert eine Liste aller bekannten Umgebungsvariablen
Wenn ich dies Geschleuder jetzt in meine Funktion einbaue sieht das so aus:
Function notepad+ {
	$d=dir env:"ProgramFiles(x86)";			# Umgebungsvariable ProgramFiles(x86) in Variable $d speichern  
	$d = $d.value + "\Notepad++\notepad++.exe";	# Nur den Pfad aus $d rauslutschen und den Rest anhängen  
	start-process -filepath $d;			# Notepad++.exe starten
}
Fehlt noch die Pfadangabe als Parameter. Parameter werden in () hinter dem Funktionsnamen angegeben.
function notepad+ ($path="") {				# Parameter $path mit Standardwert angeben  
	$d=dir env:"ProgramFiles(x86)";			# Umgebungsvariable ProgramFiles(x86) in Variable $d speichern  
	$d = $d.value + "\Notepad++\notepad++.exe";	# Nur den Pfad aus $d rauslutschen und den Rest anhängen  
	If ($path -eq "")				# Prüfen ob ein Parameter angegeben wurde  
    		{start-process -filepath $d}		# Wenn nicht Starten wie gehabt
	else						# Falls doch
		{start-process -filepath $d -Argumentlist $path}; # $path als Argument durchreichen
}
Das ist es eigentlich. Allerdings gilt diese Funktion nur in der laufenden Powershell Session oder in dem Skript in dem sie deklariert ist. Aber dafür gibt es ja....

back-to-topProfile

Powershell Profile sind benannte Powershell Skripte die beim Start der Konsole (oder bei Ausführung eines Skriptes) automatisch ausgeführt (geladen) werden. Darin lassen sich natürlich ganz hervorragend eigene Deklarationen für Funktionen oder Aliase unterbringen.
Die Powershell kennt 4 unterschiedliche Profilpfade.
  • Aktueller User, Aktueller PC
  • Aktueller User, Alle PCs
  • Alle User, Aktueller PC
  • Alle User, Alle PCs
Da werd ich jetzt nicht weiter drauf eingehen und mich nur um die erste Variante kümmern.
Die Profilpfade lassen dich mit $profile abfragen. Die angegebenen Dateien existieren noch nicht.
Mit der folgenden Anweisung erzeugen wir uns erst mal eine Profildatei (in Aktueller User, Aktueller PC).
if (!(test-path $profile)) 
	{new-item -type file -path $profile -force}
und öffnen diese mal im Editor:
notepad $profile
Der Editor öffnet (wie erwartet) eine leere Datei. Also kopieren wir unsere Funktion notepad+ mal hinein und weil wir so faul sind binden wir das Ding noch schnell an einen kürzeren Alias:
function notepad+ ($path="") {				# Parameter $path mit Standardwert angeben  
	$d=dir env:"ProgramFiles(x86)";			# Umgebungsvariable ProgramFiles(x86) in Variable $d speichern  
	$d = $d.value + "\Notepad++\notepad++.exe";	# Nur den Pfad aus $d rauslutschen und den Rest anhängen  
	If ($path -eq "")				# Prüfen ob ein Parameter angegeben wurde  
    		{start-process -filepath $d}		# Wenn nicht Starten wie gehabt
	else						# Falls doch
		{start-process -filepath $d -Argumentlist $path}; # $path als Argument durchreichen
}

set-alias -name np+ -value notepad+			# Funktion notepad+ an Alias np+ binden
Das speichern wir (nein, wir ändern nicht Pfad oder Dateiname).
Wenn ihr euch jetzt nicht vertippt habt, könnt ihr die Powershell schließen und
beim erneuten Aufruf, das Kommando np+ sofort verwenden.
Zum Ende hin noch eine kleine hilfreiche Information ...

back-to-topCMD ist integriert

In der Windows Powershell Konsole lassen sich alle Befehle die ich sonst in der Kommandozeile ausgeführt habe ebenfalls aufrufen.
z.B.
notepad
ipconfig /all
...
Damit muss ich also nicht mehr überlegen welche Konsole ich öffne oder dauernd hin und her wechseln.

back-to-topZusammenfassung

Mit Aliasen, Funktionen und Profilen kann ich mir die Cmdlets so anpassen bzw. zusammenstellen wie ich es gerne hätte bzw. ständig brauche.
Zusammen mit der Tatsache das man mit der Powershell auch Com-Objekte verwenden kann (um z.B. Word zu steuern)
und ich dafür nicht mehr auf VBS ausweichen muss, hat dies für mich den Ausschlag gegeben in Zukunft primär auf die Powershell zu setzen.

So. "Ich habe fertig!"

Gruß L.

Content-Key: 167534

Url: https://administrator.de/contentid/167534

Printed on: July 21, 2024 at 07:07 o'clock