簡介
本文講述如何使用Powershell通過RAPI來控制Windows Embedded CE和Windows Mobile設備。
?
緣由
我入行的時候是做AS400 RPG和UNIX C開發的,所有開發環境都是字符界面,因此習慣了vi+grep+make的開發模式。后來開始做Windows的開發,開始也不大習慣,安裝了cygwin來使用,離不開命令行。其實合理使用命令行能大大簡化日常工作,我記得好像有本書叫做高效程序員,里面提到要合理使用命令行來簡化日常工作。我十分贊同這一說法,下面通過一個例子講述如何簡化工作。
AS/400的界面
?
UNIX的界面
?
??
Cygwin的界面
?
現在在從事Windows Embedded CE 6 R3的應用程序開發,由于某些原因,使用的設備沒有備份電池。因此每次重新啟動設備的時候,設備的時間會恢復到初始狀態。每次啟動系統后,我都需要手工修改設備的系統時間,至少需要20次的鼠標點擊操作才能完成時間的設置。這是一件非常煩人的事情。作為程序員,應該盡量把大量的重復操作交給計算機來做,因此我考慮使用腳本來完成時間的設置。然后我考慮使用微軟提供PowerShell來完成這一次任務。
?
為什么使用PowerShell
因為PowerShell可以和.NET Framework很好的結合在一起,可以整合現有的.NET的資源。開始我考慮使用CMD的批處理文件。我也曾經使用過批處理文件來簡化編譯過程,這個自動編譯腳本還在使用,但是做過CMD批處理文件的人和做過UNIX Shell開發的人就會知道,CMD的批處理文件非常難使用,和任何一個shell比(SH, KSH, CSH, and BASH)都輸一大截。因此我放棄了使用CMD的想法,選擇了PowerShell。
?
安裝和配置PowerShell
使用PowerShell需要下載和安裝,請到?Download Windows PowerShell 1.0? 下載并安裝。需要.NET Framework 2.0的支持。
安裝完畢后需要修改Execution Policy,這是對執行腳本的安全設置。因為PowerShell的默認Execution Policy是Restricted,Restricted表示只能執行單條命令,不能執行批量腳本。如果執行批量腳本會提示下面的錯誤。?
File C:\Temp\projects\DatetimeSync\DatetimeSync.ps1 cannot be loaded because the execution of scripts is disabled on th
is system. Please see "get-help about_signing" for more details.
At line:1 char:18
+ ./DatetimeSync.ps1 <<<<
因此需要通過Set-ExecutionPolicy RemoteSigned命令來修改Execution Policy。修改后就能執行批量腳本了。
?
?
使用OpenNETCF Desktop Communication
由于PowerShell不支持直接操作Windows Embedded CE和Windows Mobile設備,因此需要借助RAPI來完成。如果使用.NET來開發RAPI,我們可以使用OpenNETCF Desktop Communication.關于OpenNETCF Desktop Communication和RAPI,我之前寫過一篇文章,可以參考
Windows Embedded CE和Windows Mobile下ActiveSync開發.
先到OpenNETCF Desktop Communication Library下載,然后編譯生成OpenNETCF.Desktop.Communication.dll。下面提供的源碼已經包含了該DLL,所以這一步可以省略。
?
PowerShell開發
先新建一個文本文件,把文件擴展名改成ps1。例如我的文件叫做DatetimeSync.ps1 。然后就可以編寫腳本了。
注意,Windows不會自動把ps1的文件與PowerShell進行綁定,每次執行ps1文件需要打開PowerShell,然后使用點號(.)執行,這與UNIX shell的風格一致。?
例如下圖所示:
只是輸入DatetimeSync.ps1不能執行該文件,需要輸入 ./DatetimeSync.ps1。
?
源碼
$dllPath = Get-Location
$dllPath = $dllPath.Path + "\OpenNETCF.Desktop.Communication.dll"
[System.Reflection.Assembly]::LoadFrom($dllPath) |Out-null
$rapi = New-Object OpenNETCF.Desktop.Communication.RAPI
echo "Connecting to device..."
$rapi.Connect()
if ($rapi.Connected)
{
$dt = get-date
$date = $dt.Month.ToString() + "-" + $dt.Day.ToString() + "-" + $dt.Year.ToString()
echo "Setting date [$date]..."
$rapi.CreateProcess("cmd", "/c date " + $date)
$time = $dt.Hour.ToString() + ":" + $dt.Minute.ToString() + ":" + $dt.Second.ToString()
echo "Setting time [$time]..."
$rapi.CreateProcess("cmd", "/c time " + $time)
echo "Finished"
}
else
{
echo "Cannot connect to the device, please check the physical connection."
}
Get-Location和get-date叫做cmdlet(讀作command-let),是代表一個單獨功能的命令。例如Get-Location表示取出當前路徑,get-date表示取出當前日期與時間。如果需要使用.NET的assembly,需要使用LoadFrom來反射加載。例子中把OpenNETCF.Desktop.Communication.dll加載進來。 New-Object表示實例化對象,在例子中實例化OpenNETCF.Desktop.Communication.RAPI的對象rapi。有了rapi對象就可以調用RAPI的類的方法來操控Windows Mobile 和 Windows Embedded CE的設備了。在例子中首先調用Connect()方法來連接設備,然后使用CreateProcess()函數來調用cmd修改時間和日期。本來可以通過調用API?SetSystemTime來修改系統時間,但是如果這樣做,需要使用C++開發一個設備上的DLL,然后部署到設備上,為了簡化工作,我直接使用了cmd自帶的time和date功能來完成時間的修改。
?
目前為止,這個功能已經實現了。使用PowerShell可以完成很多很多其他功能來簡化我們的工作,例如管理設備上的進程,部署程序,啟動單元測試等等。請問您在開發中有使用工具來簡化工作嗎?如果有,歡迎討論。
?
如果您覺得文章不錯,請點擊支持,如果您覺得文章不好,請點擊反對,可以的話,請留言指正,您的反饋是我進步的動力,謝謝。
參考
“How to” Series: Automating Windows Mobile with Windows PowerShell
?
源代碼:??/Files/procoder/DatetimeSync.zip
? ? 本文轉自Jake Lin博客園博客,原文鏈接:http://www.cnblogs.com/procoder/archive/2010/07/15/How-to-use-PowerShell-on-Windows-Embedded-CE.html,如需轉載請自行聯系原作者