当前位置: 首页 > 知识库问答 >
问题:

Powershell eq运算符表示哈希不同,而Write Host则表示相反

臧翰采
2023-03-14

我有一个脚本,它定期生成一个目录中所有文件的列表,然后将结果的文本文件写入另一个目录。

我想更改它,以便它检查输出目录中的最新文本文件,并且只有在有差异时才创建新的文本文件。这似乎很简单。

以下是我尝试的内容:

首先,我获取目录中最新的文件,获取哈希,然后将变量值写入控制台:

$lastFile = gci C:\ReportOutputDir | sort LastWriteTime | select -last 1 | Select-Object -ExpandProperty FullName
$oldHash = Get-FileHash $lastFile | Select-Object Hash
Write-Host 'lastFile = '$lastFile
Write-Host 'oldHash = '$oldHash

输出:

lastFile = C:\ReportOutputDir\test1.txt
oldHash =  @{Hash=E7787C54F5BAE236100A24A6F453A5FDF6E6C7333B60ED8624610EAFADF45521}

然后我在FileList目录上执行完全相同的gci,并创建一个新文件(new_test.txt),然后获取该文件的哈希值:

gci -Path C:\FileLists -File -Recurse -Name -Depth 2 | Sort-Object | out-file C:\ReportOutputDir\new_test.txt
$newFile = gci C:\ReportOutputDir | sort LastWriteTime | select -last 1 | Select-Object -ExpandProperty FullName
$newHash = Get-FileHash $newFile | Select-Object Hash
Write-Host 'newFile = '$newFile
Write-Host 'newHash = '$newHash

输出:

newFile =  C:\ReportOutputDir\new_test.txt
newHash =  @{Hash=E7787C54F5BAE236100A24A6F453A5FDF6E6C7333B60ED8624610EAFADF45521}

最后,我尝试使用我的-eq操作符,如果newFile相等,我通常只删除它。现在,我只做一个简单的:

if ($newHash -eq $oldHash){
'files are equal'
}
else {'files are not equal'}

不知怎么的,我

files are not equal

有什么好处?此外,对于记录,我最初试图将gci输出保存到一个变量,并将最后一个文件的内容与gci输出进行比较,但也遇到了-eq运算符的问题。我对powershell的东西还比较陌生,所以我肯定我在这里做错了什么。

共有1个答案

奚才良
2023-03-14

>

  • 选择对象哈希创建一个带有的对象。哈希属性,正是该属性包含哈希字符串。

    返回的对象类型为[pscustomject],这种类型的两个实例永远不会比较为相等-即使它们的所有属性名称和值都相等:

    >

    测试引用相等意味着只有对同一实例的两个引用比较相等。

    一个简单的例子:

    PS> [pscustomobject] @{ foo = 1 } -eq [pscustomobject] @{ foo = 1 }
    False # !! Two distinct instances aren't equal, no matter what they contain.
    

    你有两个选择:

    >

  • 比较<代码>。散列属性值,而不是对象作为一个整体:

    if ($newHash.Hash -eq $oldHash.Hash) { # ...
    

    如果您不需要散列字符串的[pscustomObject]包装器,请使用Sselt-Object-扩充属性参数而不是(可能位置隐含)-Property参数:

    Select-Object -ExpandProperty Hash
    

    至于写入主机输出匹配的原因:

    当您强制将对象转换为字符串表示形式时,基本上,写入主机调用。ToString()在其参数上-具有相同属性和值的不同实例的字符串表示形式将相同:

    PS> "$([pscustomobject] @{ foo = 1 })" -eq "$([pscustomobject] @{ foo = 1 })"
    True # Same as: '@{foo=1}' -eq '@{foo=1}'
    

    但是,您不应该依赖这些类似哈希表的字符串表示来确定[pscustomject]s作为一个整体的相等性,因为这些表示的固有限制很容易产生误报。

    此答案显示了如何将实例作为一个整体进行比较,方法是比较它们的所有属性值,将所有属性名称传递给比较对象属性,但请注意,这假设所有属性值都是的字符串或实例。净值类型或相应的属性必须再次引用相同的实例。NET引用类型或属于实现自定义相等比较逻辑的类型。

  •  类似资料:
    • 哈希表 通过最简单的取模运算作为哈希算法 class HashNode(object): def __init__(self, id, data): self.id = id self.data = data self.next = None def __str__(self): return '(%d,%s)' %

    • REDIS_HASH (哈希表)是 HSET 、 HLEN 等命令的操作对象, 它使用 REDIS_ENCODING_ZIPLIST 和 REDIS_ENCODING_HT 两种编码方式: 字典编码的哈希表 当哈希表使用字典编码时, 程序将哈希表的键(key)保存为字典的键, 将哈希表的值(value)保存为字典的值。 哈希表所使用的字典的键和值都是字符串对象。 下图展示了一个包含三个键值对的哈希

    • Hashtbl 模块 Hashtbl模块实现了一个高效的,可变的查询表。如下创建一个哈希表: # let my_hash = Hashtbl.create 123456;; val my_hash : ('_weak1, '_weak2) Hashtbl.t = <abstr> 这个123456是哈希表的初始大小。这个值可以是你对数据量的一种猜测,但是哈希表有可能会 随着数据量的增多而变大,因此

    • 问题内容: 当大小超过maxthreshold值时,如何在哈希表或哈希表中进行重新哈希处理? 是否所有对都已复制到新的存储桶阵列中? 编辑: 重新哈希后,同一存储桶(位于链接列表中)中的元素会发生什么情况?我的意思是说,他们在重新哈希处理后会留在同一个桶中吗? 问题答案: 问题中的最大阈值称为负载系数。 建议负载系数约为0.75。负载因子定义为(m / n),其中n是哈希表的总大小,m是在需要增加

    • 问题内容: 为什么以下语句返回? 我也尝试过在字符串周围使用单引号。我唯一可以评估的方法是使用运算符,而不是 我的猜测是PHP将它视为某种方程式,但似乎有些奇怪。 有人可以详细说明吗? 问题答案: 是float数字格式,因此它们在比较时将转换为数字。 并且都将是因为它们太小。 对于在php中, 如果将数字与字符串进行比较,或者比较涉及 数字字符串 ,则每个字符串将转换为 数字 ,然后以数字方式进行

    • 问题内容: 正则表达式中是否存在NOT运算符?就像在那个字符串中一样: 我想删除所有但不是一年的:。 因此,正则表达式应返回的内容必须是:。 注意:类似的东西对我不起作用(某种程度上也匹配…) 问题答案: 不,没有直接的非运算符。至少不是您希望的方式。 您可以使用零宽度的负前瞻,但是: 该部分的意思是“仅在 以下 文本(因此:前瞻)与此(因此:否定) 不 匹配时才匹配。但是它实际上并不会 消耗 其