PowerShell:如何合并变量名调用动态命名变量并构建PSObject
问题:PowerShell动态变量引用与PSObject整合问题
我通过以下代码创建了动态变量:
$Data = @() $i = 1 Foreach ($S in $SB) { New-variable "JR$i" "content" New-variable "SN$i" "content" New-variable "T$i" "content" New-variable "FN$i" "content" $i = $i++ }
我的目标是将这些动态变量按如下方式放入PSObject中,但当前写法无法正确引用动态变量:
$Data += new-object psobject -property ([ordered]@{JR = "<tr><td>$JR$i</td>"; SN = "<tr><td>$SN$i</td>"; T = "<tr><td>$T$i</td>"; FN = "<tr><td>$FN$i</td>"})
请问如何合并变量名来正确调用这些动态命名的变量?
解决方案
1. 正确引用动态变量的语法
直接写$JR$i会被PowerShell解析为变量$JR的值加上变量$i的值,而非你期望的JR1/JR2这类完整变量名。你需要使用变量名拼接的子表达式语法:${"JR$i"},PowerShell会将引号内的内容解析为完整的变量名,从而获取对应的值。
同时注意,你代码里的$i = $i++存在逻辑错误,这会导致$i的值始终无法递增,应改为$i++或$i = $i + 1。
修改后的完整代码:
$Data = @() $i = 1 Foreach ($S in $SB) { # 创建动态变量 New-variable "JR$i" "content_$i" New-variable "SN$i" "content_$i" New-variable "T$i" "content_$i" New-variable "FN$i" "content_$i" # 正确引用动态变量并构建PSObject $Data += New-Object psobject -Property ([ordered]@{ JR = "<tr><td>${"JR$i"}</td>" SN = "<tr><td>${"SN$i"}</td>" T = "<tr><td>${"T$i"}</td>" FN = "<tr><td>${"FN$i"}</td>" }) # 正确递增计数器 $i++ }
2. 更优的替代方案:避免使用动态变量
动态变量会让代码可读性和维护性下降,更推荐直接在循环中构建PSObject,无需额外创建动态变量:
$Data = @() $i = 1 Foreach ($S in $SB) { $currentContent = "content_$i" # 直接创建PSCustomObject并添加到数组 $Data += [PSCustomObject][ordered]@{ JR = "<tr><td>$currentContent</td>" SN = "<tr><td>$currentContent</td>" T = "<tr><td>$currentContent</td>" FN = "<tr><td>$currentContent</td>" } $i++ }
这种方式逻辑更清晰,也避免了动态变量带来的潜在问题。
内容的提问来源于stack exchange,提问作者Dasheng
相关产品推荐
相关产品推荐

