我创建了一个动态变量,如下所示:
$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条答案
按热度按时间1tu0hz3e1#
当前代码无法运行的原因
1.增量运算符使用不当
$i = $i++
-这不是你想的那样。您可能需要$i++
或$i += 1
。你的代码实际上在做什么是复杂的。增量运算符文档说:
运算符的后缀版本在语句中使用变量的值后递增变量**。
换句话说,你的代码
$i = $i++
是这样做的:$i
(= 1)$i
($i
现在等于2)$i
$i
现在再次等于1!你可以自己试试:
您可以通过使用以下选项之一而不是
$i = $i++
来解决此问题:$i++;
$i += 1;
$i = $i + 1;
2.插值问题
在
New-Variable
行中,Powershell正在进行字符串插值以创建一个名为JR$i
->JR1
的变量,但在第二个示例中,<td>$JR$i</td>
扩展了两个不同的变量-$JR
->$null
(因为$JR
未定义)和$i
->1
,而不是您可能期望的$JR1
->content
。你也可以测试一下:
如果在收到错误时启用严格模式,则会更清楚:
你想要的是
"<td>$JR1</td>"
,但是看起来你需要动态地生成变量名,因为你正在循环$i
的多个值,所以你将被困在这样做:如何修复
1.正确增量
这很简单-只需使用
$i++
或$i += 1
即可2.使用哈希表
更多背景信息,请参阅评论中提到的@iRon的general best-practice advice-我将在下面将其应用于您的特定案例。
而不是创建大量的“动态变量”,只需将值打包到一个哈希表中,使用名称作为键-稍后检索值会更容易...
注意-严格来说,我使用的是OrderedDictionary而不是哈希表,这样键就可以按照它们被添加的顺序显示,但除此之外它们基本上是一样的。
然后使用hashtable / ordereddictionary:
但是,如果你只是想生成pscustomobjects,那么从源数据中更干净的方法可能是这样,完全绕过整个“动态变量”和临时哈希表/ OrderdDictionary: