gpt4 book ai didi

arrays - Powershell 范围 : variable array within loop not populating when adding to second array

转载 作者:行者123 更新时间:2023-12-02 08:32:21 24 4
gpt4 key购买 nike

在下面的 Powershell 示例中,如何让 $server 填充到第 5 行中?我试图将 Get-EventLog 查询的结果保存到每个 $server 循环迭代的数组中。

例子:

$serversArray = @("one", "two", "three")
ForEach ($server in $serversArray) {
echo $server "Variable array iteration populates here correctly"
$eventArray = @()
$eventArray += Get-EventLog -computerName $server #But not here, where I need it
$eventArray #Yet it populates from calling the second array correctly
}
  1. 我试过将 $server 变量的范围分配给全局或脚本。
  2. 我已经研究过其他类似的问题,但我找不到有这种情况的
  3. 我尝试了管道、引号、反引号等的不同组合。

一如既往,提前致谢。

编辑 好的,ISE 正在缓存一些变量(或一些奇怪的东西),因为上面的示例在我重新启动 ISE 后开始工作。无论如何,问题出在 $servers 数组输入上,在完整脚本中它来自 MySQL 查询。如果我静态地为数组分配服务器名称(如上例所示),脚本就可以工作。如果我使用来自 MySQL 查询的输入,Get-EventLog 会失败并显示 The network path was not found。因此,即使服务器值看起来正确(并且 某些东西 可能正在扩展),也可能是文本编码问题等。很抱歉浪费时间,但讨论它有助于缩小范围。这是实际脚本的相关部分:

#Open SQL Connection
[System.Reflection.Assembly]::LoadWithPartialName("MySql.Data")
$connectionString = "server=dbserver;uid=odbc;pwd=password;database=uptime;"
$connection = New-Object MySql.Data.MySqlClient.MySqlConnection
$connection.ConnectionString = $connectionString
$connection.Open()
#Get server names from db
$sqlGetServers = "select server_nm from servers limit 3;"
$command = New-Object MySql.Data.MySqlClient.MySqlCommand($sqlGetServers, $connection)
$dataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter($command)
$dataSet = New-Object System.Data.DataSet
$recordCount = $dataAdapter.Fill($dataSet, "sample_data")
$server_names = @()
$server_names += $dataSet.Tables["sample_data"]
#$server_names = @("server-1","server-2") <-- this works
#loop through array of server names
foreach($server in $server_names) {
$eventData = @()
$eventData += Get-EventLog -computerName $server -LogName System -Newest 10
foreach($event in $eventdata) {Do-Stuff}
}

最佳答案

我不能 100% 确定您遇到的问题是什么。我假设问题是您的 $eventArray 以最后一个结果结束。

如果这是正确的,那么原因是因为您在第 4 行的每次迭代中都将它重新初始化为空:$eventArray = @()

试试这个:

$serversArray = @("one", "two", "three")
$eventArray = @()
ForEach ($server in $serversArray) {
echo $server "Variable array iteration populates here correctly"
$eventArray += Get-EventLog -computerName $server #But not here, where I need it
$eventArray #Yet it populates from calling the second array correctly
}

或者,也可以像这样使用 ForEach-Object:

$serversArray = @("one", "two", "three")
$eventArray = $serversArray | ForEach-Object {
echo $_ "Variable array iteration populates here correctly"
Get-EventLog -computerName $_ #But not here, where I need it
#Yet it populates from calling the second array correctly
}

方法一说明:

在循环开始之前$eventArray 声明为一个空数组,然后在循环的每次迭代中向其中添加项目,而不是在每次迭代时都对其进行初始化。

按照您的方式,$eventArray 每次都会重置为一个空数组,最后它只会包含最后一个结果。

方法二说明:

ForEach-Object 是一个管道 cmdlet,返回其代码块的结果(对每个对象 运行一次。

在这种情况下,我们使用 $_ 来表示单个对象。我们没有将 Get-EventLog 的结果分配给 $eventArray,而是简单地调用它,允许从 block 中返回返回值。

我们将整个 ForEach-Object 调用分配给 $eventArray,这将以整个调用的结果集合结束。

关于arrays - Powershell 范围 : variable array within loop not populating when adding to second array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25345204/

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