Windows中登錄檔在系統中占據重要地位,當硬碟不足時、使用者名稱需修改卻受限於使用者文件名稱等需要修改登錄檔中字串的問題,逐一修改耗費時間,市面上又缺乏直接字串取代的工具。

此次在進行AI程序學習,安裝anaconda後發現使用中文使用者名稱與中文資料夾名稱後,會造成anaconda環境控制問題,新增環境時系統一直無法完成。因此先開啟administrator模式,修改使用者名稱與資料夾名稱。但是登錄檔中原中文資料夾名稱一直沒充足時間修改,因此利用PowerShell製作一支轉換程式,在管理者模式下開啟PowerShell,執行程式進行字串替換。將下文程式複製後另存為*.ps1,執行方式如程式註解說明。

登錄檔影響系統穩定,執行前務必備份,並先於regedit中進行字串搜尋確認,以免誤改。(附註:因特殊字元問題,讀取部分路徑會錯誤跳出分析,不會取代)

程式與說明如下:

前版程式如下圖使用 Join-Path方式取得登錄黨路徑,會因為子路徑包含'/','.'字元導致$subKeyPath字串錯誤
            foreach ($subKey in $subKeys) {
                $subKeys=($subKeys -replace '^/', '\/')
                $subKeys=($subKeys -replace '/', '\/')
                $subKey=($subKey -replace '^/', '\/')
                $subKey=($subKey -replace '/', '\/')
                $subKeyPath = Join-Path -Path $path -ChildPath $subKey
                $subKeyPath = $subKeyPath.Replace('\\\', '\/')
                $subKeyPath = $subKeyPath.Replace('\\', '/')
                $subKeyPath = $subKeyPath.Replace('\/\', '//')
                ModifyRegistry $subKeyPath

改為以字串方式連接後正常,全文程式如下

#
#使用方法 -oldText 搜尋字串 -newText 修改後字串
#.\PowershellRegToLaizhucheng.ps1 -oldText "\Users\中文" -newText "\Users\chinese"
#
#
param (
    [string]$oldText,  # 舊字串
    [string]$newText   # 修改後的新字串
)

# 檢查是否提供了舊字串和新字串
if (-not $oldText -or -not $newText) {
    Write-Host "用法: PowerShellRegToLaizhucheng.ps1 -oldText <舊字串> -newText <新字串>"
    Write-Host "請提供舊字串和新字串的值。"
    Exit
}


# 日誌記錄函數
function Log($message) {
    $logFile = "reg_modify_log.txt"
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    $logEntry = "[$timestamp] $message"
    Add-Content -Path $logFile -Value $logEntry
}

function ModifyRegistry($path) {
    Write-Host $path
    try {
        $keys = Get-Item -LiteralPath $path -ErrorAction Stop
        if ($keys -and $keys.PSPath) {
            $subKeys = $keys.GetSubKeyNames()
            $values = $keys.GetValueNames()
            # 修改键名
            $newKeyName = $keys.Name -replace [regex]::Escape($oldText), [regex]::Escape($newText)
            if ($newKeyName -ne $keys.Name) {
                try {
                    log "修改键名: $keys.Name -> $newKeyName"
                    Rename-ItemProperty -Path $keys.PSPath -Name '(default)' -NewName $newKeyName -ErrorAction Stop
                }
                catch {
                    $errorMessage = $_.Exception.Message
                    log "錯誤:修改键名時出错: $errorMessage"
                }
            }

            # 修改值数据
            foreach ($value in $values) {
                $data = $keys.GetValue($value)
                if ($data -is [string]) {
                    $newData = $data -replace [regex]::Escape($oldText), [regex]::Escape($newText)
                    if ($newData -ne $data) {
                        try {
                            log "修改鍵值: $data  to  $newData"
                            Set-ItemProperty -Path $keys.PSPath -Name $value -Value $newData -ErrorAction Stop
                        }
                        catch {
                            $errorMessage = $_.Exception.Message
                            log "錯誤:修改鍵值時出错: $errorMessage"
                        }
                    }
                }
            }

            # 递归处理子键
            foreach ($subKey in $subKeys) {
# 設定子金鑰路徑
if ($subKey.StartsWith('/')) {
    $subKeyPath = "$path\/$($subKey.Substring(1))"
} else {
    $subKeyPath = "$path\$subKey"
}

                Write-Host "Extract subKeyPath replace c $subKeyPath"
                ModifyRegistry $subKeyPath
                            }
        }
    }
    catch {
        $errorMessage = $_.Exception.Message
        log "錯誤:結束時出错: $errorMessage"
    }
}


# 修改 HKCU (HKEY_CURRENT_USER)
try {
    $regKeyHKCU = "Registry::HKEY_CURRENT_USER"
    ModifyRegistry $regKeyHKCU
}
catch {
    $errorMessage = $_.Exception.Message
    Log "錯誤:訪問註冊表路徑 HKCU 時出錯。錯誤訊息:$errorMessage"
}

# 修改 HKCR (HKEY_CLASSES_ROOT)
try {
    $regKeyHKCR = "Registry::HKEY_CLASSES_ROOT"
    ModifyRegistry $regKeyHKCR
}
catch {
    $errorMessage = $_.Exception.Message
    Log "錯誤:訪問註冊表路徑 HKCR 時出錯。錯誤訊息:$errorMessage"
}

# 修改 HKLM (HKEY_LOCAL_MACHINE)

try {
    $regKeyHKLM = "Registry::HKEY_LOCAL_MACHINE"
    ModifyRegistry $regKeyHKLM
}
catch {
    $errorMessage = $_.Exception.Message
    log "錯誤:訪問註冊表路徑 HKLM 時出錯。錯誤訊息:$errorMessage"
}

# 修改 HKU (HKEY_USERS)
try {
    $regKeyHKU = "Registry::HKEY_USERS"
    ModifyRegistry $regKeyHKU
}
catch {
    $errorMessage = $_.Exception.Message
    Log "錯誤:訪問註冊表路徑 HKU 時出錯。錯誤訊息:$errorMessage"
}

# 修改 HKCC (HKEY_CURRENT_CONFIG)
try {
    $regKeyHKCC = "Registry::HKEY_CURRENT_CONFIG"
    ModifyRegistry $regKeyHKCC
}
catch {
    $errorMessage = $_.Exception.Message
    Log "錯誤:訪問註冊表路徑 HKCC 時出錯。錯誤訊息:$errorMessage"
}

Write-Host "註冊表修改完成。"


 

 

創作者介紹
創作者 Working Notes-My Work Diary 的頭像
laizhucheng

Working Notes-My Work Diary

laizhucheng 發表在 痞客邦 留言(0) 人氣( 2 )