网站搜索

你在 Windows 上浪费时间——这三个 PowerShell 脚本每周帮我节省数小时


你的 Windows 系统有一个版本,其中文件会自动分类,备份会在后台静默进行,所有你复制的内容都会自动保存以备日后使用。而最棒的是,你不需要安装任何花哨的第三方软件来实现这些功能。PowerShell 已内置于 Windows 中,它可以为你自动处理所有枯燥的任务。为了让你了解可能实现的功能,以下是三段脚本,它们能自动完成我日常中最重复的部分任务。

所有三个脚本都已完整提供。在运行任何脚本之前,请在文本编辑器中打开脚本,并填写顶部的 CONFIGURATION 配置部分。每个脚本都明确标注有“不要编辑此行以下内容”的注释,这样你就能清楚地知道哪些内容需要修改,哪些内容保持不变。

首先,这就是 PowerShell 自动化的实际工作原理

在这一切生效之前需要了解的两件事

PowerShell 脚本只是一个扩展名为 .ps1 的文本文件。你在其中写入一些命令,保存文件,然后在运行时,这些命令会执行。你可以双击文件来运行它,或者使用任务计划程序将其设置为自动运行。

现在,任务计划程序本身就是一个完整的主题。这里有一个基本指南,帮助你理解它是如何工作的。对于这里讨论的脚本,每当某个内容需要在启动时运行时,它只需在任务计划程序中配置,触发器设置为“我登录时”。

另外,在第一次运行任何 .ps1 文件之前,有一件事你需要做。你看,Windows 默认会阻止 PowerShell 脚本。要覆盖此限制,打开 PowerShell 并运行以下命令一次:

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

之后你不需要再运行这个了。

不要随意运行来自互联网的 PowerShell 脚本,除非你理解它们的具体作用。它们可能会引入恶意软件或破坏系统。这里分享的脚本已经经过测试,并且按描述工作,但作为最佳实践,如果你不熟悉 PowerShell,仍然可以通过 Gemini 或 Claude 运行它们,以了解其工作原理。

将我的剪贴板历史保存到每日的 Markdown 文件中

适用于 Windows 的持久剪贴板历史记录










Windows 剪贴板历史记录(Win + V)只能存储 25 条条目,而且所有未固定的内容在每次重启电脑时都会被清除。我一天中复制很多东西,而且我经常希望这些历史记录能够长期保留。通常,这意味着需要手动将重要片段粘贴到一个单独的文件中,这增加了不必要的麻烦。

所以我编写了一个在后台静默运行的脚本,每五秒检查一次剪贴板,并将任何新复制的内容追加到一个 Markdown 文件中。它还会根据当前日期自动创建每天的新文件,这样可以按时间顺序整理所有内容,并且以后容易搜索。

如果你在相同的五秒时间间隔内复制多个内容,只有最近的剪贴板条目会被保存到 Markdown 文件中。如果你经常非常快速地复制内容,可以考虑将轮询间隔降低到一秒钟。这样会稍微增加 CPU 使用率,但在任何合理现代的系统上,影响应该可以忽略不计。

我还设计了这个脚本,使用正则表达式跳过不是网站 URL 的字母数字字符串。这样,你复制的密码、API 密钥或其他敏感令牌就不太可能被意外记录。

这是剧本:

# ============================================================
# 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
}

由于脚本在后台持续运行,它会在你重启或关闭电脑时停止。为了确保它能够自动再次启动,你需要创建一个任务计划程序条目,使其在每次登录时运行。

根据文件类型自动移动已完成的下载

所有文件在几秒钟内自动整理





我的下载文件夹基本上就是一个数字杂物抽屉。你会发现安装程序、PDF文件以及几周前我忘记的随机ZIP文件混在一起。这个脚本会自动扫描这些下载的文件,并根据文件类型进行整理。

它会扫描下载文件夹,检查每个文件的扩展名,然后将其移动到相应的位置。文档会移动到文档文件夹,图片会移动到图片文件夹,音频文件会移动到音乐文件夹,视频会移动到视频文件夹。安装程序(.exe、.msi 和 .msix)会被放到下载文件夹中一个专门的安装程序子文件夹里。任何它无法识别的文件都会被移动到一个未整理子文件夹中——同样位于下载文件夹里——以便稍后手动整理。

这是剧本:

# ============================================================
# 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
}

该脚本只查看直接位于下载文件夹中的文件。已经在子文件夹中的任何内容将被保留不动。如果安装程序和未整理文件夹尚不存在,它还会自动创建这些文件夹。

就个人而言,每当我的下载文件夹开始变得过于拥挤时,我更喜欢手动运行这个脚本。但如果你想要完全自动的设置,你可以使用任务计划程序在每次登录时自动运行它。

自动备份我的 Obsidian 保管库,并保留 7 天滚动历史

重要文件的每日ZIP备份




我有一个脚本可以每天备份我的 Obsidian 资料库——一个包含 Markdown 格式笔记的文件夹——将其压缩成 ZIP 文件,存储在另一个位置,并自动删除七天之前的备份。这让我拥有一个滚动的七天恢复点,而备份文件夹不会无限增长。

不过,你不需要成为 Obsidian 用户也能从这样的东西中受益。你可以将相同的设置调整用于备份系统上任何重要的文件夹。

这是剧本:

# ============================================================
# 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)"
}

理想情况下,您应该使用任务计划程序自动运行此脚本,以便每次登录时都会执行。


为自己制作 PowerShell 自动化

所以这就是全部内容——三个 PowerShell 脚本,大大减少了我日常工作流程中的摩擦。但这些显然是针对我使用电脑的方式量身定制的,它们很可能不完全适合你的设置。不过,希望它们至少能让你开始思考。一旦你意识到 Windows 可以自动化多少重复性工作,你就很难不去注意每天仍然手动完成的那些小任务。

如果你想自己编写脚本,但不精通 PowerShell,现代的 AI 工具使这个过程出乎意料地易于上手。你可以用简单的英语向 Claude 或 Gemini 描述问题,它们通常可以为你生成一个不错的起点。

相关文章