Website-Suche

Du verschwendest deine Zeit mit Windows - diese 3 PowerShell-Skripte sparen mir jede Woche Stunden


Es gibt eine Version Ihres Windows-Setups, bei der sich Dateien von selbst sortieren, Backups still im Hintergrund erfolgen und alles, was Sie kopieren, automatisch für später gespeichert wird. Und das Beste ist, dass Sie keine ausgefallene Software von Drittanbietern installieren müssen, um dies zu erreichen. PowerShell ist in Windows integriert und kann all die langweiligen Aufgaben für Sie automatisieren. Um Ihnen eine Vorstellung davon zu geben, was möglich ist, hier sind drei Skripte, die die sich wiederholendsten Teile meines Tages automatisieren.

Alle drei Skripte werden vollständig bereitgestellt. Bevor Sie eines von ihnen ausführen, öffnen Sie das Skript in einem Texteditor und füllen Sie den KONFIGURATION-Abschnitt oben aus. Jedes Skript ist deutlich mit dem Kommentar „Nicht unterhalb dieser Linie bearbeiten“ gekennzeichnet, damit Sie genau wissen, was Sie ändern und was Sie unverändert lassen sollen.

Zuerst, hier ist, wie die PowerShell-Automatisierung tatsächlich funktioniert

Zwei Dinge, die man wissen sollte, bevor irgendetwas davon funktioniert

Ein PowerShell-Skript ist einfach eine Textdatei mit der Erweiterung .ps1. Sie schreiben einige Befehle hinein, speichern die Datei, und wenn Sie sie ausführen, werden diese Befehle ausgeführt. Sie können die Datei doppelklicken, um sie auszuführen, oder Sie können sie so planen, dass sie automatisch mit dem Aufgabenplaner ausgeführt wird.

Jetzt ist der Taskplaner ein ganz eigenes Thema. Hier ist ein grundlegender Leitfaden, der Ihnen hilft zu verstehen, wie er funktioniert. Für die hier besprochenen Skripte wird immer, wenn etwas beim Start ausgeführt werden soll, dies einfach im Taskplaner konfiguriert, mit dem Trigger auf „Beim Anmelden“ gesetzt.

Also, bevor Sie eine .ps1-Datei zum ersten Mal ausführen, gibt es eine Sache, die Sie tun müssen. Sie sehen, Windows blockiert standardmäßig PowerShell-Skripte. Um dies zu umgehen, öffnen Sie PowerShell und führen Sie diesen Befehl einmal aus:

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

Sie müssen dies danach nicht noch einmal ausführen.

Führen Sie keine zufälligen PowerShell-Skripte aus dem Internet aus, es sei denn, Sie verstehen, was sie tun. Sie könnten potenziell Malware einführen oder Ihr System beschädigen. Die hier geteilten Skripte sind getestet und funktionieren wie beschrieben, aber als bewährte Praxis können Sie sie dennoch durch Gemini oder Claude laufen lassen, um zu verstehen, wie sie funktionieren, wenn Sie nicht mit PowerShell vertraut sind.

Speichere meinen Zwischenablageverlauf in einer täglichen Markdown-Datei

Eine dauerhafte Zwischenablage-Historie für Windows










Die Windows-Zwischenablage-Historie (Win + V) speichert nur 25 Einträge, und alles, was nicht angeheftet ist, wird beim Neustart des PCs gelöscht. Ich kopiere den ganzen Tag über viele Dinge und möchte oft, dass diese Historie langfristig erhalten bleibt. Normalerweise bedeutet das, dass wichtige Ausschnitte manuell in eine separate Datei eingefügt werden müssen, was unnötige Reibung erzeugt.

Also habe ich ein Skript erstellt, das still im Hintergrund läuft, alle fünf Sekunden die Zwischenablage überprüft und alles neu Kopierte in eine Markdown-Datei einfügt. Es erstellt auch automatisch jeden Tag eine neue Datei basierend auf dem aktuellen Datum, was alles chronologisch organisiert und später leicht durchsuchen lässt.

Wenn Sie mehrere Dinge innerhalb desselben Fünf-Sekunden-Intervalls kopieren, wird nur der zuletzt kopierte Eintrag in die Markdown-Datei gespeichert. Wenn Sie dazu neigen, Inhalte sehr schnell zu kopieren, sollten Sie in Betracht ziehen, das Abfrageintervall auf eine Sekunde zu senken. Das wird die CPU-Auslastung leicht erhöhen, aber auf jedem einigermaßen modernen System sollte die Auswirkung vernachlässigbar sein.

Ich habe das Skript auch so gestaltet, dass alphanumerische Zeichenfolgen, die keine Website-URLs sind, mithilfe von Regex übersprungen werden. Auf diese Weise ist es weniger wahrscheinlich, dass Passwörter, API-Schlüssel oder andere sensible Tokens, die Sie kopieren, versehentlich protokolliert werden.

Hier ist das Drehbuch:

# ============================================================
# Save-Clipboard.ps1
# Monitors your clipboard every few seconds and saves new
# entries to a dated .md file. Skips anything that looks
# like a password or API token (no spaces, not a URL).
#
# Runs silently in the background on login via Task Scheduler.
#
# SETUP: Edit the path in the CONFIGURATION section below.
# ============================================================

# ============================================================
# CONFIGURATION — Edit this to match your system
# ============================================================

# Folder where dated clipboard .md files will be saved
$saveFolder   = "C:\Users\YourNAME\OneDrive\Documents\Clipboard History"

# How often to check the clipboard (in seconds)
$pollInterval = 5

# ============================================================
# SCRIPT — Do not edit below this line
# ============================================================

if (-not (Test-Path $saveFolder)) {
    New-Item -ItemType Directory -Path $saveFolder | Out-Null
}

$lastEntry = ""

while ($true) {
    Start-Sleep -Seconds $pollInterval

    try {
        $current = Get-Clipboard -Raw
    } catch {
        continue
    }

    if ([string]::IsNullOrWhiteSpace($current)) { continue }
    if ($current -eq $lastEntry) { continue }
    if ($current -notmatch '\s' -and $current -notmatch '^https?://') { continue }

    $lastEntry = $current

    $date     = Get-Date -Format "yyyy-MM-dd"
    $filePath = Join-Path $saveFolder "Clipboard_$date.md"

    if (-not (Test-Path $filePath)) {
        "# Clipboard Log - $date`n" | Out-File -FilePath $filePath -Encoding UTF8
    }

    $timestamp = Get-Date -Format "HH:mm:ss"
    $entry = "## $timestamp`n$current`n`n===================`n`n===================`n"
    $entry | Out-File -FilePath $filePath -Append -Encoding UTF8
}

Da das Skript kontinuierlich im Hintergrund läuft, wird es jedes Mal gestoppt, wenn Sie Ihren PC neu starten oder herunterfahren. Um sicherzustellen, dass es automatisch wieder gestartet wird, sollten Sie einen Eintrag im Aufgabenplaner erstellen, der es jedes Mal ausführt, wenn Sie sich anmelden.

Automatisches Verschieben abgeschlossener Downloads basierend auf dem Dateityp

Alle Dateien in wenigen Sekunden automatisch organisiert





Mein Downloads-Ordner ist im Grunde genommen eine digitale Krimskram-Schublade. Dort sind Installationsprogramme gemischt mit PDFs und zufälligen ZIP-Dateien, die ich vor Wochen vergessen habe. Dieses Skript geht durch diese heruntergeladenen Dateien und organisiert sie automatisch nach Dateityp.

Es scannt den Downloads-Ordner, überprüft die Erweiterung jeder Datei und verschiebt sie an den entsprechenden Ort. Dokumente gelangen in Dokumente, Bilder in Bilder, Audiodateien in Musik und Videos in Videos. Installer (.exe, .msi und .msix) kommen in einen speziellen Unterordner Installers innerhalb von Downloads. Alles, was es nicht erkennt, wird in einen Unterordner Unorganisiert—ebenfalls innerhalb von Downloads—für eine spätere manuelle Sortierung verschoben.

Hier ist das Drehbuch:

# ============================================================
# Organize-Downloads.ps1
# Moves files from your Downloads folder into sorted folders
# based on file type. Runs on system startup via Task Scheduler.
#
# SETUP: Edit the paths in the CONFIGURATION section below.
# ============================================================

# ============================================================
# CONFIGURATION — Edit these to match your system
# ============================================================

$downloads    = "PATH_to_Downloads"
$documents    = "PATH_to_Documents"
$pictures     = "PATH_to_Pictures"
$music        = "PATH_to_Music"
$videos       = "PATH_to_Videos"

# These two folders are created inside your Downloads folder automatically
$installers   = "$downloads\\Installers"
$unorganized  = "$downloads\\Unorganized"

# ============================================================
# FILE TYPE RULES — Add or remove extensions as needed
# ============================================================

$extensionMap = @{
    # Documents
    ".pdf"  = $documents
    ".docx" = $documents
    ".doc"  = $documents
    ".xlsx" = $documents
    ".xls"  = $documents
    ".pptx" = $documents
    ".ppt"  = $documents
    ".txt"  = $documents
    ".csv"  = $documents

    # Pictures
    ".jpg"  = $pictures
    ".jpeg" = $pictures
    ".png"  = $pictures
    ".gif"  = $pictures
    ".webp" = $pictures
    ".svg"  = $pictures
    ".bmp"  = $pictures
    ".raw"  = $pictures

    # Music
    ".mp3"  = $music
    ".flac" = $music
    ".wav"  = $music
    ".aac"  = $music
    ".ogg"  = $music

    # Videos
    ".mp4"  = $videos
    ".mkv"  = $videos
    ".avi"  = $videos
    ".mov"  = $videos
    ".wmv"  = $videos

    # Installers
    ".exe"  = $installers
    ".msi"  = $installers
    ".msix" = $installers
}

# ============================================================
# SCRIPT — Do not edit below this line
# ============================================================

$allDestinations = @($documents, $pictures, $music, $videos, $installers, $unorganized)
foreach ($dest in $allDestinations) {
    if (-not (Test-Path $dest)) {
        New-Item -ItemType Directory -Path $dest | Out-Null
    }
}

$files = Get-ChildItem -Path $downloads -File

foreach ($file in $files) {
    $ext = $file.Extension.ToLower()

    if ($extensionMap.ContainsKey($ext)) {
        $targetFolder = $extensionMap[$ext]
    } else {
        $targetFolder = $unorganized
    }

    $destination = Join-Path $targetFolder $file.Name
    if (Test-Path $destination) {
        $timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
        $newName = "$($file.BaseName)_$timestamp$($file.Extension)"
        $destination = Join-Path $targetFolder $newName
    }

    Move-Item -Path $file.FullName -Destination $destination
}

Das Skript betrachtet nur Dateien, die sich direkt im Downloads-Ordner befinden. Alles, was sich bereits in einem Unterordner befindet, wird ignoriert. Es erstellt auch automatisch die Ordner Installers und Unorganized, falls sie noch nicht existieren.

Persönlich ziehe ich es vor, dieses Skript manuell auszuführen, wann immer mein Downloads-Ordner überfüllt wird. Aber wenn Sie eine völlig automatische Lösung möchten, können Sie den Aufgabenplaner verwenden, um es jedes Mal automatisch auszuführen, wenn Sie sich anmelden.

Automatisches Backup meines Obsidian-Archivs mit einer 7-tägigen rollierenden Historie

Tägliche ZIP-Backups für Ihre wichtigen Dateien




Ich habe ein Skript, das täglich ein Backup meines Obsidian-Tresors erstellt - ein Ordner voller Notizen im Markdown-Format - es in eine ZIP-Datei komprimiert, an einem separaten Ort speichert und automatisch Backups löscht, die älter als sieben Tage sind. Dadurch habe ich eine rollierende Woche an Wiederherstellungspunkten, ohne dass der Backup-Ordner immer weiter wächst.

Du musst kein Obsidian-Nutzer sein, um von so etwas zu profitieren. Du kannst dieselbe Einrichtung anpassen, um jeden wichtigen Ordner auf deinem System zu sichern.

Hier ist das Drehbuch:

# ============================================================
# Backup-Obsidian.ps1
# Creates a dated ZIP backup of your Obsidian vault on login.
# Automatically deletes backups older than 7 days.
#
# SETUP: Edit the paths in the CONFIGURATION section below.
# ============================================================

# ============================================================
# CONFIGURATION — Edit these to match your system
# ============================================================

# Full path to your Obsidian vault folder
$vaultPath     = "PATH_to_ObsidianVault"

# Folder where backups will be saved (can be a different drive)
$backupFolder  = "PATH_to_backups"

# How many days of backups to keep (older ones get deleted)
$daysToKeep    = 7

# ============================================================
# SCRIPT — Do not edit below this line
# ============================================================

if (-not (Test-Path $backupFolder)) {
    New-Item -ItemType Directory -Path $backupFolder | Out-Null
}

$date        = Get-Date -Format "yyyy-MM-dd"
$zipName     = "Obsidian_Backup_$date.zip"
$zipPath     = Join-Path $backupFolder $zipName

if (Test-Path $zipPath) {
    Write-Output "Backup for today already exists. Skipping."
    exit
}

Compress-Archive -Path $vaultPath -DestinationPath $zipPath
Write-Output "Backup created: $zipPath"

$cutoffDate = (Get-Date).AddDays(-$daysToKeep)
$oldBackups = Get-ChildItem -Path $backupFolder -Filter "Obsidian_Backup_*.zip" |
              Where-Object { $_.LastWriteTime -lt $cutoffDate }

foreach ($old in $oldBackups) {
    Remove-Item $old.FullName -Force
    Write-Output "Deleted old backup: $($old.Name)"
}

Idealerweise würden Sie dieses Skript mit dem Aufgabenplaner automatisieren, sodass es jedes Mal ausgeführt wird, wenn Sie sich anmelden.


Erstelle PowerShell-Automatisierungen für dich selbst

Da haben Sie es also—drei PowerShell-Skripte, die viel Reibung aus meinem täglichen Arbeitsablauf entfernt haben. Aber diese sind natürlich darauf zugeschnitten, wie ich meinen PC benutze, und sie werden wahrscheinlich nicht perfekt auf Ihre Einrichtung passen. Hoffentlich bringen sie Sie aber zumindest zum Nachdenken. Sobald Sie erkennen, wie viel sich Windows automatisieren kann, wird es schwer, all die kleinen Aufgaben zu übersehen, die Sie jeden Tag noch manuell erledigen.

Und wenn Sie Ihre eigenen Skripte erstellen möchten, aber nicht fließend in PowerShell sind, machen moderne KI-Tools den Prozess überraschend zugänglich. Sie können das Problem in einfachem Englisch etwas wie Claude oder Gemini beschreiben, und sie können normalerweise einen soliden Ausgangspunkt für Sie erstellen.

Verwandte Artikel