2016-06-27 33 views
1

嘗試使用the Add-Type approach讀取從PowerShell腳本當前的Windows控制檯模式時,我收到錯誤:如何從Powershell調用GetStdHandle,GetConsoleMode?

$MethodDefinitions = @' 
[DllImport("kernel32.dll", SetLastError = true)] 
static extern IntPtr GetStdHandle(int nStdHandle); 
[DllImport("kernel32.dll", SetLastError = true)] 
static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode); 
'@ 
$Kernel32 = Add-Type -MemberDefinition $MethodDefinitions -Name 'Kernel32' -Namespace 'Win32' -PassThru 
$hConsoleHandle = $Kernel32::GetStdHandle(-11) # STD_OUTPUT_HANDLE 
$lpMode = 0 
$Kernel32::GetConsoleMode($hConsoleHandle, $lpMode) 

,但我得到以下警告和錯誤:

WARNING: The generated type defines no public methods or properties. 
Method invocation failed because [Win32.Kernel32] does not contain a method named 'GetStdHandle'. 
At C:\Users\John\get_console_mode.ps1:8 char:1 
+ $hConsoleHandle = $Kernel32::GetStdHandle(-11) # STD_OUTPUT_HANDLE 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (:) [], RuntimeException 
    + FullyQualifiedErrorId : MethodNotFound 

Method invocation failed because [Win32.Kernel32] does not contain a method named 'GetConsoleMode'. 
At C:\Users\John\get_console_mode.ps1:10 char:1 
+ $Kernel32::GetConsoleMode($hConsoleHandle, $lpMode) 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (:) [], RuntimeException 
    + FullyQualifiedErrorId : MethodNotFound 

任何想法,我做錯了嗎?

UPDATE:按照接受的答案,這裏是更正後的代碼:

$MethodDefinitions = @' 
[DllImport("kernel32.dll", SetLastError = true)] 
public static extern IntPtr GetStdHandle(int nStdHandle); 
[DllImport("kernel32.dll", SetLastError = true)] 
public static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode); 
'@ 
$Kernel32 = Add-Type -MemberDefinition $MethodDefinitions -Name 'Kernel32' -Namespace 'Win32' -PassThru 
$hConsoleHandle = $Kernel32::GetStdHandle(-11) # STD_OUTPUT_HANDLE 
$mode = 0 
$Kernel32::GetConsoleMode($hConsoleHandle, [ref]$mode) 

回答

1

用下面的方法定義試試吧(我剛添加的公共訪問修飾符)

$MethodDefinitions = @' 
[DllImport("kernel32.dll", SetLastError = true)] 
public static extern IntPtr GetStdHandle(int nStdHandle); 
[DllImport("kernel32.dll", SetLastError = true)] 
public static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode); 
'@ 
+0

謝謝,成功了!調用'$ Kernel32 :: GetConsoleMode'時,我還需要在第二個參數前加上[[ref]' – jwfearn