用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
使用说明:
- 将上述脚本保存为一个
.ps1文件,例如ComputeHashes.ps1。 - 打开 PowerShell,导航到脚本所在的目录。
- 确保您的 PowerShell 执行策略允许运行脚本。如果需要,可以使用
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser命令来设置。 - 运行脚本:
.\ComputeHashes.ps1。 - 根据提示输入文件路径。
- 脚本将计算文件的 MD5、SHA1、SHA256 和 SHA512 哈希值,并将结果输出到与源文件相同目录下的
hash-{源文件名}.txt文件中,内容分大小写各保存一份。
注意事项:
- 脚本使用了 PowerShell 内置的
Get-FileHashcmdlet 来计算哈希值,该 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"
这个脚本做了以下几件事:
- 从控制台读取文件路径。
- 使用
Trim方法去除路径字符串前后的任何空白字符(虽然这通常不是必需的,因为Read-Host不包含引号,但这样做可以确保路径的清洁)。 - 使用
System.IO.Path类的静态方法获取文件名(不带扩展名)和目录。 - 使用
Get-FileHashcmdlet 计算文件的 MD5、SHA1、SHA256 和 SHA512 哈希值。 - 准备输出内容,将每个哈希值的大小写版本都添加到输出数组中。
- 创建输出文件的路径。
- 将输出内容写入文件,使用 UTF-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是大小写不敏感的(但可以通过正则表达式标志来调整)。
选择哪个方法或运算符取决于具体的需求和场景。