如何使用PowerShell提升开发效率(以Windows Embedded CE为例)
簡介
本文講述如何使用Powershell通過RAPI來控制Windows Embedded CE和Windows Mobile設(shè)備。
?
緣由
我入行的時候是做AS400 RPG和UNIX C開發(fā)的,所有開發(fā)環(huán)境都是字符界面,因此習(xí)慣了vi+grep+make的開發(fā)模式。后來開始做Windows的開發(fā),開始也不大習(xí)慣,安裝了cygwin來使用,離不開命令行。其實合理使用命令行能大大簡化日常工作,我記得好像有本書叫做高效程序員,里面提到要合理使用命令行來簡化日常工作。我十分贊同這一說法,下面通過一個例子講述如何簡化工作。
AS/400的界面
?
UNIX的界面
?
??
Cygwin的界面
?
現(xiàn)在在從事Windows Embedded CE 6 R3的應(yīng)用程序開發(fā),由于某些原因,使用的設(shè)備沒有備份電池。因此每次重新啟動設(shè)備的時候,設(shè)備的時間會恢復(fù)到初始狀態(tài)。每次啟動系統(tǒng)后,我都需要手工修改設(shè)備的系統(tǒng)時間,至少需要20次的鼠標(biāo)點(diǎn)擊操作才能完成時間的設(shè)置。這是一件非常煩人的事情。作為程序員,應(yīng)該盡量把大量的重復(fù)操作交給計算機(jī)來做,因此我考慮使用腳本來完成時間的設(shè)置。然后我考慮使用微軟提供PowerShell來完成這一次任務(wù)。
?
為什么使用PowerShell
因為PowerShell可以和.NET Framework很好的結(jié)合在一起,可以整合現(xiàn)有的.NET的資源。開始我考慮使用CMD的批處理文件。我也曾經(jīng)使用過批處理文件來簡化編譯過程,這個自動編譯腳本還在使用,但是做過CMD批處理文件的人和做過UNIX Shell開發(fā)的人就會知道,CMD的批處理文件非常難使用,和任何一個shell比(SH, KSH, CSH, and BASH)都輸一大截。因此我放棄了使用CMD的想法,選擇了PowerShell。
?
安裝和配置PowerShell
使用PowerShell需要下載和安裝,請到?Download Windows PowerShell 1.0? 下載并安裝。需要.NET Framework 2.0的支持。
安裝完畢后需要修改Execution Policy,這是對執(zhí)行腳本的安全設(shè)置。因為PowerShell的默認(rèn)Execution Policy是Restricted,Restricted表示只能執(zhí)行單條命令,不能執(zhí)行批量腳本。如果執(zhí)行批量腳本會提示下面的錯誤。?
is system. Please see "get-help about_signing" for more details.
At line:1 char:18
+ ./DatetimeSync.ps1 <<<<
因此需要通過Set-ExecutionPolicy RemoteSigned命令來修改Execution Policy。修改后就能執(zhí)行批量腳本了。
?
?
使用OpenNETCF Desktop Communication
由于PowerShell不支持直接操作Windows Embedded CE和Windows Mobile設(shè)備,因此需要借助RAPI來完成。如果使用.NET來開發(fā)RAPI,我們可以使用OpenNETCF Desktop Communication.關(guān)于OpenNETCF Desktop Communication和RAPI,我之前寫過一篇文章,可以參考
Windows Embedded CE和Windows Mobile下ActiveSync開發(fā).
先到OpenNETCF Desktop Communication Library下載,然后編譯生成OpenNETCF.Desktop.Communication.dll。下面提供的源碼已經(jīng)包含了該DLL,所以這一步可以省略。
?
PowerShell開發(fā)
先新建一個文本文件,把文件擴(kuò)展名改成ps1。例如我的文件叫做DatetimeSync.ps1 。然后就可以編寫腳本了。
注意,Windows不會自動把ps1的文件與PowerShell進(jìn)行綁定,每次執(zhí)行ps1文件需要打開PowerShell,然后使用點(diǎn)號(.)執(zhí)行,這與UNIX shell的風(fēng)格一致。?
例如下圖所示:
只是輸入DatetimeSync.ps1不能執(zhí)行該文件,需要輸入 ./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),是代表一個單獨(dú)功能的命令。例如Get-Location表示取出當(dāng)前路徑,get-date表示取出當(dāng)前日期與時間。如果需要使用.NET的assembly,需要使用LoadFrom來反射加載。例子中把OpenNETCF.Desktop.Communication.dll加載進(jìn)來。 New-Object表示實例化對象,在例子中實例化OpenNETCF.Desktop.Communication.RAPI的對象rapi。有了rapi對象就可以調(diào)用RAPI的類的方法來操控Windows Mobile 和 Windows Embedded CE的設(shè)備了。在例子中首先調(diào)用Connect()方法來連接設(shè)備,然后使用CreateProcess()函數(shù)來調(diào)用cmd修改時間和日期。本來可以通過調(diào)用API?SetSystemTime來修改系統(tǒng)時間,但是如果這樣做,需要使用C++開發(fā)一個設(shè)備上的DLL,然后部署到設(shè)備上,為了簡化工作,我直接使用了cmd自帶的time和date功能來完成時間的修改。
?
目前為止,這個功能已經(jīng)實現(xiàn)了。使用PowerShell可以完成很多很多其他功能來簡化我們的工作,例如管理設(shè)備上的進(jìn)程,部署程序,啟動單元測試等等。請問您在開發(fā)中有使用工具來簡化工作嗎?如果有,歡迎討論。
?
如果您覺得文章不錯,請點(diǎn)擊支持,如果您覺得文章不好,請點(diǎn)擊反對,可以的話,請留言指正,您的反饋是我進(jìn)步的動力,謝謝。
參考
“How to” Series: Automating Windows Mobile with Windows PowerShell
?
源代碼:??/Files/procoder/DatetimeSync.zip
? ? 本文轉(zhuǎn)自Jake Lin博客園博客,原文鏈接:http://www.cnblogs.com/procoder/archive/2010/07/15/How-to-use-PowerShell-on-Windows-Embedded-CE.html,如需轉(zhuǎn)載請自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的如何使用PowerShell提升开发效率(以Windows Embedded CE为例)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Matlab产生m序列(PN序列的一
- 下一篇: Windows7旗舰版磁盘分区详解—附分