我遇到了一个有点奇怪的Powershell习惯,想了解这是怎么发生的。
$CurrentADgroups = (Get-ADGroup -filter * -properties GroupCategory -server $ADSERVER).name
$Row = [int] 1
$CurrentADgroups | Foreach {$Sheet2.Cells.Item($Row,1) = $_; $Row++}
Foreach : Exception setting "Item": "Exception from HRESULT: 0x800AC472"
At C:\Script\SCRIPT-2.0.ps1:229 char:28
+ $CurrentADgroups | Foreach {$Sheet2.Cells.Item($Row,1) = $_; $Row++}
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [ForEach-Object], SetValueInvocationException
+ FullyQualifiedErrorId : CatchFromBaseAdapterParameterizedPropertySetValueTI,Microsoft.PowerShell.Commands.ForEachObjectCommand
这有效!:
$CurrentADgroups = (Get-ADGroup -filter * -properties GroupCategory -server $ADSERVER).name
$Row = [int] 1
$CurrentADgroups | Foreach {$Sheet2.Cells.Item($Row,1) = $_; $Row = $Row + [int]1}
这是时间问题吗?因为在我看来$ Row ++和$ Row = $ Row + [int] 1完全一样。他们一个接一个地向上计数。
提前致谢!
EDIT1:除了测试之间的$ Row之外我什么都没改变 - 尤其是AD和Excel表格。
答案 0 :(得分:1)
我测试了这段代码:
foreach ($n in (1..10)) {
write-host $var
write-host $var2
$var++
$var2 = $var2 + [int]1
write-host $var
write-host $var2
write-host ("-" * 40)
}
如果你运行它,你会发现行为完全没有区别。
你也可以使用$ var.GetType()来确定它们都是Int32
。
我不确定是否有更好的方法来测试这个......
我会选择同时适用的方法。好问题。
也许您可以分解代码并添加一些write-host
和$var.gettype()
来测试每个阶段的变量,以便在运行代码时可以看到是否存在任何差异特别是。