你在 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 描述问题,它们通常可以为你生成一个不错的起点。


















