2015-05-24 129 views
1

我試圖編寫一個代碼,可以快速鎖定密鑰的LED(使用-comObject發送密鑰)。 Powershell(來自CMD)的代碼運行速度非常慢,並且錯過了一些按鍵,但似乎在Powershell_ise上效果很好。Powershell代碼在PowerShell_ise上運行良好,但在PowerShell中破解

該代碼將文件讀取爲二進制文件,然後將每個位傳輸到num/scroll lock。這需要運行得非常快 - 儘可能快。

這是代碼:

$wsh = New-Object -ComObject "WScript.Shell" 
$bytes = [Byte[]] (Get-Content $env:temp\temp1536.txt -Encoding Byte -ReadCount 0) | ForEach-Object {[System.Convert]::ToString($_,2)} 
##($i=0; $i -le $byte.length; $i++){ 

foreach ($byte in $bytes) { 
#$byte; 
    while($byte.length -ne 1){ 
    if($byte[1] -eq '1'){ 
     #echo "1"; 
     $wsh.SendKeys('{SCROLLLOCK}'); 
     [System.Threading.Thread]::Sleep(40); 
     $wsh.SendKeys('{SCROLLLOCK}'); 
    } Else { 
     #echo "0"; 
     $wsh.SendKeys('{NUMLOCK}'); 
     [System.Threading.Thread]::Sleep(40); 
     $wsh.SendKeys('{NUMLOCK}'); 
    } 
    $byte=$byte.Substring(1); 
    [System.Threading.Thread]::Sleep(50); 


    } 
    #echo " "; 
    #echo "1"; 

    $wsh.SendKeys('{CAPSLOCK}'); 
    [System.Threading.Thread]::Sleep(55); 

    $wsh.SendKeys('{CAPSLOCK}'); 
    [System.Threading.Thread]::Sleep(20); 

} 

任何人都知道爲什麼出現這種情況?

編輯: 我添加了一個視頻,顯示在Powershell Console Vs.上閃爍的鎖定鍵的延遲。 Powershell_ISE http://youtu.be/OnOmr50OBhs

I/Windows 7上

試過這對PowerShell的V3.0 4.0我用這個文本文件名-'temp1536.txt」在%temp%文件夾 的文件導入到二進制文件,然後相應地點亮領導。

$bytes = [Byte[]] (Get-Content $env:temp\temp1536.txt -Encoding Byte -ReadCount 0) | ForEach-Object {[System.Convert]::ToString($_,2)} 

回答

0

這似乎是一些個人電腦的問題。 真的不明白爲什麼。但是我在一些電腦上正常工作。

0

我不能讓你的代碼工作(它從來沒有踏進if($byte[1] -eq '1')),但這裏是用keybd_event \ GetKeyState的Win32 API的作品在我的ISE和控制檯精緻的版本。摘自代碼here

$Keyboard = @' 
using System.Runtime.InteropServices; 

namespace My 
{ 
    public class Keyboard 
    { 
     private const byte VK_SCROLL = 0x91; 
     private const byte VK_NUMLOCK = 0x90; 
     private const byte VK_CAPITAL = 0x14; 
     private const uint KEYEVENTF_KEYUP = 0x2; 

     [DllImport("user32.dll", EntryPoint = "keybd_event", SetLastError = true)] 
     static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo); 

     [DllImport("user32.dll", EntryPoint = "GetKeyState", SetLastError = true)] 
     static extern short GetKeyState(uint nVirtKey); 

     // SCROLLLOCK 
     public static void SetScrollLockKey(bool newState) 
     { 
      bool scrollLockSet = GetKeyState(VK_SCROLL) != 0; 
      if (scrollLockSet != newState) 
      { 
       keybd_event(VK_SCROLL, 0, 0, 0); 
       keybd_event(VK_SCROLL, 0, KEYEVENTF_KEYUP, 0); 
      } 
     } 
     public static bool GetScrollLockState() 
     { 
      return GetKeyState(VK_SCROLL) != 0; 
     } 

     // NUMLOCK 
     public static void SetNumLockKey(bool newState) 
     { 
      bool scrollLockSet = GetKeyState(VK_NUMLOCK) != 0; 
      if (scrollLockSet != newState) 
      { 
       keybd_event(VK_NUMLOCK, 0, 0, 0); 
       keybd_event(VK_NUMLOCK, 0, KEYEVENTF_KEYUP, 0); 
      } 
     } 

     public static bool GetNumLockState() 
     { 
      return GetKeyState(VK_NUMLOCK) != 0; 
     } 

     // CAPSLOCK 
     public static void SetCapsLockKey(bool newState) 
     { 
      bool scrollLockSet = GetKeyState(VK_NUMLOCK) != 0; 
      if (scrollLockSet != newState) 
      { 
       keybd_event(VK_CAPITAL, 0, 0, 0); 
       keybd_event(VK_CAPITAL, 0, KEYEVENTF_KEYUP, 0); 
      } 
     } 

     public static bool GetCapsLockState() 
     { 
      return GetKeyState(VK_CAPITAL) != 0; 
     } 
    } 
} 
'@ 

Add-Type -TypeDefinition $Keyboard -ErrorAction Stop 

$Bytes = Get-Content -Path '.\led.txt' -Encoding Byte 

foreach ($byte in $Bytes) { 
    if($byte) 
    { 
     [My.Keyboard]::SetScrollLockKey($true) 
     [System.Threading.Thread]::Sleep(40) 
     [My.Keyboard]::SetScrollLockKey($false) 
    } 
    else 
    { 
     [My.Keyboard]::SetNumLockKey($true) 
     [System.Threading.Thread]::Sleep(40) 
     [My.Keyboard]::SetNumLockKey($false) 
    } 

    [My.Keyboard]::SetCapsLockKey($true) 
    [System.Threading.Thread]::Sleep(55) 

    [My.Keyboard]::SetNumLockKey($false) 
    [System.Threading.Thread]::Sleep(20) 
} 
+0

謝謝。 你能在控制檯和ISE中看到不同的性能嗎?當我在控制檯上運行它時,它的運行速度非常慢......我可以看到LED慢速閃爍,並且在運行「測量命令」時也顯示爲 – oriez

+0

@oriez您的意思是我的代碼在控制檯中運行緩慢?只需使用'Measure-Command'在另一臺PC上檢查它,仍然沒有問題:它的運行速度與ISE一樣快。檢查這個問題,也許它與代碼本身沒有任何關係:[KB3057134中描述的更新似乎使PowerShell開始緩慢](http://serverfault.com/questions/691873/it-seems-like -updates-in-the-kb3057134-make-powershell-to-start-slow) – beatcracker

+0

@oriez Btw,你使用的是什麼版本的PowerShell?這可以實現STA \ MTA模式:[PowerShell控制檯和PowerShell ISE之間的區別](http://stackoverflow.com/questions/20022976/difference-between-powershell-console-and-powershell-ise)。嘗試使用'-sta'和'-mta'開關運行PS控制檯,看看它是否有幫助。 – beatcracker

相關問題