2

我需要运行以下 2 行代码来打开 access 数据库。问题是这个数据库有一个自动加载的模型表单,它会阻止 powershell 脚本的其余部分运行,直到它关闭。

$ms_access = New-Object -ComObject "Access.Application"
$ms_access.OpenCurrentDatabase("C:\db.accdb", $false)

如果按下 shift 键,我可以在打开数据库时避免对话框。我已经对此进行了测试,并且可以正常工作。现在我希望在运行我的 powershell 脚本时不必按住 shift 键,那么 powershell 中有没有办法模拟按下的 shift 键?不仅仅是一个 SendKey,而是在OpenCurrentDatabase?

就像是?

$ms_access = New-Object -ComObject "Access.Application"
Set-Shift-Down
$ms_access.OpenCurrentDatabase("C:\db.accdb", $false)
Set-Shift-Up

这是针对 Powershell-v2

4

1 回答 1

3

我会使用p/invoke

Add-Type @"
using System;                                                                     
using System.Runtime.InteropServices;
public class Tricks {
[DllImport("user32.dll")]                                                            
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);}
"@   

[system.reflection.assembly]::Loadwithpartialname("system.windows.forms")

#left shift key pressed
[tricks]::keybd_event([System.Windows.Forms.Keys]::LShiftKey, 0x45, 0, 0);
... do stuff here
#left shift key released
[tricks]::keybd_event([System.Windows.Forms.Keys]::LShiftKey, 0x45, 0x2, 0);    

如果您不希望加载windows.forms程序集0xA0用作值LShiftKey

我真的不知道原生 powershell 方式,p/invoke 应该可以工作,但我无法像你想使用它那样测试它。

于 2013-05-08T19:04:52.020 回答