我正在尝试使用invoke(ii)命令打开具有命令行选项的访问数据库。我想要执行的是下面的内容(是的,访问数据库的名称中有一个空格)。该数据库与Powershell脚本位于同一文件夹中。
我想要的是什么:program name.accdb /cmd Rester
我得到了什么:program name.accdb \cmd Rester
我使用的确切命令是:
$Path_To_EXE = "program name.accdb /cmd Rester"
&ii $Path_To_EXE
我是Powershell的新手并做了一些搜索,但似乎无法找到答案。我可以通过创建一个单独的.bat文件来创建一个解决方案,但这似乎是倒退。
思想?
答案 0 :(得分:1)
如果要在向PowerShell传递参数时运行VBA脚本:
$aApp = New-Object -ComObject access.application
$aApp.Application.OpenCurrentDatabase("some program.accdb")
$aApp.Application.Run("VBAScriptName", [ref] "Raster")
首先根据Microsoft Support你可以使用;;从命令行获取/ cmd。其次,由于调用引号和反引号变量的方式,你必须包含与变量分开的/ cmd标志(好吧,这是最简单的方法)。第三,您可以考虑创建一个新的com-object来处理使用Powershell运行Access,因为它允许更多选项(只是询问并且我可以添加一些这样的示例)。这就是说:
$Path_To_EXE = "program name.accdb"
&ii $Path_To_EXE ;;Rester #Try ;;"Rester" if it doesn't work.
#if that works then its a problem in Rester
#fyi another way is:
$Path_To_EXE = @("program name.accdb", ";;Rester")
&ii $Path_To_EXE
如果您想使用ActiveX对象控制器打开并对Access执行操作,请查看this blog from technet< - 阅读链接时需要避免陷阱。
$adOpenStatic = 3
$adLockOptimistic = 3
$objConnection = New-Object -com "ADODB.Connection"
$objRecordSet = New-Object -com "ADODB.Recordset"
$objConnection.Open("Provider = Microsoft.Jet.OLEDB.4.0; Data Source = C:\Scripts\Test.mdb")
$objRecordset.Open("Select * From Computers", $objConnection,$adOpenStatic,$adLockOptimistic)
$objRecordSet.AddNew()
$objRecordSet.Fields.Item("ComputerName").Value = "atl-ws-001"
$objRecordSet.Fields.Item("SerialNumber").Value = "192ATG43R"
$objRecordSet.Update()
$objRecordSet.Close()
$objConnection.Close()
答案 1 :(得分:1)
您还应该尝试启动进程cmdlet:
$Path_To_EXE = "c:\program.exe"
#Notice the simple quotes ...
$Arguments = @( "name.accdb", '/cmd' , "Rester" )
start-process -FilePath $Path_To_EXE -ArgumentList $Arguments -Wait
我不太确定答案的格式你会变得很难... 对于数据库交互,我宁愿使用JGreenwell的方法,因为你得到的答案将更容易阅读/调试... 如果有效,请告诉我。