Powershell 全局变量,其中变量有成员

Powershell 全局变量,其中变量有成员,powershell,global-variables,Powershell,Global Variables,我想在PowerShell函数中打开Microsoft Access DB。我将在主代码中存储连接变量 代码如下: Function open_database($dbname) { # Open the database try { $global:conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$dbname;Persist Security Info=False" $g

我想在PowerShell函数中打开Microsoft Access DB。我将在主代码中存储连接变量

代码如下:

Function open_database($dbname) {
  # Open the database
  try
  {
    $global:conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=$dbname;Persist Security Info=False"
    $global:conn.Open()
  }
  catch
  {
    write-host "Error connecting to the database " + $dbname
    return $false
  }
  return $true
}

# M A I N
$conn = New-Object System.Data.OleDb.OleDbConnection
if (-Not (open_database("C:\temp\mydb.mdb"))) {exit}
我收到以下错误消息:

连接到数据库+C:\temp\mydb.mdb时出错
在此对象上找不到属性“ConnectionString”。验证该属性是否存在并可以设置

我该如何解决这个问题


我认为PowerShell正在将
global
conn
关联,而不是将
conn.ConnectionString
关联到global,我目前没有可用的访问权限,但在嵌套上下文中修改全局变量无论如何都是一个有缺陷的概念。最好在函数中创建连接,并让它返回连接对象或引发异常:

function open_database($dbname) {
  $cn = New-Object System.Data.OleDb.OleDbConnection
  $cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" +
                         "Data Source=$dbname;" +
                         "Persist Security Info=False"
  $cn.Open() | Out-Null
  return $cn
}

try {
  $conn = open_database 'C:\temp\mydb.mdb'
} catch {
  Write-Host "Error connecting to the database $dbname"
  exit 1
}

这样,您就不会混合上下文,并且只进行一次错误处理。

我目前没有可用的访问权限,但是在嵌套上下文中修改全局变量无论如何都是一个有缺陷的概念。最好在函数中创建连接,并让它返回连接对象或引发异常:

function open_database($dbname) {
  $cn = New-Object System.Data.OleDb.OleDbConnection
  $cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" +
                         "Data Source=$dbname;" +
                         "Persist Security Info=False"
  $cn.Open() | Out-Null
  return $cn
}

try {
  $conn = open_database 'C:\temp\mydb.mdb'
} catch {
  Write-Host "Error connecting to the database $dbname"
  exit 1
}

这样,您就不会混合上下文,并且只进行一次错误处理。

但是您问题中的代码没有给出错误?我手边没有access数据库,但它不会出错,运行起来毫无怨言。如果我能把测试代码放在注释中-
函数测试{$global:c.x=4}$c=@{x=2}$C试验$c
访问全局属性确实有效。出于调试目的,我会尝试省略所有的
try\u Catch
结构。使用
Try
块的裸露内部,然后
return$false
查看可能错误的完整说明。
$global:conn
是否按预期定义<代码>$conn=…在脚本范围中定义了
#main
。OLEDB提供程序是否已注册…但是你问题中的代码没有给出那个错误?我手边没有access数据库,但它不会出错,运行起来毫无怨言。如果我能把测试代码放在注释中-
函数测试{$global:c.x=4}$c=@{x=2}$C试验$c
访问全局属性确实有效。出于调试目的,我会尝试省略所有的
try\u Catch
结构。使用
Try
块的裸露内部,然后
return$false
查看可能错误的完整说明。
$global:conn
是否按预期定义<代码>$conn=…在脚本范围中定义了
#main
。OLEDB提供程序是否已注册…