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.

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.

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.

Teamleitung konkret von Jan Fischbach und Alisa Stolze

Manchmal habe ich das Gefühl, dass alle gute Ideen für Organisationsentwicklung schon längst existieren. Das stetige Karussell von neuen Methoden und Büchern bringen uns neue Buzzwords bei. Wir lernen sie brav, um relevant zu bleiben. Die Herausforderungen für Organisationen und ihre Mitglieder bleiben jedoch gleich und auch häufig gleich ungelöst. Mit Teamleitung konkret: 20 einfache Gewohnheiten und Praktiken für den Teamerfolg haben Jan Fischbach und Alisa Stolze doch einen genialer Ansatz gefunden, effektiv an den Kern der von Teams begegneten Probleme zu arbeiten, jedoch ohne neue Methode und ganz ohne Buzzwords./1/

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.

Die unsichtbaren Warteschlangen

Wie können Teamleiter oder Managerinnen die Produktivität ihrer Teams verbessern? Wenn zu wenig fertig wird, liegt es selten an den Mitarbeiterinnen und Mitarbeitern. Die Arbeit ist oft schlecht organisiert. Es werden zu viele Dinge gleichzeitig erwartet, gerade im Bereich der Dienstleistungen und Wissenarbeit. In diesem Artikel gehe ich den Hintergründen nach, erkläre die wichtigen Konzepte und dann schauen wir auf Lösungen.

Willst du mit mir sprechen? Termine buchen lassen mit Microsoft Bookings

Mit Bookings hat Microsoft 365 eine App an Bord, die bisher viel zu wenig Beachtung gefunden hat. Ursprünglich gedacht, damit Dienstleister ihren Kunden einen Internet-Kalender zum Selbstbuchen zur Verfügung stellen können, ist sie auch für größere Unternehmen nützlich. Zum Beispiel wenn es darum geht, innerhalb eines bestimmten Zeitraums Termine anzubieten. Sehr praktisch!

Nie wieder Ärger mit Besprechungsserien in Outlook

Erstellen auch Sie Besprechungsserien in Outlook? Ärgern auch Sie sich manchmal darüber, wenn Sie etwas zu ändern haben? Falls nicht, versenden Sie entweder keine wiederkehrenden Outlook-Besprechungen (Serienterminen). Oder Sie ändern nie etwas daran. Dann ist dieser Artikel nichts für Sie. Lesen Sie aber bitte weiter, falls Sie sich schon immer mal gefragt haben, ob es eine Lösung gibt?