2

我有一个奇怪的问题,有两个相同的代码:

第一个 :

$arraysch= @()
$hash = @{}

Add-Type -Path "C:\app\aasif\product\11.2.0\client_2\odp.net\managed\common\Oracle.ManagedDataAccess.dll"

$con = New-Object Oracle.ManagedDataAccess.Client.OracleConnection("User Id=sys;Password=password;Data Source=Myserver/oracle;DBA privilege=SYSDBA")
$con.Open()
$cmd=$con.CreateCommand()
$cmd.CommandText="select distinct owner from all_tables where table_name = 'Mytable'"
$rdr=$cmd.ExecuteReader()

while ($rdr.Read()) {
  $arraysch += $rdr.GetString(0)
}

$hash["Myserver"] = [array]$arraysch

$con.close()

第二个,谁在起作用,但它是一样的:

$arraysch= @()
$hash = @{}

Add-Type -Path "C:\app\aasif\product\11.2.0\client_2\odp.net\managed\common\Oracle.ManagedDataAccess.dll"

function GetOracleDb {
param([string]$servername)
$con = New-Object Oracle.ManagedDataAccess.Client.OracleConnection("User Id=sys;Password=password;Data Source=$servername/oracle;DBA privilege=SYSDBA")
$con.Open()
$cmd=$con.CreateCommand()
$cmd.CommandText="select distinct owner from all_tables where table_name = 'Mytable'"
$rdr=$cmd.ExecuteReader()
while ($rdr.Read()) {
  $arraysch += $rdr.GetString(0)
}
$hash[$servername] = [array]$arraysch
$con.close()
}

GetOracleDb "Myserver"

第一个代码在我的 $hash 中给了我这个结果

我的服务器 {TEST1、TEST2、TEST3、TEST4...}

第二个给我这个

我的服务器 {TEST1TEST2TEST3TEST4TEST5TEST6}

为什么当我将代码放入函数时,$hash 值中没有逗号?

4

1 回答 1

3

这是 powershell 2.0 和 3.0 之间的区别。我使用以下代码重现您的麻烦。

$arraysch= @()
$hash = @{}
function test {
param([string]$servername)

$arraysch += "A"
$arraysch += "B"

$hash[$servername] = [array]$arraysch
}

test "coucou"
$hash

它适用于 PowerShell 2.0 而不是 PowerShell 3.0。出于某种原因,在 PowerShell 3.0 中,函数$arraysch不被视为一个集合,而是一个集合,string所以$arraysch += $rdr.GetString(0)只是连接字符串。只是写$arraysch= @()在函数内部解决了问题,但我不明白其中的区别。

在 PowerShell 3.0 中,它适用于:

$hash = @{}
function test {
param([string]$servername)

$arraysch= @()
$arraysch += "A"
$arraysch += "B"

$hash[$servername] = [array]$arraysch
}

test "coucou"
$hash

或者 :

$arraysch= @()
$hash = @{}
function test {
param([string]$servername)

$global:arraysch += "A"
$global:arraysch += "B"

$hash[$servername] = [array]$arraysch
}

test "coucou"
$hash
于 2013-05-29T04:04:48.887 回答