如何使用PowerShell提升开发效率(以Windows Embedded CE为例)
简介
本文讲述如何使用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为例)相关推荐
- 深度解读Microsoft Build 2020:提升开发效率,优化开发环境
Microsoft Build 2020 在众多新产品与技术发布中圆满落幕 但身为开发技术人深知 技术世界的更迭.求索却从未止步 唯有不断提升自身技能栈创新 方能从技术浮沉中获得更多养分 让技术予力世 ...
- order by 影响效率么_提升开发效率N倍的20+命令行神器
图 by:石头@青海湖 关于作者:程序猿石头(ID: tangleithu),现任阿里巴巴技术专家,清华学渣,前大疆后端 Leader.以每篇文章都让人有收获为目的,欢迎关注,交流和指导! 背景 本文 ...
- 提升开发效率N倍的20+命令行神器!(附 demo)
点击上方蓝色字体,关注我 -- 一个在阿里云打工的清华学渣! 图 by:石头@青海湖 关于作者:程序猿石头(ID: tangleithu),现任阿里巴巴技术专家,清华学渣,前大疆后端 Leader.以 ...
- Python学习笔记:Day13 提升开发效率
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- 提升开发效率的十个工具
Git 之前也有过不少版本控制的工具.有好的,也有糟糕的.不过它们都或多或少地误入歧途了. 这时候Git出现了.一旦你用上了这个神奇的工具,很难相像你还会碰到比它更好的了. 还没用过Git?试一下吧. ...
- atitit.提升开发效率---mda 软件开发方式的革命
atitit.提升开发效率---mda 软件开发方式的革命 1. 软件开发方式的革命开发工具的抽象层次将再次提升 1 2. 应用框架和其实现相分离 2 3. 目前的问题模型和代码不同步 2 4. MD ...
- atitit.提升开发效率---使用server控件生命周期 asp.net 11个阶段 java jsf 的6个阶段比較...
atitit.提升开发效率---使用server控件生命周期 asp.net 11个阶段 java jsf 的6个阶段比較 例如以下列举了server控件生命周期所要经历的11个阶段. (1)初始 ...
- 猿创征文|后端开发工程师提升开发效率神器推荐
简介 对于现在的后端工程师来说,并不仅仅局限于编写代码和解决bug,这两个要素了.如果你目前还只是忙碌的写代码和改bug的话,那要深度思考一下,我为什么日复一日的写这些重复代码?这样有何意义?或者说, ...
- Atitit外包优缺点 提升开发效率 外包模式 1.一般来说外包优点 1.1.更加方便快捷 时间成本降低了 1.2.会导致 经济成本高,,时间成本降低了, 2.缺点 2.1.成本高 2.2.
Atitit外包优缺点 提升开发效率 外包模式 一般来说外包优点 更加方便快捷 时间成本降低了 会导致 经济成本高,,时间成本降低了, 缺点 成本高 缺少控制 但是少部分,比如理发,经济时间成本都 ...
最新文章
- 中南大学计算机专业男女比例,你知道吗?中南大学的男女比例居然是这样的
- 用户界面设计的技巧与技术 (作者Scott W.Ambler)
- 利用npm安装/删除/发布/更新/撤销发布包
- Binding在WPF中的使用
- TOP命令及参数解析
- 查漏补缺:2020年搞定SpringCloud面试(含答案和思维导图)
- vmware vsphere powercli 因为在此系统中禁止执行脚本
- 整合Swagger接口文档
- 就算给穷人一百万,他们也很难赚到一块钱利润
- 卸载/删除Homebrew包,包括其所有依赖项
- protues仿真之数码管消影问题
- 太戈编程DEVC++教师答案库
- echarts的全国和全球经纬度数据
- python小欢喜(八)俄罗斯方块 (3) 组合对象的旋转
- shell特殊符号cut命令,sort、wc、uniq命令,tee、tr、split命令
- 我转行程序员的那一年(一)
- hadoop启动命令 start-all.sh失效解决办法
- nacos问题: Load balancer does not have available server for client:xxx解决办法
- 题解 P1374 【进攻幽暗城】
- php年会总结,2019年终总结(示例代码)