用powershell写一个校验文件MD5, sha1, sha256, sha512 的脚本

195 阅读3分钟

用powershell写一个校验文件MD5, sha1, sha256, sha512 的脚本, 要求从控制台输入文件路径, 将结果输出到所在文件夹的 "hash-{源文件名}.txt"文件, 内容分大小写各保存一份

以下是一个简化的 PowerShell 脚本,用于校验文件的 MD5、SHA1、SHA256 和 SHA512 哈希值。该脚本从控制台输入文件路径,并将结果输出到所在文件夹的 hash-{源文件名}.txt 文件中,内容分大小写各保存一份。

# Function to compute hash for a given file and algorithm
function Compute-Hash {
    param (
        [Parameter(Mandatory=$true)]
        [string]$FilePath,
        [Parameter(Mandatory=$true)]
        [string]$Algorithm
    )

    $hash = (Get-FileHash -Path $FilePath -Algorithm $Algorithm).Hash
    return @{
        Algorithm = $Algorithm
        HashLowerCase = $hash.ToLower()
        HashUpperCase = $hash.ToUpper()
    }
}

# Read file path from user input
$filePath = Read-Host "请输入文件路径"
#替换写法1
$filePath = $filePath.Replace('"', '')
#替换写法2
$filePath = $filePath -replace '^"(.*)"$', '$1'

# Check if the file exists
if (!(Test-Path -Path $filePath -PathType Leaf)) {
    Write-Host "文件不存在: $filePath" -ForegroundColor Red
    exit 1
}

# Define hash algorithms to use
$algorithms = @("MD5", "SHA1", "SHA256", "SHA512")

# Initialize an array to hold hash results
$hashResults = @()

# Compute hashes for each algorithm
foreach ($algo in $algorithms) {
    $hashResult = Compute-Hash -FilePath $filePath -Algorithm $algo
    $hashResults += ,$hashResult
}

# Prepare output content
$outputContent = ""
foreach ($result in $hashResults) {
    $outputContent += "$($result.Algorithm)_lower: $($result.HashLowerCase)`r`n"
    $outputContent += "$($result.Algorithm)_upper: $($result.HashUpperCase)`r`n`r`n"
}

# Get file name and directory
$fileName = [System.IO.Path]::GetFileName($filePath)
$directory = [System.IO.Path]::GetDirectoryName($filePath)

# Define output file name
$outputFileName = "hash-$fileName.txt"
$outputPath = Join-Path -Path $directory -ChildPath $outputFileName

# Write output content to file
[System.IO.File]::WriteAllText($outputPath, $outputContent)

Write-Host "哈希值已保存到文件: $outputPath" -ForegroundColor Green

使用说明:

  1. 将上述脚本保存为一个 .ps1 文件,例如 ComputeHashes.ps1
  2. 打开 PowerShell,导航到脚本所在的目录。
  3. 确保您的 PowerShell 执行策略允许运行脚本。如果需要,可以使用 Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser 命令来设置。
  4. 运行脚本:.\ComputeHashes.ps1
  5. 根据提示输入文件路径。
  6. 脚本将计算文件的 MD5、SHA1、SHA256 和 SHA512 哈希值,并将结果输出到与源文件相同目录下的 hash-{源文件名}.txt 文件中,内容分大小写各保存一份。

注意事项:

  • 脚本使用了 PowerShell 内置的 Get-FileHash cmdlet 来计算哈希值,该 cmdlet 在 PowerShell 4.0 及更高版本中可用。
  • 如果您的 PowerShell 版本低于 4.0,您可能需要升级 PowerShell 或使用其他方法来计算哈希值。
  • 脚本中的错误处理相对简单,仅检查文件是否存在。在实际应用中,您可能希望添加更多的错误处理逻辑。

2号

在 PowerShell 中,你可以编写一个脚本来校验文件的 MD5、SHA1、SHA256 和 SHA512 哈希值,并将结果输出到所在文件夹的 hash-{源文件名}.txt 文件中,内容分别保存大小写各一份。以下是一个示例脚本:

# 从控制台输入文件路径
$filePath = Read-Host "Please enter the file path"

# 去除路径的引号(实际上,Read-Host 返回的字符串通常不包含引号,除非用户故意输入)
# 但为了安全起见,我们可以使用 Trim 方法去除任何前后的空白字符,包括引号
$filePath = $filePath.Trim()
#替换写法1
$filePath = $filePath.Replace('"', '')
#替换写法2
$filePath = $filePath -replace '^"(.*)"$', '$1'

# 获取文件名(不带扩展名)和目录
$fileName = [System.IO.Path]::GetFileNameWithoutExtension($filePath)
$directory = [System.IO.Path]::GetDirectoryName($filePath)

# 计算哈希值
$hashes = @{
    MD5    = (Get-FileHash -Path $filePath -Algorithm MD5).Hash
    SHA1   = (Get-FileHash -Path $filePath -Algorithm SHA1).Hash
    SHA256 = (Get-FileHash -Path $filePath -Algorithm SHA256).Hash
    SHA512 = (Get-FileHash -Path $filePath -Algorithm SHA512).Hash
}

# 准备输出内容
$outputLines = @()
foreach ($key in $hashes.Keys) {
    $lowerCaseHash = $hashes[$key].ToLower()
    $upperCaseHash = $hashes[$key].ToUpper()
    $outputLines += "Lowercase 小写 ${key}: $lowerCaseHash"
    $outputLines += "Uppercase 大写 ${key}: $upperCaseHash"
    $outputLines += "" # 空行分隔
}

# 创建输出文件路径
$outputFilePath = Join-Path -Path $directory -ChildPath "hash-$fileName.txt"

# 将输出内容写入文件
$outputLines | Out-File -FilePath $outputFilePath -Encoding utf8

# 输出提示信息
Write-Host "Hashes have been written to $outputFilePath"

这个脚本做了以下几件事:

  1. 从控制台读取文件路径。
  2. 使用 Trim 方法去除路径字符串前后的任何空白字符(虽然这通常不是必需的,因为 Read-Host 不包含引号,但这样做可以确保路径的清洁)。
  3. 使用 System.IO.Path 类的静态方法获取文件名(不带扩展名)和目录。
  4. 使用 Get-FileHash cmdlet 计算文件的 MD5、SHA1、SHA256 和 SHA512 哈希值。
  5. 准备输出内容,将每个哈希值的大小写版本都添加到输出数组中。
  6. 创建输出文件的路径。
  7. 将输出内容写入文件,使用 UTF-8 编码。
  8. 输出提示信息,告知用户哈希值已写入文件。

你可以将上述脚本保存为一个 .ps1 文件,然后在 PowerShell 中运行它。例如,将脚本保存为 CheckHashes.ps1,然后在 PowerShell 控制台中执行 .\CheckHashes.ps1







powershell 字符串替换 replace()-replace 比较

在 PowerShell 中,处理字符串替换时,Replace() 方法和 -replace 运算符都可以用来替换字符串中的部分内容。然而,它们有一些重要的区别和适用场景。以下是它们之间的一些主要差异和比较:

1. Replace() 方法

  • 类型Replace() 是 .NET String 类的一个实例方法。
  • 语法$string.Replace("oldValue", "newValue")
  • 大小写敏感:默认情况下是大小写敏感的。
  • 正则表达式:不支持正则表达式,只能进行简单的文本替换。
  • 返回值:返回一个新的字符串,原始字符串不变(因为字符串在 .NET 中是不可变的)。
示例:
$originalString = "Hello World"
$newString = $originalString.Replace("World", "PowerShell")
Write-Output $newString  # 输出: Hello PowerShell
Write-Output $originalString  # 输出: Hello World(原始字符串不变)

2. -replace 运算符

  • 类型-replace 是 PowerShell 的一个运算符。
  • 语法$string -replace "pattern", "replacement"
  • 大小写敏感:默认情况下是大小写不敏感的,但可以通过在正则表达式模式中添加 (?i) 标志来显式指定大小写敏感。
  • 正则表达式:支持正则表达式,可以进行复杂的模式匹配和替换。
  • 返回值:返回一个新的字符串,原始字符串不变。
示例:
$originalString = "Hello World"
$newString = $originalString -replace "World", "PowerShell"
Write-Output $newString  # 输出: Hello PowerShell
Write-Output $originalString  # 输出: Hello World(原始字符串不变)

# 使用正则表达式替换所有数字为 "NUM"
$originalString = "There are 123 apples and 456 oranges"
$newString = $originalString -replace '\d+', 'NUM'
Write-Output $newString  # 输出: There are NUM apples and NUM oranges

比较总结

  • 简单文本替换:如果只需要进行简单的文本替换,并且不需要正则表达式功能,Replace() 方法是一个不错的选择。
  • 复杂模式匹配:如果需要进行复杂的模式匹配和替换,或者需要正则表达式的功能,-replace 运算符是更好的选择。
  • 大小写敏感性Replace() 是大小写敏感的,而 -replace 是大小写不敏感的(但可以通过正则表达式标志来调整)。

选择哪个方法或运算符取决于具体的需求和场景。