%Teilweise Erzeugt mit dem LaTeX-Generator: http://latex.sehnot.de

%Schriftgröße, Layout, Papierformat, Art des Dokumentes
\documentclass[10pt,oneside,a4paper]{scrartcl}

%Einstellungen der Seitenränder
\usepackage[left=2cm,right=2cm,top=1.5cm,bottom=1.5cm,includeheadfoot]{geometry}

%neue Rechtschreibung
\usepackage[ngerman]{babel}

%Umlaute ermöglichen
\usepackage[utf8]{inputenc}

%Gesamtseitenzahl
\usepackage{lastpage}

% Kopf- und Fußzeile
\usepackage[automark]{scrpage2}

%Quellcode-Listings
\usepackage{listings}

%Hyperlinks
\usepackage{hyperref}

%Quellcode
\usepackage{alltt}

%Kopfzeile
\ihead{Windows}
\chead{}
\ohead{http://kohnlehome.de/windows/powershell.pdf}
\setheadsepline{0.5pt}

%Fußzeile
\setfootsepline{0.5pt}
\ifoot{Franz Kohnle}
\cfoot{Seite \thepage\ von  \pageref{LastPage}}
\ofoot{\today}

\pagestyle{scrheadings}

\begin{document}

% Überschrift 
\begin{center}
\LARGE % Schriftgröße
\bfseries % Fettdruck
\sffamily % Serifenlose Schrift
Powershell
\end{center}

\section*{Variablen}
\texttt{\$variable = Wert}\\
\texttt{\$\{variable\} = Wert}\\
\texttt{[int] \$x = 5}\\
Datentypen: \texttt{[byte]}, \texttt{[int]}, \texttt{[long]}, \texttt{[single]}, \texttt{[double]}, \texttt{[decimal]}, \texttt{[bool]}, \texttt{[char]}, \texttt{[string]} 

\section*{Arrays}
\texttt{[int[]] \$feld = 7, 12, -5}\\
\texttt{\$feld[0] \# 7}\\
\texttt{\$feld[-1] \# -5}\\

\begin{tabular}{c|c}
Schlüssel & Wert\\ \hline
0 & 7 \\
1 & 12 \\
2 & -5 \\
\end{tabular}

\section*{Hash-Tables}
\texttt{\$lehrer = @\{ vorname = "Franz"; nachname = "Kohnle"; alter = 45 \}}\\
\texttt{\$lehrer["vorname"] \# Franz}\\
\texttt{\$lehrer.nachname   \# Kohnle}\\

\begin{tabular}{c|c}
Schlüssel & Wert\\ \hline
vorname & Franz \\
nachname & Kohnle \\
alter & 45 \\
\end{tabular}

\section*{Operatoren}
\begin{itemize}
\item arithmetisch: \texttt{+ - * / \%}
\item Zuweisung: \texttt{= += -= *= /= \%= ++ --}
\item logisch: \texttt{-and -or -xor -not }
\item Vergleich: \texttt{-eq -ne -ge -gt -lt -le }
\end{itemize}

\section*{Ausdrücke}
\begin{itemize}
\item \texttt{"Hallo"} $\rightarrow$ \texttt{Hallo}
\item \texttt{4 + 1.5 * 3} $\rightarrow$ \texttt{8,5}
\item \texttt{4 + "2"} $\rightarrow$ \texttt{6}
\item \texttt{"4" + 2} $\rightarrow$ \texttt{42}
\item \texttt{"Hallo"\ * 3} $\rightarrow$ \texttt{HalloHalloHallo}
\item \texttt{1 -lt 2} $\rightarrow$ \texttt{True}
\end{itemize}

\section*{Kontrollstrukturen}
\texttt{if switch do while for foreach }

\section*{Skriptdateien}
\begin{itemize}
\item Dateiendung: \texttt{.ps1}
\item Skriptausführung zulassen: \texttt{Set-ExecutionPolicy Unrestricted} (als Administrator)
\item Integrated Scripting Environment: \texttt{ISE}
\end{itemize}



\section*{Cmdlets (Commandlets)}
\subsection*{Grundstruktur}
\texttt{Verb-Substantiv -Parameter Parameterwert -Schalter}
\subsection*{Beispiele}
\begin{tabular}{l l l}
Cmdlet & Beispiel & Bedeutung\\ \hline
\texttt{Show-Command} &  & Fenster mit Liste aller Cmdlets\\
\texttt{Get-Command} & \texttt{Get-Command get*} & Liste aller Cmdlets\\
\texttt{Get-Help} & \texttt{Get-Help Get-Command -full} & Hilfe\\
\texttt{Get-Member} & \texttt{Get-Process | Get-Member} & laufende Prozesse anzeigen\\
\texttt{Get-ChildItem} & \texttt{Get-ChildItem c:\textbackslash Users} & Inhalt des Verzeichnisses\\
\texttt{Get-History} &  & Zuletzt eingegebene Befehle\\
\texttt{Invoke-History} & \texttt{Invoke-History 5} & Befehl mit Id 5 ausführen\\
\end{tabular}

\section*{Komplette Hilfe in einer Textdatei speichern}
\subsection*{1. Hilfe aktualisieren}
als Administrator: \texttt{Update-Help}

\subsection*{2. Hilfe in Datei umleiten}
\begin{verbatim}
$AlleThemen = Get-Help *
$Allethemen | Get-Help -Full | Out-File hilfe.txt
\end{verbatim}


\section*{Aliase}
Liste mit Aliasen anzeigen: \texttt{Get-Alias}\\

\begin{tabular}{l | l}
Alias & Cmdlet\\ \hline
\texttt{cat}, \texttt{gc}, \texttt{type} & \texttt{Get-Content}\\
\texttt{cd}, \texttt{chdir}, \texttt{sl} & \texttt{Set-Location}\\
\texttt{cp}, \texttt{copy}, \texttt{cpi} & \texttt{Copy-Item}\\
\texttt{echo}, \texttt{write} & \texttt{Write-Output}\\
\texttt{kill} & \texttt{Stop-Process}\\
\texttt{ls}, \texttt{dir}, \texttt{gci} & \texttt{Get-ChildItem}\\
\texttt{mv}, \texttt{move}, \texttt{mi} & \texttt{Move-Item}\\
\texttt{rm}, \texttt{del}, \texttt{rmi} & \texttt{Remove-Item}\\
\end{tabular}


\section*{Pipeline mit $|$}
\texttt{Cmdlet1 | Cmdlet2}\\

Es werden im Gegensatz zur Linux-Konsole nicht nur Texte, sondern typisierte .NET-Objekte weitergeleitet. 

\section*{Sortieren}
\texttt{| Sort-Object -Property xyz}

\section*{Filtern}
\texttt{| Select-Object -First 10}\\
\texttt{| where \{ \$\_.Extension -eq ".txt" \}}\\


\section*{Ausgabe in Datei}
\texttt{> datei.txt}\\
\texttt{| Out-File datei.txt}\\
\texttt{| Export-Csv datei.csv}\\
\texttt{| Export-Clixml datei.xml}

\section*{Provider}
Provider liefern Zugriff auf Daten
\begin{itemize}
\item Liste anzeigen: \texttt{Get-PSProvider} bzw. \texttt{Get-PSDrive}
\item Laufwerk wechseln:  \texttt{cd \textit{Provider}:}
\item Inhalt anzeigen:  \texttt{Get-ChildItem}
\end{itemize}

\section*{Zugriff auf .NET-Klassen}
\begin{tabular}{l l}
\texttt{[Klasse]::Methode(...)} & statische Methode\\
\texttt{\$objekt.Methode(...)} & Instanzmethode\\
\texttt{\$objekt.Eigenschaft} & Instanzeigenschaft
\end{tabular}

\subsection*{Methoden und Eigenschaften ermitteln}
\texttt{[Klasse] | Get-Member}\\
\texttt{\$objekt | Get-Member}

\end{document}
