【问题标题】:Replacing CRLF with LF newline control characters in PowerShell Format-Table output用 PowerShell 格式表输出中的 LF 换行符控制字符替换 CRLF
【发布时间】:2019-06-08 05:33:48
【问题描述】:

我一直在尝试复制 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 powershellIn PowerShell how to replace carriage return

【问题讨论】:

  • 问题是什么?一个更好的展示工作代码的地方是CodeReview
  • 不过一个班轮(Get-FileHash -Algorithm md5 -Path (Get-ChildItem "*.*" -Recurse)|ForEach-Object{"{0} {1}" -f $_.Hash.ToLower(),(Resolve-Path $_.Path -Relative)}|Out-String) -replace '\r(?=\n)'|Set-Content -NoNewline -Encoding Ascii sample.md5
  • 我们还没有收到您的来信。我的回答解决了您的问题吗?如果是这样,请点击左侧的✓ 考虑accepting。这将帮助其他有类似问题的人更轻松地找到它。

标签: powershell


【解决方案1】:

这种方法不是在之后替换所有 "\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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 2013-10-08
    • 2022-10-24
    相关资源
    最近更新 更多