gpt4 book ai didi

powershell - “$xyz”和“Write-Host ” $ xyz “”提供不同的输出

转载 作者:行者123 更新时间:2023-12-03 00:59:02 25 4
gpt4 key购买 nike

我对一个位置(原始文件夹)中的所有文件进行哈希处理,然后将哈希值写入变量,然后对另一位置(目标文件夹)中的所有文件执行相同的操作:

$origin = Get-ChildItem .\Test1 | Get-FileHash | Format-Table -Property Hash -HideTableHeaders
$destination = Get-ChildItem .\Test2 | Get-FileHash | Format-Table -Property Hash -HideTableHeaders

然后,我将它们与Compare-Object进行比较,如下所示:
Compare-Object $origin $destination

现在,在我的测试中,我故意有偏差,因此,当以上代码未返回任何差异时,我知道我有问题。

然后我发现,如果执行以下操作,则哈希值不存在:

PS>写主机“$ origin”
Microsoft.PowerShell.Commands.Internal.Format.FormatStartData Microsoft.PowerShell.Commands.Internal.Format.GroupStartData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands。 Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.GroupEndData Microsoft.PowerShell.Commands.Internal.Format.FormatEndData

但是,如果我只键入以下内容并按Enter,则存在哈希值(就像我想要的那样):

PS> $ origin

6B86B273FF34FCE19D6B804EFF5A3F5747ADA4EAA22F1D49C01E52DDB7875B4B
D4735E3A265E16EEE03F59718B9B5D03019C07D8B6C51F90DA3A666EEC13AB35
4E07408562BEDB8B60CE05C1DECFE3AD16B72230967DE01F640B7E4729B49FCE

我假设当我使用 Compare-Object时,我的变量没有像我期望的那样显示哈希值。

有人知道发生了什么或有任何建议吗?这用于确保文件从原始位置移动到目标位置(这是我正在处理的脚本中的一项检查)。我仅保留此PowerShell,这意味着没有 xcopyrobocopy

最佳答案

重新使用Format-TableCompare-Object创建输入集合:

仅使用Format-* cmdlet进行显示格式设置;如果必须对数据进行编程处理,请不要使用
Format-* cmdlet输出格式说明,而不是数据-请参阅this answer

因此:

  • 忽略输入集合定义命令中的Format-Table调用:
  • $origin=Get-ChildItem .\Test1 | Get-FileHash
    $destination=Get-ChildItem .\Test2 | Get-FileHash
  • 然后将属性名称传递给Compare-Object来比较对象:
  • Compare-Object $origin $destination -Property Path, Hash

    请注意需要通过路径和哈希进行比较,以确保仅比较名称相同的文件。

    顺便说一句:如果您未指定 -Property,则默认情况下会将对象与它们的 .ToString()值进行比较-并且由于 Microsoft.PowerShell.Commands.FileHashInfo输出的 Get-FileHash实例仅会字符串化为该类型名称(无论其特定的属性值如何),会发现差异。

    至于 $originWrite-Host $orgin:
  • 只是执行$origin就像执行Write-Output $origin一样,它会写入成功输出流(请参阅about_Redirection),默认情况下会进入控制台。
  • 到控制台的成功输出是,它由PowerShell的丰富output-formatting system 自动格式化。
  • Write-Host ,相比之下,的目的不同于Write-Output :
  • 它绕过PowerShell的成功输出流并因此也照通常的格式直接写入控制台[1]。 的主要目的是将状态消息,交互式提示消息……写到显示器上-而不是输出数据。
  • Write-Host本身会应用输出格式,但只能通过简单.ToString()字符串化来实现,这通常会产生无用的(仅类型名称)表示形式,在您的情况下。

  • 有关 Write-OutputWrite-Host之间的区别的更多信息,请参见 this answer

    [1]从技术上讲,从PowerShell版本5开始, Write-Host输出通过信息输出流(编号 6)到达控制台,但是其主要目的仍然是写入显示而不是输出数据。

    关于powershell - “$xyz”和“Write-Host ” $ xyz “”提供不同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58825933/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com