简介

本文讲述如何使用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"formore 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,如需转载请自行联系原作者

如何使用PowerShell提升开发效率(以Windows Embedded CE为例)相关推荐

  1. 深度解读Microsoft Build 2020:提升开发效率,优化开发环境

    Microsoft Build 2020 在众多新产品与技术发布中圆满落幕 但身为开发技术人深知 技术世界的更迭.求索却从未止步 唯有不断提升自身技能栈创新 方能从技术浮沉中获得更多养分 让技术予力世 ...

  2. order by 影响效率么_提升开发效率N倍的20+命令行神器

    图 by:石头@青海湖 关于作者:程序猿石头(ID: tangleithu),现任阿里巴巴技术专家,清华学渣,前大疆后端 Leader.以每篇文章都让人有收获为目的,欢迎关注,交流和指导! 背景 本文 ...

  3. 提升开发效率N倍的20+命令行神器!(附 demo)

    点击上方蓝色字体,关注我 -- 一个在阿里云打工的清华学渣! 图 by:石头@青海湖 关于作者:程序猿石头(ID: tangleithu),现任阿里巴巴技术专家,清华学渣,前大疆后端 Leader.以 ...

  4. Python学习笔记:Day13 提升开发效率

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  5. 提升开发效率的十个工具

    Git 之前也有过不少版本控制的工具.有好的,也有糟糕的.不过它们都或多或少地误入歧途了. 这时候Git出现了.一旦你用上了这个神奇的工具,很难相像你还会碰到比它更好的了. 还没用过Git?试一下吧. ...

  6. atitit.提升开发效率---mda 软件开发方式的革命

    atitit.提升开发效率---mda 软件开发方式的革命 1. 软件开发方式的革命开发工具的抽象层次将再次提升 1 2. 应用框架和其实现相分离 2 3. 目前的问题模型和代码不同步 2 4. MD ...

  7. atitit.提升开发效率---使用server控件生命周期 asp.net 11个阶段 java jsf 的6个阶段比較...

    atitit.提升开发效率---使用server控件生命周期  asp.net 11个阶段  java jsf 的6个阶段比較 例如以下列举了server控件生命周期所要经历的11个阶段. (1)初始 ...

  8. 猿创征文|后端开发工程师提升开发效率神器推荐

    简介 对于现在的后端工程师来说,并不仅仅局限于编写代码和解决bug,这两个要素了.如果你目前还只是忙碌的写代码和改bug的话,那要深度思考一下,我为什么日复一日的写这些重复代码?这样有何意义?或者说, ...

  9. Atitit外包优缺点 提升开发效率 外包模式 1.一般来说外包优点 1.1.更加方便快捷 时间成本降低了 1.2.会导致 经济成本高,,时间成本降低了, 2.缺点 2.1.成本高 2.2.

    Atitit外包优缺点  提升开发效率 外包模式 一般来说外包优点 更加方便快捷  时间成本降低了 会导致 经济成本高,,时间成本降低了, 缺点 成本高 缺少控制 但是少部分,比如理发,经济时间成本都 ...

最新文章

  1. 中南大学计算机专业男女比例,你知道吗?中南大学的男女比例居然是这样的
  2. 用户界面设计的技巧与技术 (作者Scott W.Ambler)
  3. 利用npm安装/删除/发布/更新/撤销发布包
  4. Binding在WPF中的使用
  5. TOP命令及参数解析
  6. 查漏补缺:2020年搞定SpringCloud面试(含答案和思维导图)
  7. vmware vsphere powercli 因为在此系统中禁止执行脚本
  8. 整合Swagger接口文档
  9. 就算给穷人一百万,他们也很难赚到一块钱利润
  10. 卸载/删除Homebrew包,包括其所有依赖项
  11. protues仿真之数码管消影问题
  12. 太戈编程DEVC++教师答案库
  13. echarts的全国和全球经纬度数据
  14. python小欢喜(八)俄罗斯方块 (3) 组合对象的旋转
  15. shell特殊符号cut命令,sort、wc、uniq命令,tee、tr、split命令
  16. 我转行程序员的那一年(一)
  17. hadoop启动命令 start-all.sh失效解决办法
  18. nacos问题: Load balancer does not have available server for client:xxx解决办法
  19. 题解 P1374 【进攻幽暗城】
  20. php年会总结,2019年终总结(示例代码)

热门文章

  1. List,Set和Map详解及其区别和他们分别适用的场景
  2. 8 线性表-循环队列-顺序存储
  3. TCP 的有限状态机
  4. oauth基本流程和原理
  5. LVM逻辑卷,RAID磁盘阵列
  6. 2. with check option能起什么作用?_面部毛孔粗大,有什么拯救的方法吗?
  7. activiti idea 请假流程_IDEA开发流程Activiti需要注意的一些坑
  8. 【无标题】线程池中阻塞队列的作用,为什么是先添加队列而不是先创建最大线程
  9. 设计模式之观察者模式demo
  10. MySQL性能优化知识:长连接、短连接、连接池