我有一个奇怪的问题,有两个相同的代码:
第一个:
$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
中给出了这个结果Myserver {TEST1,TEST2,TEST3,TEST4 ...}
第二个给我这个
Myserver {TEST1TEST2TEST3TEST4TEST5TEST6}
为什么当我将代码放入函数中时,我的$ hash值中没有逗号?
答案 0 :(得分:3)
这是powershell 2.0 ans 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