gpt4 book ai didi

powershell - 基于 PowerShell 中另一个参数的值生成动态验证集

转载 作者:行者123 更新时间:2023-12-01 22:57:11 26 4
gpt4 key购买 nike

一些背景知识:我们正在研究一个遍历数百个条目的函数,类似于以下内容:

<表类="s-表"><头>城市状态人口<正文>纽约纽约8467513洛杉矶加州3849297芝加哥伊利诺伊州2696555休斯顿德克萨斯州2288250凤凰亚利桑那1624569费城宾夕法尼亚州1576251圣安东尼奥德克萨斯州1451853圣地亚哥加州1381611达拉斯德克萨斯州1288457圣何塞加州983489

原始数据将使用 Import-Csv 获取。 CSV 会定期更新。

我们正在尝试使用 PowerShell 类让人们能够根据他们选择的 City 选择 State。这是我们目前得到的 MWE:

$Global:StateData = Import-Csv \\path\to\city-state-population.csv

class State : System.Management.Automation.IValidateSetValuesGenerator {
[string[]] GetValidValues() {
return (($Global:StateData).State | Select-Object -Unique)
}
}
class City : System.Management.Automation.IValidateSetValuesGenerator {
[string[]] GetValidValues($State) {
return ($Global:StateData | Where-Object State -eq $State).City
}
}
function Get-Population {
param (
# Name of the state
[Parameter(Mandatory, Position = 0)]
[ValidateSet([State])]
$State,

# Name of the city
[Parameter(Mandatory, Position = 1)]
[ValidateSet([City])]
$City
)

$City | ForEach-Object {
$TargetCity = $City | Where-Object City -match $PSItem
"The population of $($TargetCity.City), $($TargetCity.State) is $($TargetCity.Population)."
}
}

当然,按照official documentation的说法,GetValidValues()好像是不接受参数输入的。有没有办法实现这一点?

结果需要与 PowerShell Function – Validating a Parameter Depending On A Previous Parameter’s Value 类似,但帖子采用的方法超出了我们拥有的数据量的想象。

注意:这是在 PowerShell (Core) 上,而不是在 Windows PowerShell 上。后者没有IValidateSetValuesGenerator接口(interface)。

最佳答案

老实说,我不确定你是否可以用两个 ValidateSet Attribute Declarations 来做到这一点, 然而,你可以让它与一个 ValidateSet 一起工作和一个 custom class实现了 IArgumentCompleter Interface因为它可以访问 $fakeBoundParameters 。这是一个示例,它肯定需要改进,但希望能让您走上正轨。

using namespace System.Management.Automation
using namespace System.Management.Automation.Language
using namespace System.Collections
using namespace System.Collections.Generic

class State : IValidateSetValuesGenerator {
[string[]] GetValidValues() {
return $script:StateData.State | Select-Object -Unique
}
}

class Completer : IArgumentCompleter {
[IEnumerable[CompletionResult]] CompleteArgument(
[string] $CommandName,
[string] $ParameterName,
[string] $WordToComplete,
[CommandAst] $CommandAst,
[IDictionary] $FakeBoundParameters
) {
[List[CompletionResult]] $result = foreach($line in $script:StateData) {
if($line.State -ne $FakeBoundParameters['State'] -or $line.City -notlike "*$wordToComplete*") {
continue
}
$city = $line.City
[CompletionResult]::new("'$city'", $city, [CompletionResultType]::ParameterValue, $city)
}
return $result
}
}

function Get-Population {
param(
[Parameter(Mandatory, Position = 0)]
[ValidateSet([State])]
[string] $State,

[Parameter(Mandatory, Position = 1)]
[ArgumentCompleter([Completer])]
[string] $City
)

"State: $State \\ City: $City"
}

演示

demo

关于powershell - 基于 PowerShell 中另一个参数的值生成动态验证集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72748055/

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