2024年11月20日 星期三

[研究]PowerShell 替目錄及子目錄所有檔案產生 .SHA256 檔案

[研究]PowerShell 替目錄及子目錄所有檔案產生 .SHA256 檔案

2024-11-20

對本機電腦

$directory = "C:\YourDirectory"
$files = Get-ChildItem -Path $directory -Recurse -File

foreach ($file in $files) {
    $hash = Get-FileHash -Path $file.FullName -Algorithm SHA256
    $outputFile = $file.FullName + ".SHA256"
    $hash.Hash | Out-File -FilePath $outputFile -Encoding UTF8
}


對網路芳鄰其他電腦 (敝人環境好像要先切換到 C: 才正常)

C:
$directory = "\\ComputerName\SharedFolder"
$files = Get-ChildItem -Path $directory -Recurse -File

foreach ($file in $files) {
    $hash = Get-FileHash -Path $file.FullName -Algorithm SHA256
    $outputFile = $file.FullName + ".SHA256"
    $hash.Hash | Out-File -FilePath $outputFile -Encoding UTF8
}


********************************************************************************

對本機電腦,排除已經存在的 .SHA256


$directory = "C:\YourDirectory"  # 指定要處理的目錄
$files = Get-ChildItem -Path $directory -Recurse -File | Where-Object { $_.Extension -ne ".SHA256" }

foreach ($file in $files) {
    $hash = Get-FileHash -Path $file.FullName -Algorithm SHA256
    $outputFile = $file.FullName + ".SHA256"
    $hash.Hash | Out-File -FilePath $outputFile -Encoding UTF8
}

********************************************************************************

對本機電腦,排除已經存在的 .SHA256,處理多個目錄


C:
# 定義多個本機目錄 or 網路共享的目錄 (使用 UNC 路徑)
$directories = @(
    "C:\Directory1",
    "C:\Directory2",
    "C:\Directory3"
    "\\Computer1\SharedFolder1",
    "\\Computer2\SharedFolder2",
    "\\Computer3\SharedFolder3"
)

foreach ($directory in $directories) {
    Write-Host "Processing directory: $directory" -ForegroundColor Green
    try {
        # 獲取目錄中的所有檔案,排除副檔名為 .SHA256 的檔案
        $files = Get-ChildItem -Path $directory -Recurse -File | Where-Object { $_.Extension -ne ".SHA256" }
        
        foreach ($file in $files) {
            # 計算檔案的 SHA256
            $hash = Get-FileHash -Path $file.FullName -Algorithm SHA256
            # 生成 .SHA256 檔案的完整路徑
            $outputFile = $file.FullName + ".SHA256"
            # 將哈希值寫入 .SHA256 檔案
            $hash.Hash | Out-File -FilePath $outputFile -Encoding UTF8
        }
    } catch {
        Write-Host "Failed to process directory: $directory. Error: $($_.Exception.Message)" -ForegroundColor Red
    }
}

********************************************************************************

對本機電腦,排除已經存在的 .SHA256,處理多個目錄;失敗時輸出訊息,但仍要繼續對其它檔案進行 SHA256



C:
# 定義多個網路共享的目錄 (使用 UNC 路徑)
$directories = @(
    "C:\Directory1",
    "C:\Directory2",
    "C:\Directory3",
    "\\Computer1\SharedFolder1",
    "\\Computer2\SharedFolder2",
    "\\Computer3\SharedFolder3"
)

# 記錄日誌的檔案路徑
$logFile = "C:\SHA256_ErrorLog.txt"

# 清空日誌檔案
Clear-Content -Path $logFile -ErrorAction SilentlyContinue

foreach ($directory in $directories) {
    Write-Host "Processing directory: $directory" -ForegroundColor Green
    try {
        # 獲取目錄中的所有檔案,排除副檔名為 .SHA256 的檔案
        $files = Get-ChildItem -Path $directory -Recurse -File | Where-Object { $_.Extension -ne ".SHA256" }

        foreach ($file in $files) {
            try {
                # 計算檔案的 SHA256
                $hash = Get-FileHash -Path $file.FullName -Algorithm SHA256
                # 生成 .SHA256 檔案的完整路徑
                $outputFile = $file.FullName + ".SHA256"
                # 將哈希值寫入 .SHA256 檔案
                $hash.Hash | Out-File -FilePath $outputFile -Encoding UTF8
            } catch {
                # 如果某檔案處理失敗,記錄錯誤訊息
                $errorMessage = "Failed to process file: $($file.FullName). Error: $($_.Exception.Message)"
                Write-Host $errorMessage -ForegroundColor Red
                Add-Content -Path $logFile -Value $errorMessage
            }
        }
    } catch {
        # 如果整個目錄無法訪問,記錄錯誤訊息
        $errorMessage = "Failed to process directory: $directory. Error: $($_.Exception.Message)"
        Write-Host $errorMessage -ForegroundColor Red
        Add-Content -Path $logFile -Value $errorMessage
    }
}

********************************************************************************

對本機電腦,排除已經存在的 .SHA256,處理多個目錄;失敗時輸出訊息,但仍要繼續對其它檔案進行 SHA256;如果某檔案 AAA 已經存在 AAA.SHA256,不要再對 AAA 作 SHA256



C:
# 定義多個網路共享的目錄 (使用 UNC 路徑)
$directories = @(
    "\\Computer1\SharedFolder1",
    "\\Computer2\SharedFolder2",
    "\\Computer3\SharedFolder3"
)

# 記錄日誌的檔案路徑
$logFile = "C:\Temp\SHA256_ErrorLog.txt"

# 確保 Temp 目錄存在
if (-not (Test-Path -Path "C:\Temp")) {
    New-Item -ItemType Directory -Path "C:\Temp" | Out-Null
}

# 清空日誌檔案
Clear-Content -Path $logFile -ErrorAction SilentlyContinue

foreach ($directory in $directories) {
    Write-Host "Processing directory: $directory" -ForegroundColor Green
    try {
        # 獲取目錄中的所有檔案,排除副檔名為 .SHA256 的檔案
        $files = Get-ChildItem -Path $directory -Recurse -File | Where-Object { $_.Extension -ne ".SHA256" }

        foreach ($file in $files) {
            try {
                # 檢查是否存在對應的 .SHA256 檔案
                $outputFile = $file.FullName + ".SHA256"
                if (Test-Path $outputFile) {
                    Write-Host "Skipping file: $($file.FullName) (SHA256 file already exists)" -ForegroundColor Yellow
                    continue
                }

                # 計算檔案的 SHA256
                $hash = Get-FileHash -Path $file.FullName -Algorithm SHA256

                # 將哈希值寫入 .SHA256 檔案
                $hash.Hash | Out-File -FilePath $outputFile -Encoding UTF8
                Write-Host "Generated SHA256 for file: $($file.FullName)" -ForegroundColor Green
            } catch {
                # 如果某檔案處理失敗,記錄錯誤訊息
                $errorMessage = "Failed to process file: $($file.FullName). Error: $($_.Exception.Message)"
                Write-Host $errorMessage -ForegroundColor Red
                Add-Content -Path $logFile -Value $errorMessage
            }
        }
    } catch {
        # 如果整個目錄無法訪問,記錄錯誤訊息
        $errorMessage = "Failed to process directory: $directory. Error: $($_.Exception.Message)"
        Write-Host $errorMessage -ForegroundColor Red
        Add-Content -Path $logFile -Value $errorMessage
    }
}

(完)

相關

沒有留言:

張貼留言