我一直在尝试复制Unix命令find . -type f -exec md5sum {} +
的输出,以计算PowerShell中目录及其子目录中所有文件的哈希(即两列:小写的MD5哈希和相对文件路径)。与下面的代码相比,是否有更好的方法用换行符标记换行符而不是回车和换行符?
$Result = Get-FileHash -Algorithm MD5 -Path (Get-ChildItem "*.*" -Recurse) | Select-Object @{N='Hash';E={$_.Hash.ToLower()}},@{N='Path';E={$_.Path | Resolve-Path -Relative}}
($Result | Format-Table -AutoSize -HideTableHeaders | Out-String).Trim() + "`n" -replace ' *\r\n',"`n" | Set-Content -NoNewline -Encoding ascii $ENV:USERPROFILE\Desktop\MYFOLDER\hashes.txt
第一行返回小写的哈希值和相对路径。
第二行使用Format-Table
排除列标题(使用选项-HideTableHeaders
加上使用选项-AutoSize
以避免截断较长的相对文件路径)。
Out-String
将输出转换为字符串,而.Trim()
删除前和后的空白行。
目前,我添加了换行符
`+ "`n"`
然后使用
`-replace ' *\r\n',"`n"`
进行替换并消除每行末尾的多余空格。最后,Set-Content
使用选项-NoNewline
避免换行符带有回车符。
我看过这些类似的问题:Replace CRLF using powershell 和 In PowerShell how to replace carriage return
答案 0 :(得分:0)
此方法不再生成所有"\r\n"
换行符,而是建立一个字符串列表,并将它们与所需的换行符连接在一起:
$path = 'YOUR ROOT DIRECTORY'
$algo = 'MD5'
$list = Get-ChildItem -Path $Path -File -Recurse | Get-FileHash -Algorithm $algo | ForEach-Object {
"{0} {1}" -f $_.Hash.ToLower(), (Resolve-Path $_.Path -Relative)
}
Set-Content -Path 'D:\checksums.txt' -Value ($list -join "`n") -NoNewline -Encoding Ascii -Force
执行此操作的另一种方法可能是将StringBuilder
对象与其AppendFormat
方法一起使用:
$path = 'YOUR ROOT DIRECTORY'
$algo = 'MD5'
$sb = New-Object -TypeName System.Text.StringBuilder
Get-ChildItem -Path $Path -File -Recurse | Get-FileHash -Algorithm $algo | ForEach-Object {
[void]$sb.AppendFormat("{0} {1}`n", $_.Hash.ToLower(), (Resolve-Path $_.Path -Relative))
}
# trim off the final "`n"
$sb.Remove($sb.Length -1, 1)
Set-Content -Path 'D:\checksums.txt' -Value $sb.ToString() -NoNewline -Encoding Ascii -Force