Direkt zum Hauptbereich

Praxistipp: Windows-Ordner per PowerShell-GUI erstellen

Unter Windows kann man Ordner auch per Skript erstellen lassen. Das ist nützlich, wenn man standardisierte Ordnernamen möchte. Mit PowerShell lassen sich auch Formulare erzeugen, die Informationen abfragen. Hier ist ein Beispiel.

Warum standardisierte Ordnername helfen

In diesem Blog empfehlen wir, die Ablage nach Vorgängen und Prozessen zu strukturieren. So wird die Ablage zur sich selbst-pflegenden Aufgabenliste. 

In manchen Prozessen setzt sich der Vorgangsname immer aus den gleichen Bausteinen zusammen, z. B. aus einem Datum, einer Abteilung, einem Stichwort und dem Bearbeiternamen. Wenn wir die Bestandteile aus fertigen Listen auswählen, gibt es weniger Fehler beim Anlegen. 

Wenn das Anlegen eines Ordners einfacher ist, nutzen die Anwender:innen auch diese Möglichkeit. 

PowerShell-Formulare haben zwei Vorteile:

  1. Man braucht keine zusätzliche Software auf dem Rechner zu installieren. 
  2. Der Anwender kann das Formular anpassen, wenn sich eine Liste geändert hat. 

Schauen wir uns an, wie diese Skript aufgebaut sind. 

Aufbau von Skripten

Mit Batch-Dateien könnte man das Anlegen der Ordner ebenfalls beschleunigen. Auf der Kommandozeile werden die verschiedenen Optionen abgefragt. So richtig schön ist diese Möglichkeit aber nicht. 

Unter Windows gibt es bereits die Möglichkeit, Formulare zu erzeugen und in PowerShell-Skripte zu integrieren:

  • Zu Beginn des Skripts werden alle Variablen definiert.
  • Dann bauen wir das Formular auf.
  • Am Ende werden die Befehle auf Basis der gewählten Einstellungen ausgeführt.

Brian Posey hat bei Computerweekly einen Beitrag veröffentlicht, in dem er die Funktionsweise der Formular erläutert. /1/ 

Wir können in der PowerShell einfache Felder (Arrays) oder Schlüssel-Wert-Tabellen (Hashmaps) anlegen.

Beispiel für einfache Arrays:

  • $StandortOptionen = @("Hamburg", "Berlin", "München")
  • $AbteilungsOptionen = @("Marketing", "Vertrieb", "IT", "HR")

Die ausgewählten Werte werden dann so übernommen. Manchmal will man lieber Abkürzungen übernehmen. Dann wären Hashmaps sinnvoller:

$StandortKonfiguration = @{ 
    "Hamburg" = "HH" 
    "Berlin" = "B" 
    "München" = "M" 
}

In diesem Beispiel wählen wir Hamburg im Formular aus und schreiben HH in den Ordnernamen. 

Abb. 1: Formular zum Anlegen eines neuen Vorgangs (Windows PowerShell)
 

Das Aufbauen eines Formulars ist eine mühsame Arbeit. Man muss sich die Abstände und Größen der einzelnen Elemente auf dem Formular ansehen. Diese Arbeit kann man nun gut an die elektronischen Praktikanten geben.

Manchmal ist das Ausführen von PowerShell-Skripten deaktiviert. In dem Fall muss man einmalig die Ausführungsrichtlinie (Execution Policy) in der Eingabeaufforderung ändern: Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser 

Beispielformular zum Anlegen eines neuen Vorgangs

Sehen wir uns ein Beispiel für ein Formular an. Das folgende Formular fragt den Standort, die Abteilung und ein Datum ab. Daraufhin erstellt das Skript den Ordner Datum_Standortkürzel_Abteilungskürzel_Bearbeiter, z. B. "20251125_MUC_INF_janfi" oder "20251130_BER_INF_janfi". Dieses Skript habe ich mit Google Gemini erstellt.

# ==============================================================================
# 1. VORBEREITUNG & DATENHALTUNG
# ==============================================================================

# Definiert den Basisordner für die neuen Projekte.
# BITTE PRÜFEN: Dieser Pfad muss existieren!
$BasePath = "C:\Temp\Projekte"

# Definition der Dropdown-Werte über Hashtables
# Key (Schlüssel): Was der Benutzer sieht (z.B. "Hamburg (Nord)")
# Value (Wert): Was für den Ordnernamen verwendet wird (z.B. "HHN")
$StandortKonfiguration = @{
    "Hamburg (Nord)"   = "HHN"
    "Berlin (Ost)"     = "BER"
    "München (Süd)"    = "MUC"
    "Zürich (CH)"      = "ZRH"
}

$AbteilungsKonfiguration = @{
    "Marketing & PR"    = "MKT"
    "Vertrieb (Sales)"  = "VTB"
    "IT-Infrastruktur"  = "INF"
    "Personalabteilung" = "HR"
}

# Auslesen des aktuellen Benutzernamens
$UserName = $env:USERNAME

# Assemblies für WinForms laden
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

# ==============================================================================
# 2. GUI DESIGN UND STEUERELEMENTE (MIT OPTIMIERTEN ABSTÄNDEN)
# ==============================================================================

# --- Hauptformular erstellen --------------------------------------------------
$form = New-Object System.Windows.Forms.Form
$form.Text = "Neuen Ordner anlegen"
$form.Size = New-Object System.Drawing.Size(400, 350)
$form.StartPosition = "CenterScreen"
$form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::FixedSingle
$form.MaximizeBox = $false
$form.MinimizeBox = $false

# Startkoordinaten und Abstandskontrolle
$xOffset = 20
$yCurrent = 20 # Startposition des ersten Labels

# --- 1. Standort (ComboBox) ---------------------------------------------------
$lblStandort = New-Object System.Windows.Forms.Label
$lblStandort.Location = New-Object System.Drawing.Point($xOffset, $yCurrent)
$lblStandort.Size = New-Object System.Drawing.Size(350, 20)
$lblStandort.Text = "1. Standort auswählen (z.B. Hamburg):"
$form.Controls.Add($lblStandort)

# Position ComboBox: Labelhöhe (20) + 5px Abstand
$yCurrent += 25
$cbStandort = New-Object System.Windows.Forms.ComboBox
$cbStandort.Location = New-Object System.Drawing.Point($xOffset, $yCurrent)
$cbStandort.Size = New-Object System.Drawing.Size(340, 30) # Breite leicht reduziert (340)
$cbStandort.DropDownStyle = [System.Windows.Forms.ComboBoxStyle]::DropDownList
# KORREKTUR: Klammerung für AddRange, um Fehler zu vermeiden.
$cbStandort.Items.AddRange(($StandortKonfiguration.Keys | Sort-Object))
$cbStandort.SelectedIndex = 0
$form.Controls.Add($cbStandort)

# Nächster Startpunkt: ComboBox-Höhe (30) + 20px Abstand
$yCurrent += 50

# --- 2. Abteilung (ComboBox) --------------------------------------------------
$lblAbteilung = New-Object System.Windows.Forms.Label
$lblAbteilung.Location = New-Object System.Drawing.Point($xOffset, $yCurrent)
$lblAbteilung.Size = New-Object System.Drawing.Size(350, 20)
$lblAbteilung.Text = "2. Abteilung auswählen (z.B. Marketing):"
$form.Controls.Add($lblAbteilung)

# Position ComboBox: Labelhöhe (20) + 5px Abstand
$yCurrent += 25
$cbAbteilung = New-Object System.Windows.Forms.ComboBox
$cbAbteilung.Location = New-Object System.Drawing.Point($xOffset, $yCurrent)
$cbAbteilung.Size = New-Object System.Drawing.Size(340, 30) # Breite leicht reduziert (340)
$cbAbteilung.DropDownStyle = [System.Windows.Forms.ComboBoxStyle]::DropDownList
# KORREKTUR: Klammerung für AddRange, um Fehler zu vermeiden.
$cbAbteilung.Items.AddRange(($AbteilungsKonfiguration.Keys | Sort-Object))
$cbAbteilung.SelectedIndex = 0
$form.Controls.Add($cbAbteilung)

# Nächster Startpunkt: ComboBox-Höhe (30) + 20px Abstand
$yCurrent += 50

# --- 3. Datum (DateTimePicker) ------------------------------------------------
$lblDatum = New-Object System.Windows.Forms.Label
$lblDatum.Location = New-Object System.Drawing.Point($xOffset, $yCurrent)
$lblDatum.Size = New-Object System.Drawing.Size(350, 20)
$lblDatum.Text = "3. Startdatum festlegen:"
$form.Controls.Add($lblDatum)

# Position DateTimePicker: Labelhöhe (20) + 5px Abstand
$yCurrent += 25
$dtpDatum = New-Object System.Windows.Forms.DateTimePicker
$dtpDatum.Location = New-Object System.Drawing.Point($xOffset, $yCurrent)
$dtpDatum.Size = New-Object System.Drawing.Size(150, 25)
$dtpDatum.Format = [System.Windows.Forms.DateTimePickerFormat]::Short
$form.Controls.Add($dtpDatum)

# Nächster Startpunkt: DateTimePicker-Höhe (25) + 15px Abstand (löst "nfi"-Problem)
$yCurrent += 40

# --- 4. Bearbeiter-Information ------------------------------------------------
$lblBearbeiter = New-Object System.Windows.Forms.Label
$lblBearbeiter.Location = New-Object System.Drawing.Point($xOffset, $yCurrent)
$lblBearbeiter.Size = New-Object System.Drawing.Size(350, 20)
$lblBearbeiter.Text = "4. Bearbeiter (automatisch): $($UserName)"
$form.Controls.Add($lblBearbeiter)

# Nächster Startpunkt für den Button
$yCurrent += 30

# --- 5. Erstellen Button ------------------------------------------------------
$btnErstellen = New-Object System.Windows.Forms.Button
$btnErstellen.Location = New-Object System.Drawing.Point($xOffset, $yCurrent)
$btnErstellen.Size = New-Object System.Drawing.Size(350, 40)
$btnErstellen.Text = "Ordner erstellen und Formular schließen"
$form.Controls.Add($btnErstellen)


# ==============================================================================
# 3. LOGIK UND EREIGNISHANDLER
# ==============================================================================

$btnErstellen.Add_Click({
    # 1. Werte aus den Steuerelementen auslesen (Anzeigename)
    $SelectedStandortName = $cbStandort.Text
    $SelectedAbteilungName = $cbAbteilung.Text
    $SelectedDate = $dtpDatum.Value

    # 2. Die Kürzel (Values) aus der Hashtable abrufen (Lookup)
    $StandortKuerzel = $StandortKonfiguration[$SelectedStandortName]
    $AbteilungsKuerzel = $AbteilungsKonfiguration[$SelectedAbteilungName]
   
    # Datum für den Ordnernamen formatieren (z.B. 20251125)
    $DatumFormatiert = $SelectedDate.ToString("yyyyMMdd")

    # 3. Den vollständigen Ordnernamen konstruieren
    # Ergebnis: C:\Temp\Projekte\20251125_HHN_MKT_mustermann
    $NewFolderName = "${DatumFormatiert}_${StandortKuerzel}_${AbteilungsKuerzel}_${UserName}"
    $FullFolderPath = Join-Path -Path $BasePath -ChildPath $NewFolderName

    # 4. Prüfen und Ordner erstellen
    if (Test-Path -Path $FullFolderPath) {
        [System.Windows.Forms.MessageBox]::Show("Der Ordner existiert bereits:`n`n$FullFolderPath", "Fehler: Ordner vorhanden", [System.Windows.Forms.MessageBoxButtons]::OK, [System.Windows.Forms.MessageBoxIcon]::Warning)
    } else {
        try {
            $NewFolder = New-Item -Path $FullFolderPath -ItemType Directory -Force -ErrorAction Stop
           
            [System.Windows.Forms.MessageBox]::Show("Der Ordner wurde erfolgreich erstellt:`n`n$FullFolderPath", "Erfolg", [System.Windows.Forms.MessageBoxButtons]::OK, [System.Windows.Forms.MessageBoxIcon]::Information)
           
            # NEU: Windows Explorer mit dem erstellten Ordner öffnen
            Start-Process -FilePath $FullFolderPath
           
            $form.Close()
           
        } catch {
            [System.Windows.Forms.MessageBox]::Show("Fehler beim Erstellen des Ordners:`n`n$($_.Exception.Message)", "Fehler", [System.Windows.Forms.MessageBoxButtons]::OK, [System.Windows.Forms.MessageBoxIcon]::Error)
        }
    }
})

# --- Formular anzeigen --------------------------------------------------------
$form.ShowDialog() | Out-Null

Dieses Skript kann man nun lokal als neuer-vorgang.ps1 abspeichern und bei Bedarf aufrufen.

Beispielformular zum Anlegen eines offenen Punktes in Projekten

Offene Punkte sind Mini-Vorgänge in Projekten. Bei einfachen Projekten gibt es jeweils einen Ordner für offene und für geschlossene Punkte. Immer, wenn etwas getan werden muss, wird dafür ein neuer, offener Punkt angelegt. Auch dies kann man mit einem Formular automatisieren.

Abb. 2: Formular zum Anlegen eines neuen offenen Punktes (Windows PowerShell)

Das Skript vergibt eine laufende Nummer und fragt nach Anlass und Quelle für den offenen Punkt. Zusätzlich kann man ein Stichwort vergeben.

Mit dem folgenden Prompt habe ich das Skript bei Claude.ai erzeugt: 

Bitte erstelle mir ein PowerShell-Skript mit einem WPF-Formular, das ein paar Variablen abfragt und danach einen Ordner im gleichen Verzeichnis anlegt. Die Variablen sollen in einem HashMap gespeichert werden. Ich möchte mit dem Skript offene Punkte in meinem Projekt schnell erfassen. Der Ordnername für offene Punkte setzt sich aus folgenden Bestandteilen zusammen: P + laufende Nummer (vierstellig mit führenden Nullen) + Anlass + Quelle + Stichwort. Die Bestandteile sind durch Unterstrich "_" getrennt. Die laufende Nummer kann im gleichen Verzeichnis als Textdatei gespeichert werden. Hier sind die Anlässe: Anfrage (ANF), Plan ändern (PLN), Sitzung vorbereiten (BES), Dokument ändern oder erstellen (DOK). Hier sind die Quellen: Kunde (KD), Behörde (BH), Feuerwehr (FW), Arbeitssicherheit (AS), Intern (IN). Das Stichwort kann frei vergeben werden, darf aber nicht länger als 30 Zeichen sein.

Hier ist der Quelltext zum Skript. In diesem Beispiel definieren wir das Formular über eine XAML-Datei.

Add-Type -AssemblyName PresentationFramework
Add-Type -AssemblyName PresentationCore
Add-Type -AssemblyName WindowsBase

# XAML für das WPF-Formular
[xml]$xaml = @"
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Offene Punkte erfassen"
        Height="400"
        Width="500"
        ResizeMode="NoResize"
        WindowStartupLocation="CenterScreen">
    <Grid Margin="10">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
       
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="120"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
       
        <!-- Überschrift -->
        <TextBlock Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2"
                   Text="Neuen offenen Punkt erfassen"
                   FontSize="16"
                   FontWeight="Bold"
                   Margin="0,0,0,15"
                   HorizontalAlignment="Center"/>
       
        <!-- Laufende Nummer (Anzeige) -->
        <Label Grid.Row="1" Grid.Column="0" Content="Laufende Nr.:"/>
        <TextBox Grid.Row="1" Grid.Column="1"
                 Name="txtLaufendeNummer"
                 IsReadOnly="True"
                 Background="LightGray"
                 Margin="0,2"/>
       
        <!-- Anlass -->
        <Label Grid.Row="2" Grid.Column="0" Content="Anlass:"/>
        <ComboBox Grid.Row="2" Grid.Column="1"
                  Name="cboAnlass"
                  Margin="0,2">
            <ComboBoxItem Content="ANF - Anfrage" Tag="ANF"/>
            <ComboBoxItem Content="PLN - Plan ändern" Tag="PLN"/>
            <ComboBoxItem Content="BES - Sitzung vorbereiten" Tag="BES"/>
            <ComboBoxItem Content="DOK - Dokument ändern oder erstellen" Tag="DOK"/>
        </ComboBox>
       
        <!-- Quelle -->
        <Label Grid.Row="3" Grid.Column="0" Content="Quelle:"/>
        <ComboBox Grid.Row="3" Grid.Column="1"
                  Name="cboQuelle"
                  Margin="0,2">
            <ComboBoxItem Content="KD - Kunde" Tag="KD"/>
            <ComboBoxItem Content="BH - Behörde" Tag="BH"/>
            <ComboBoxItem Content="FW - Feuerwehr" Tag="FW"/>
            <ComboBoxItem Content="AS - Arbeitssicherheit" Tag="AS"/>
            <ComboBoxItem Content="IN - Intern" Tag="IN"/>
        </ComboBox>
       
        <!-- Stichwort -->
        <Label Grid.Row="4" Grid.Column="0" Content="Stichwort:"/>
        <TextBox Grid.Row="4" Grid.Column="1"
                 Name="txtStichwort"
                 MaxLength="30"
                 Margin="0,2"/>
       
        <!-- Zeichenzähler -->
        <TextBlock Grid.Row="5" Grid.Column="1"
                   Name="txtZeichenzaehler"
                   Text="0 / 30 Zeichen"
                   FontSize="10"
                   Foreground="Gray"
                   Margin="2,0,0,5"/>
       
        <!-- Vorschau -->
        <Label Grid.Row="6" Grid.Column="0" Content="Ordnername:"/>
        <TextBox Grid.Row="6" Grid.Column="1"
                 Name="txtVorschau"
                 IsReadOnly="True"
                 Background="LightGray"
                 Margin="0,2"/>
       
        <!-- Status/Fehler -->
        <TextBlock Grid.Row="7" Grid.Column="0" Grid.ColumnSpan="2"
                   Name="txtStatus"
                   Foreground="Red"
                   TextWrapping="Wrap"
                   Margin="0,10"/>
       
        <!-- Buttons -->
        <StackPanel Grid.Row="9" Grid.Column="0" Grid.ColumnSpan="2"
                    Orientation="Horizontal"
                    HorizontalAlignment="Right"
                    Margin="0,10,0,0">
            <Button Name="btnErstellen" Content="Ordner erstellen"
                    Width="120" Height="30"
                    Margin="0,0,10,0"
                    IsEnabled="False"/>
            <Button Name="btnAbbrechen" Content="Abbrechen"
                    Width="100" Height="30"/>
        </StackPanel>
    </Grid>
</Window>
"@

# XAML laden
$reader = (New-Object System.Xml.XmlNodeReader $xaml)
$window = [Windows.Markup.XamlReader]::Load($reader)

# Kontrollen abrufen
$txtLaufendeNummer = $window.FindName("txtLaufendeNummer")
$cboAnlass = $window.FindName("cboAnlass")
$cboQuelle = $window.FindName("cboQuelle")
$txtStichwort = $window.FindName("txtStichwort")
$txtZeichenzaehler = $window.FindName("txtZeichenzaehler")
$txtVorschau = $window.FindName("txtVorschau")
$txtStatus = $window.FindName("txtStatus")
$btnErstellen = $window.FindName("btnErstellen")
$btnAbbrechen = $window.FindName("btnAbbrechen")

# Globale Variablen
$scriptPath = Split-Path -Parent $MyInvocation.MyCommand.Path
$counterFile = Join-Path $scriptPath "laufende_nummer.txt"
$currentNumber = 0

# Funktion: Laufende Nummer laden oder initialisieren
function Get-LaufendeNummer {
    if (Test-Path $counterFile) {
        $nummer = Get-Content $counterFile
        if ($nummer -match '^\d+$') {
            return [int]$nummer
        }
    }
    return 0
}

# Funktion: Laufende Nummer speichern
function Set-LaufendeNummer($nummer) {
    $nummer | Out-File -FilePath $counterFile -NoNewline
}

# Funktion: Sonderzeichen für Dateinamen bereinigen
function Clean-Filename($text) {
    $invalidChars = [IO.Path]::GetInvalidFileNameChars() -join ''
    $pattern = "[{0}]" -f [RegEx]::Escape($invalidChars)
    return $text -replace $pattern, ''
}

# Funktion: Vorschau aktualisieren
function Update-Vorschau {
    $anlass = if ($cboAnlass.SelectedItem) { $cboAnlass.SelectedItem.Tag } else { "" }
    $quelle = if ($cboQuelle.SelectedItem) { $cboQuelle.SelectedItem.Tag } else { "" }
    $stichwort = Clean-Filename $txtStichwort.Text.Trim()
   
    if ($anlass -and $quelle -and $stichwort) {
        $nummer = "{0:D4}" -f ($currentNumber + 1)
        $txtVorschau.Text = "P{0}_{1}_{2}_{3}" -f $nummer, $anlass, $quelle, $stichwort
        $btnErstellen.IsEnabled = $true
        $txtStatus.Text = ""
    } else {
        $txtVorschau.Text = ""
        $btnErstellen.IsEnabled = $false
        if (-not $stichwort -and $txtStichwort.Text.Length -gt 0) {
            $txtStatus.Text = "Stichwort enthält ungültige Zeichen"
        } else {
            $txtStatus.Text = ""
        }
    }
}

# Initialisierung
$currentNumber = Get-LaufendeNummer
$txtLaufendeNummer.Text = "P{0:D4}" -f ($currentNumber + 1)

# Event-Handler
$txtStichwort.Add_TextChanged({
    $txtZeichenzaehler.Text = "$($txtStichwort.Text.Length) / 30 Zeichen"
    Update-Vorschau
})

$cboAnlass.Add_SelectionChanged({ Update-Vorschau })
$cboQuelle.Add_SelectionChanged({ Update-Vorschau })

$btnErstellen.Add_Click({
    try {
        # HashMap mit allen Daten erstellen
        $daten = @{
            LaufendeNummer = $currentNumber + 1
            Anlass = $cboAnlass.SelectedItem.Tag
            AnlassText = $cboAnlass.SelectedItem.Content
            Quelle = $cboQuelle.SelectedItem.Tag
            QuelleText = $cboQuelle.SelectedItem.Content
            Stichwort = $txtStichwort.Text.Trim()
            Ordnername = $txtVorschau.Text
            ErstelltAm = Get-Date
            ErstelltVon = $env:USERNAME
        }
       
        # Ordner erstellen
        $folderPath = Join-Path $scriptPath $daten.Ordnername
       
        if (Test-Path $folderPath) {
            $txtStatus.Text = "Ordner existiert bereits!"
            return
        }
       
        New-Item -Path $folderPath -ItemType Directory -Force | Out-Null
       
        # Info-Datei im Ordner erstellen
        $infoFile = Join-Path $folderPath "_info.txt"
        $infoContent = @"
Offener Punkt: $($daten.Ordnername)
========================
Erstellt am: $($daten.ErstelltAm.ToString("dd.MM.yyyy HH:mm:ss"))
Erstellt von: $($daten.ErstelltVon)

Laufende Nummer: P$('{0:D4}' -f $daten.LaufendeNummer)
Anlass: $($daten.AnlassText)
Quelle: $($daten.QuelleText)
Stichwort: $($daten.Stichwort)
"@
        $infoContent | Out-File -FilePath $infoFile -Encoding UTF8
       
        # Laufende Nummer erhöhen und speichern
        $currentNumber++
        Set-LaufendeNummer $currentNumber
       
        # Erfolgsmeldung
        [System.Windows.MessageBox]::Show(
            "Ordner wurde erfolgreich erstellt:`n$folderPath",
            "Erfolg",
            [System.Windows.MessageBoxButton]::OK,
            [System.Windows.MessageBoxImage]::Information
        )
       
        # Formular zurücksetzen
        $txtLaufendeNummer.Text = "P{0:D4}" -f ($currentNumber + 1)
        $cboAnlass.SelectedIndex = -1
        $cboQuelle.SelectedIndex = -1
        $txtStichwort.Text = ""
        $txtVorschau.Text = ""
        $btnErstellen.IsEnabled = $false
       
        # Optional: Explorer öffnen
        Start-Process explorer.exe -ArgumentList $folderPath
       
    } catch {
        [System.Windows.MessageBox]::Show(
            "Fehler beim Erstellen des Ordners:`n$($_.Exception.Message)",
            "Fehler",
            [System.Windows.MessageBoxButton]::OK,
            [System.Windows.MessageBoxImage]::Error
        )
    }
})

$btnAbbrechen.Add_Click({
    $window.Close()
})

# Fenster anzeigen
$window.ShowDialog() | Out-Null

Dieses Formular wird als Skript mit dem Namen neuer-punkt.ps1 abgespeichert.

Verweise

 

Kommentare

Beliebte Posts aus diesem Blog

Die Profi-Tools im Windows-Explorer

Haben Sie bei der Urlaubsvertretung sich manches Mal geärgert, wenn Sie Dateien gesucht haben, die ein Teammitglied abgelegt hat? Die Suche im Explorer funktioniert tadellos, aber manchmal sollte man den Suchbegriff noch ein bisschen genauer fassen können. Z.B. mit UND oder ODER oder NICHT... Das geht so einfach, dann man von alleine kaum drauf kommt:

Die besten Bücher zum Thema Teamleistung

Es gibt viele Bücher, die sich mit Teams beschäftigen. Doch wo sollen wir anfangen? In diesem Artikel stelle ich die wichtigsten Quellen vor.

Warum du als Führungskraft klügere Mitarbeiter einstellen solltest (und Mikromanagement dein größter Fehler ist)

Es ist einer der am häufigsten zitierten Führungsratschläge: Umgib dich mit Menschen, die klüger sind als du. Und einer der am seltensten wirklich befolgten. Warum? Weil er sich leichter sagt, als er sich anfühlt.

Das Ubongo Flow Game

Spiele bieten eine gute Gelegenheit, zeitliche Erfahrungen zu verdichten und gemeinsam zu lernen. Karl Scotland und Sallyann Freudenberg haben im Mai 2014 das Lego Flow Game veröffentlicht. Wir haben die Spielidee übernommen, aber das Spielmaterial gewechselt. Statt Legosteinen benutzen wir Material aus Grzegorz Rejchtmans Ubongo-Spiel. Hier präsentieren wir die Anleitung für das Ubongo Flow Game.

Microsoft Teams: Die neuen Besprechungsnotizen - Loop-Komponenten

  Haben Sie in letzter Zeit in einer Teams-Besprechung die Notizen geöffnet? Dort sind inzwischen die Loop-Komponenten hinterlegt. Die sind zwar etwas nützlicher als das, was zuvor zur Verfügung stand. Trotzdem ist noch Luft nach oben. Und es gibt sogar einige ernstzunehmende Stolperfallen. Hier ein erster, kritischer Blick auf das was Sie damit tun können. Und auch darauf, was Sie besser sein lassen.

Kategorien in Outlook - für das Team nutzen

Kennen Sie die Kategorien in Outlook? Nutzen Sie diese? Wenn ja wofür? Wenn ich diese Fragen im Seminar stelle, sehe ich oft hochgezogene Augenbrauen. Kaum jemand weiß, was man eigentlich mit diesen Kategorien machen kann und wofür sie nützlich sind. Dieser Blogartikel stellt sie Ihnen vor.

High Performance Teams: 10 Prinzipien, die Spitzenteams von innen heraus stark machen

Manche Teams liefern konstant Spitzenleistung, nicht weil sie aus lauter Ausnahmetalenten bestehen, sondern weil sie Prinzipien verinnerlicht haben und danach arbeiten. Sie finden schneller gemeinsame Richtung, erholen sich als Einheit von Rückschlägen und wachsen an Herausforderungen, anstatt an ihnen zu zerbrechen. Was steckt dahinter? Kein Geheimrezept, sondern eine Handvoll Prinzipien, die High Performance Teams konsequent leben: im Umgang miteinander, in der Art wie sie lernen, Entscheidungen treffen und mit Druck umgehen. Die folgenden zehn Prinzipien dienen als Orientierung für Teams, die nicht nur irgendwie gut funktionieren wollen, sondern wirklich gemeinsam stark sein wollen. 

Pragmatisch oder nur “Quick and Dirty”?

“Wir müssen aber pragmatisch vorgehen”, drängt der Kollege. Hm… Im Wörterbuch finde ich für “pragmatisch” in etwa: sachbezogenes, praktisches Handeln. Klingt gut. Leider zeigt sich in meinen Erfahrungen, dass pragmatisch für viele doch eher “quick and dirty” bedeutet. Es soll schnell fertig werden. Aber auf welche oder wessen Kosten? Wo ist die Grenze? Warum steht “praktisch” im Konflikt mit einem langfristigen “Nützlich”? Muss das sein?

Coaching- und Führungsframeworks im Überblick: 21 Linsen für Teams und Organisationen

Gute Scrum Master:innen und Coaches betrachten das Geschehen durch mehr als eine Brille oder Linse. Jede Linse gibt andere Hinweise für angemessene Interventionen. Im Prinzip suchen wir immer nach der kleinsten Intervention mit der größten Wirkung. Aber welche Linsen gibt es eigenlich? In diesem längeren Beitrag stelle ich die wichtigsten 21 Konzepte von 37 Autor:innen vor, die mir bei der Recherche begegnet sind.

Rebellieren für den Wandel: die 8 Regeln des totalen Stillstandes von Prof. Dr. Peter Kruse

In einem legendärem Vortrag skizzierte Peter Kruse 8 Regeln des totalen Stillstands. Ihm zufolge wurden die Regeln entwickelt, um Managern und Führungskräften dabei zu helfen, Bereiche mit potenziellem Widerstand gegen Veränderungen zu erkennen und Menschen auf strukturierte Weise durch den Veränderungsprozess zu führen.