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

简介

本文讲述如何使用Powershell通过RAPI来控制Windows Embedded CE和Windows Mobile设备。

 

缘由

我入行的时候是做AS400 RPG和UNIX C开发的,所有开发环境都是字符界面,因此习惯了vi+grep+make的开发模式。后来开始做Windows的开发,开始也不大习惯,安装了cygwin来使用,离不开命令行。其实合理使用命令行能大大简化日常工作,我记得好像有本书叫做高效程序员,里面提到要合理使用命令行来简化日常工作。我十分赞同这一说法,下面通过一个例子讲述如何简化工作。

AS400

AS/400的界面

 

UNIX

UNIX的界面

 

cygwin_shell  

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。修改后就能执行批量脚本了。

image

 

 

使用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的风格一致。 
例如下图所示:

image

只是输入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,如需转载请自行联系原作者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/279636.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频图像传输学习笔记-基础小知识(一)

摄像头DVP与MIPI区别 DVP是并口&#xff0c;需要PCLK、VSYNC、HSYNC、D[0&#xff1a;11]——可以是8/10/12bit数据&#xff0c;看ISP或baseband是否支持&#xff1b;总线PCLK极限大约在96M左右&#xff0c;而且走线长度不能过长&#xff0c;所有DVP最大速率最好控制在72M以…

java程序员面试交流项目经验

粘贴自&#xff1a;https://blog.csdn.net/wangyuxuan_java/article/details/8778211 1&#xff1a;请你介绍一下你自己 这是面试官常问的问题。一般人回答这个问题过于平常&#xff0c;只说姓名、爱好、工作经验&#xff0c;这些简历上都有。其实&#xff0c;面试官最希望知道…

Windows7旗舰版磁盘分区详解—附分区步骤截图

最近工作中配置使用联想的Thinkpad TL系列本本.当然原装的系统时刚发布的Windows RTM旗舰版.在考虑买之前也参考了戴尔 苹果的等等, 但个人私下也是一直在用Tinkpad系列, 相比其他的品牌本人还是比较钟情于Tinkpad 非常实用的键盘. 以及简洁的外观.买回来一看这个TL系列原装的系…

outlook存档邮件_如何在Outlook 2013中存档电子邮件

outlook存档邮件We’ve always been told that backing up our data is a good idea. Well, that same concept can extend to email as well. You may want to archive your email every so often, such as monthly, quarterly, or even yearly. 我们一直被告知备份数据是一个…

洛谷 P1736 创意吃鱼法(多维DP)

题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中&#xff0c;然后开始思考&#xff1a;到底要以何种方法吃鱼呢&#xff08;猫猫就是这么可爱&#xff0c;吃鱼也要想好吃法 ^_*&#xff09;。她发现&#xff0c;把大池子视为01矩阵&#xff08;0表示对应位置无…

计算机组装和维护_如何构建自己的计算机,第二部分:组装在一起

计算机组装和维护So you’ve selected your parts, double- and triple-checked their compatibility, and waited for economy shipping to bring them all to your door. It’s time to get to the fun part: putting them all together. 因此&#xff0c;您已经选择了零件&a…

Python学习-集合的常见用法

st [1,2,3,4,5] ct [2,3,4,5,76] list set(["name", list, try]) list2 set(["name", list, try, but, test]) # 两个列表去重&#xff0c;利用集合st set(st) #设为集合 ct set(ct) print(st, type(st))sct0 st.union(ct) #并集 sct st | ct …

Autofac之自动装配

从容器中的可用服务中选择一个构造函数来创造对象&#xff0c;这个过程叫做自动装配。这个过程是通过反射实现的 默认 思考这么一个问题,如果注册类型中存在多个构造函数,那么Autofac会选择哪一个来创建类型的实例 答案是"尽可能最多参数" class ConstructorClass {p…

对Emlog 6.0 Beta的完整代码审计过程

Emlog 6.0 beta版本&#xff0c;这可能是最后一篇关于PHP语言CMS的代码审计文章&#xff0c;此次将详细记录完整的审计过程。 文章基本上完整记录小东的对此CMS审计过程&#xff0c;或许显得繁琐&#xff0c;但代码审计的过程就是这样&#xff0c;发现可能项&#xff0c;然后精…

SINOCES 2011

突然发现又好久没写过日志了 是在是太懒了… 难得休假去看了眼消费电子 感觉实在是一年不如一年 佳能、索尼不见踪影&#xff0c;相机满场没见一家&#xff08;大牌子是真没见到&#xff09; 华硕技嘉微星等主板厂商同样失踪… PC方面&#xff0c;联想貌似是来卖电脑包鼠标的&a…

esim卡与ms卡的区别_什么是eSIM,它与SIM卡有何不同?

esim卡与ms卡的区别With the launch of the Apple Watch 3, the term “eSIM” has been thrown around a lot. And now, Google’s Pixel 2 is the first phone to use this new technology, it’s time we take a closer look at what it is, what it does, and what this me…

机器学习实战之logistic回归分类

利用logistic回归进行分类的主要思想&#xff1a;根据现有数据对分类边界建立回归公式&#xff0c;并以此进行分类。 logistic优缺点&#xff1a; 优点&#xff1a;计算代价不高&#xff0c;易于理解和实现。缺点&#xff1a;容易欠拟合&#xff0c;分类精度可能不高。 .适用数…

HDU 6343.Problem L. Graph Theory Homework-数学 (2018 Multi-University Training Contest 4 1012)

6343.Problem L. Graph Theory Homework 官方题解: 一篇写的很好的博客: HDU 6343 - Problem L. Graph Theory Homework - [(伪装成图论题的)简单数学题] 代码: 1 //1012-6343-数学2 #include<iostream>3 #include<cstdio>4 #include<cstring>5 #include<…

Android GridView LruCache

照片墙这种功能现在应该算是挺常见了&#xff0c;在很多应用中你都可以经常看到照片墙的身影。它的设计思路其实也非常简单&#xff0c;用一个GridView控件当作“墙”&#xff0c;然后随着GridView的滚动将一张张照片贴在“墙”上&#xff0c;这些照片可以是手机本地中存储的&a…

如何在Android TV上自定义推荐行

When you fire up Android TV, the first thing you see is a list of movies and shows the system thinks you’ll like. It’s often full of the latest flicks or hottest news, but sometimes it could just be things relevant to your interests and the apps you have…

递归 段错误 习题

段错误 递归里面算阶乘 f(10000000)没有输出&#xff0c;使用gdb 显示 SIGSEGV--段错误编译后产生的可执行文件里面保存着什么&#xff1f;UNIX/Linux 用 ELFDOS下用COFFWindows用PE&#xff08;COFF扩充而得&#xff09;段&#xff08;segmentation&#xff09;二进制文件内的…

你知道你常用的dos和linux命令吗?

功能 Linux MS-DOS 进入到该目录 cd cd 列举文件 ls dir 创建目录 mkdir mkdir 清除屏幕 clear cls 复制文件 cp copy 移动文件 mv move 删除文件 rm del 查看文件 less more 文件重命名 mv ren 比较文件内容 diff fc 查看当前路径 pwd chd…

steam串流到手机_如何从手机将Steam游戏下载到PC

steam串流到手机Steam allows you to remotely install games from your smartphone, just like you can with a PlayStation 4 or Xbox One. You can download games to your gaming PC from anywhere, ensuring those big downloads are complete and the game is ready to p…

编写安装配置ftp-samba服务脚本

本脚本实例的要求如下&#xff1a; 1、公司有公共共享目录public,所有员工均可读写&#xff0c;但不允许删除其他员工的文件;不能匿名登录 2、每部门均有共享目录&#xff0c;部门经理可读写&#xff0c;部门员工可读&#xff1b; 非本部门员工不能访问&#xff08;caiwu、rens…

利用java实现excel转pdf文件

在有些需求当中我们需要抓取字段并且填充到excel表格里面&#xff0c;最后将excel表格转换成pdf格式进行输出&#xff0c;我第一次接触这个需求时&#xff0c;碰到几个比较棘手的问题&#xff0c;现在一一列出并且提供解决方案。 1&#xff1a;excel转pdf出现乱码&#xff1a; …