gpt4 book ai didi

powershell - 在Powershell中声明哈希表时引用值的键

转载 作者:行者123 更新时间:2023-12-02 23:17:21 26 4
gpt4 key购买 nike

如果我有一个哈希表,其中在值中使用键,例如“你好”在这里:

$ht = @{ 'hello' = 'hello world' }

是否可以引用值中的实际键,如下所示:
$ht = @{ 'hello' = "$key world" }

真实示例是一个哈希表,其中的键是字段名称,值是脚本块,用于定义如何比较两个对象之间的字段,如下所示:
$ht = @{
'thisField' = { Param($tp, $dp) $tp.thisField -eq $db.thisField }
'thatField' = { Param($tp, $dp) $tp.thatField -eq $db.thatField }
}

比较通常比显示的更为复杂,并且在各个字段之间有所不同,但是每个脚本块仅比较作为该块关键的字段。如果可能,我想做这样的事情:
$ht = @{
'thisField' = { Param($tp, $dp) $tp.$key -eq $db.$key }
'thatField' = { Param($tp, $dp) $tp.$key -eq $db.$key }
}

编辑:@Mathias R. Jessen对问题的答复:

真实世界的哈希表用于测试脚本中。通过使用哈希表(其中的键是列名)来测试数据库记录,脚本块定义了如何根据期望值验证实际列值。比较并不总是只是“-eq”。

测试表时,哈希表用于通过根据脚本块比较每个字段来验证预期记录是否与实际记录匹配,如下所示:
function compare($rules, $expected, $actual)
{
$rules.Keys | Foreach-Object {
$key = $_ # e.g. 'thisField'
$rule = $rules[$key] # e.g. { Param($tp, $dp) $tp.thisField -eq $db.thisField }
if (-not (& $rule $expected $actual))
{
throw "Comparison failed for $key"
}
}

将哈希表与脚本块一起使用是一种为“数据”块中的每个表定义规则的便捷方法。它运作良好,我只是想知道是否有一种避免重复列名的方法。

最佳答案

如果您以编程方式而不是声明性哈希表文字顺序地填充哈希表,则可以通过在用作值的脚本块上调用 .GetNewClosure() 方法来实现解决方案:

# Initialize the hashtable.
# Note: Use `$ht = [ordered] @{}` if you want to preserve the insertion order.
$ht = @{}

# Populate the key and value arrays:
# Keys:
$keys = 'thisField',
'thatField'
# Corresponding values (script blocks):
$values = { Param($tp, $dp) $tp.$key -eq $db.$key },
{ Param($tp, $dp) $tp.$key -eq $db.$key } # potentially different

# Populate the hashtable entry by entry.
$i = 0
$keys.ForEach({

# Store the key in an aux. variable.
$key = $_

# Create the entry, calling .GetNewClosure() on the script block,
# which captures the then-current value of $key.
$ht[$key] = $values[$i++].GetNewClosure()

})

compare作为 $ht参数传递时,您的 $rules函数将按预期工作。

关于powershell - 在Powershell中声明哈希表时引用值的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61915859/

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