在日常的文件管理與處理中,常常需要對大量文件名或文件內容進行修改,而手動逐個操作既繁瑣又容易出錯。PowerShell作為一種強大的腳本語言,為我們提供了高效批量處理文件名及內容修改的解決方案。通過編寫簡單的PowerShell腳本,可以輕松實現對文件的批量重命名、替換文件中的特定字符串等操作,極大地提高工作效率,減少人工操作的失誤,讓文件管理變得更加便捷與高效。
PowerShell使用方法
一、以管理員身份打開 PowerShell
按?Win
?鍵打開開始菜單
輸入?PowerShell
在搜索結果中?右鍵單擊?Windows PowerShell
選擇?"以管理員身份運行"
若彈出 UAC 提示,點擊?"是"?確認
二、寫好腳本文件
三、運行腳本文件
.\demo.ps1 # 執行當前目錄下的腳本
當用該方法運行腳本時經常會出現如下報錯:.\rename_files.ps1 : 無法加載文件 D:\all_project\rename_files.ps1,因為在此系統上禁止運行腳本。有關詳細信息,請參閱 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。所在位置 行:1 字符: 1
這個錯誤是由于 PowerShell 的安全策略禁止運行腳本文件造成的。
📌 錯誤原因分析
PowerShell 執行策略限制
- PowerShell 默認設置為?
Restricted
(限制模式)
- 此策略會阻止任何腳本文件(.ps1)執行
- 系統保護機制防止潛在惡意腳本運行
檢查當前執行策略,在 PowerShell 中輸入:
Get-ExecutionPolicy
- 若返回?
Restricted
(默認狀態),則需修改策略才能運行腳本
針對該問題,通常可以選擇臨時繞過策略:
PowerShell.exe -ExecutionPolicy Bypass -File "D:\路徑\腳本名.ps1"
👉 特點:僅本次生效,不影響系統安全設置,執行命令如下所示:
PowerShell批量處理文件名稱替換的腳本
# 定義根目錄路徑(所有文件操作的基礎路徑)
$rootPath = "D:\all_project\STM32F10x_StdPeriph_Driver\src"# 顯示腳本啟動信息
Write-Host "Started file renaming..."# 遞歸獲取根目錄下所有文件,僅篩選名稱包含'f10x'的文件
$files = Get-ChildItem -Path $rootPath -Recurse -File | Where-Object { $_.Name -match 'f10x'
}# 遍歷篩選后的文件集合
foreach ($file in $files) {# 替換文件名$newName = $file.Name -replace 'f10x', 'F103'# 異常處理塊try {# 顯示重命名操作詳情Write-Host "Renaming: $($file.Name) -> $newName"# 執行實際重命名操作(-Force覆蓋同名文件)Rename-Item -Path $file.FullName -NewName $newName -Force# 成功提示(綠色文字)Write-Host "Renamed successfully." -ForegroundColor Green}catch {# 錯誤處理:顯示失敗原因(紅色文字)Write-Host "Error renaming $($file.FullName): $_" -ForegroundColor Red}
}# 顯示腳本完成信息(青色文字)
處理結果:
PowerShell批量處理文件內容字符替換的腳本
# 設置根目錄路徑(STM32標準外設驅動源碼位置)
$rootPath = "D:\all_project\STM32F10x_StdPeriph_Driver\src"# 定義需要處理的目標文件擴展名列表(覆蓋常見代碼/配置文件類型)
$fileExtensions = @("*.c", "*.h", "*.txt", "*.htm", "*.uvprojx", "*.uvoptx", "*.bat", "*.xlsx", "*.*")# 顯示腳本開始執行的提示信息
Write-Host "Starting to replace 'f10x' with 'F103' in file contents..."# 遍歷每種文件擴展名類型
foreach ($extension in $fileExtensions) {# 遞歸獲取當前擴展名的所有文件$files = Get-ChildItem -Path $rootPath -Filter $extension -Recurse -File# 記錄文件總數用于進度顯示$fileCount = $files.Count$processedCount = 0 # 已處理計數器# 遍歷當前擴展名的所有文件foreach ($file in $files) {# 讀取文件全部內容(-Raw保留換行符格式)$content = Get-Content -Path $file.FullName -Raw -ErrorAction SilentlyContinue# 當文件內容存在且非空時執行替換if ($content) {# 進行字符串替換(大小寫敏感)$newContent = $content -replace "f10x", "F103"# 比較內容是否發生變化(避免不必要的寫入)if ($newContent -ne $content) {try {# 寫入修改后的內容(-Force覆蓋只讀文件)$newContent | Set-Content -Path $file.FullName -ForceWrite-Host "Updated content in: $($file.FullName)"}catch {# 文件寫入失敗時的錯誤處理Write-Host "Error updating $($file.FullName): $_" -ForegroundColor Red}}}# 更新進度計數器$processedCount++# 每處理100個文件顯示一次進度if ($processedCount % 100 -eq 0) {Write-Host "Processed $processedCount of $fileCount files..."}}
}
處理結果: