PowerShell动态拼接PSObject成员值构建变量问题求助
解决PowerShell动态引用PSCustomObject成员的问题
方法一:使用Get-Variable(推荐,避免注入风险)
你当前的代码只是拼接出了变量名的字符串,并没有实际获取到对应PSCustomObject的属性值。通过Get-Variable可以根据变量名动态获取目标对象,再直接访问其属性:
$SiteCode_SHA = [PSCustomObject]@{ CountryCode = "CH" SiteCode = "SHA" ContainerCode = "CHA" } $SiteCode_IND = [PSCustomObject]@{ CountryCode = "IN" SiteCode = "MOB" ContainerCode = "IND" } [array]$ComputerTypeArray = "LT", "PC", "PR" [string]$SiteCodeInput = (Read-Host -Prompt "Prompt #1 Input Options: SHA, IND") # 动态获取对应的SiteCode变量对象 $siteObject = Get-Variable -Name "SiteCode_$SiteCodeInput" -ValueOnly # 提取CountryCode属性值 $ProposedComputerName = $siteObject.CountryCode # 后续结合计算机类型构建完整名称示例 $selectedType = $ComputerTypeArray | Get-Random $fullComputerName = "$ProposedComputerName-$($siteObject.SiteCode)-$selectedType-001" Write-Host "生成的计算机名:$fullComputerName"
方法二:用哈希表统一管理站点配置(更优雅的可维护方案)
与其单独定义多个SiteCode_xxx变量,不如把所有站点对象存入一个哈希表,动态引用会更直观,后续新增站点也只需在哈希表中添加条目:
# 哈希表统一存储所有站点配置 $SiteConfigs = @{ SHA = [PSCustomObject]@{ CountryCode = "CH" SiteCode = "SHA" ContainerCode = "CHA" } IND = [PSCustomObject]@{ CountryCode = "IN" SiteCode = "MOB" ContainerCode = "IND" } } [array]$ComputerTypeArray = "LT", "PC", "PR" [string]$SiteCodeInput = (Read-Host -Prompt "Prompt #1 Input Options: SHA, IND") # 验证输入有效性后获取属性值 if ($SiteConfigs.ContainsKey($SiteCodeInput)) { $ProposedComputerName = $SiteConfigs[$SiteCodeInput].CountryCode # 构建完整计算机名示例 $selectedType = $ComputerTypeArray | Get-Random $fullComputerName = "$ProposedComputerName-$($SiteConfigs[$SiteCodeInput].SiteCode)-$selectedType-001" Write-Host "生成的计算机名:$fullComputerName" } else { Write-Warning "输入的站点代码无效,请输入SHA或IND" }
方案说明
- 方法一适合对现有代码改动较小的场景,通过
Get-Variable实现动态变量引用; - 方法二优化了配置管理结构,代码可读性和扩展性更强,是更推荐的实践方式;
- 两种方案都能解决你当前字符串拼接无法读取PSObject成员值的问题。
内容的提问来源于stack exchange,提问作者manhadchiggers
相关产品推荐
相关产品推荐

