引子
一直很羡慕Linux的命令提示符(当然他们叫Shell)。正则表达式,管道,各种神奇的命令,组合起来就能高效完成很多复杂的任务。效率实在是高。流了n年的哈喇子以后,终于有幸用上了Win7,邂逅了cmd的升级版:Windows PowerShell。从此暗爽无比,原来Windows下也有这样的利器呀~
看看下面的Windows脚本,不到15行有效代码。在Win7下只要右击脚本文件,选择Run with PowerShell,就会自动找到最占内存的10个进程,然后将它们占用的内存画成一个三维饼图,如下图所示。

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 1 # create new excel instance
2 $objExcel = New-Object -comobject Excel.Application
3 $objExcel.Visible = $True
4 $objWorkbook = $objExcel.Workbooks.Add()
5 $objWorksheet = $objWorkbook.Worksheets.Item(1)
6
7 # write information to the excel file
8 $i = 0
9 $first10 = (ps | sort ws -Descending | select -first 10)
10 $first10 | foreach -Process {$i++; $objWorksheet.Cells.Item($i,1) = $_.name; $objWorksheet.Cells.Item($i,2) = $_.ws}
11 $otherMem = (ps | measure ws -s).Sum - ($first10 | measure ws -s).Sum
12 $objWorksheet.Cells.Item(11,1) = "Others"; $objWorksheet.Cells.Item(11,2) = $otherMem
13
14 # draw the pie chart
15 $objCharts = $objWorksheet.ChartObjects()
16 $objChart = $objCharts.Add(0, 0, 500, 300)
17 $objChart.Chart.SetSourceData($objWorksheet.range("A1:B11"), 2)
18 $objChart.Chart.ChartType = 70
19 $objChart.Chart.ApplyDataLabels(5)
(1. 这个脚本调用了Excel的COM库。 2. 当然从命令耦合的角度来看,输出成文本格式更有利,但这个例子主要想说明PowerShell的强大以及微软产品优异的复用性。 3. 要手动启动PowerShell,可以在开始菜单的搜索框中直接键入PowerShell回车即可)
简单领略PowerShell的强大之后,下文就从几个方面介绍一下PowerShell相对于以往版本的命令提示符甚至Linux Shell的优势。

Cmdlet + Regex + Pipeline + ...
以往cmd相对于Shell有很多不足,比如命令偏少,部分命令功能偏弱,对正则表达式不支持等等。但现在PowerShell一下赶上来不少。2.0 RTM版内建支持414个命令(术语称为cmdlet),支持正则表达式,强大的管道应用(其实管道本身的功能和以前差不多,关键是冒出来一堆能用管道的命令,比如more, sort, foreach等等),和系统的联系也比以前紧密了很多。
举几个例子来说明:
dir registry::HKEY_CURRENT_USER可以直接显示注册表相应位置的内容,可以看到dir的功能改进了不少。
ps | sort ws -Descending | select -first 10可以显示占用内存最大的10个进程,可以看到管道的灵活应用。
dir -Name | ? {$_ -match "(?<num>.).*(\k<num>)"}可以显示出当前目录下文件名有重复字符的文件。比如abcda.efg,而abcd.efg则不会显示出来。可以看到PowerShell对正则表达式的支持相当强大。(确切的说严格的正则表达式已经无法实现这样的效果,需要上下文无关文法 才能够支持。)
以前为了演示Linux Shell的强大,Stephenjy发了一个自己的截图,在遇见PowerShell前觉得好神奇,所幸现在也可以实现了。:-)


(为了节约显示空间,PowerShell的部分显示结果被删除,但这个Prompt效果可以用以下脚本验证: function prompt {"($env:username)-($env:computername)-(`$?: $?)-(jobs: $((get-job | measure).Count))-($(get-location))`n(! $(((history)[-1]).ID + 1))->"})
大杀器 - 面向对象
Linux的设计思想决定所有的输入和输出都尽可能是文本格式,这样可以方便各进程间的合作。同样这也要求各个程序提供一定强度的文本解析能力。但Windows的思想与此不同,PowerShell中很多输入输出都不是普通的文本(plain text),而是一个个对象(objects)。因此与其说PowerShell是一种交互环境,不如说它是一种强大语言的Runtime,而这种语言甚至是面向对象的。
比如当键入get-process查看当前进程列表时,系统返回的是这样的列表:
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
318 8 12948 3872 84 1728 AppleMobileD
115 5 13816 13328 38 6920 audiodg
1315 21 11732 10988 108 2544 CcmExec
... ...
虽然看似一般的格式化文本,但其实这是一个数组,而每个数组元素又是Process类型的对象。同.NET一脉相承,PowerShell中的所有的类都继承自Object,且支持GetType()函数。因此我们可以执行(get-process).GetType()来看看它的类型:
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
而数组中每个元素的类型可以用(get-process)[0].GetType()查看:
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False Process System.ComponentM...
其中面向思想的思想非常明显,类成员,方法,继承都出现了。个人感觉这样的好处并不是指望能用PowerShell写什么大型软件,而是体现在另外两个方面:首先,这样让内置的cmdlet及其数据结构组织清晰,符合直觉,写代码时速度快不容易出错。第二,对面向对象的内建支持也为后面无缝接合.NET和COM接口提供了基础。
站在巨人的肩膀上 - 无缝调用.NET/COM
.NET Framework中包含了一个异常强大的库,而微软为了保证二进制层面上跨语言的兼容性,很多库都是用COM封装的。PowerShell的一大特色就是可以直接调用这些库。比如前面的示例用$objExcel = New-Object -comobject Excel.Application创建了一个Excel对象。而wikipedia上的一个脚本更示范了这种无缝调用的强大。下面这个3句话的脚本的作用是显示一个RSS源最近的8篇文章的标题。注意其中网络连接,内容下载,XML解析等工作全部由.NET库完成,正因为站在巨人的肩膀上,PowerShell在实际使用中往往左右逢源,简洁高效。
$rssUrl = "http://blogs.msdn.com/powershell/rss.aspx"
$blog = [xml](new-object System.Net.WebClient).DownloadString($rssUrl)
$blog.rss.channel.item | select title -first 8
编辑,运行,调试 - IDE
Windows程序开发,尤其是基于微软技术的开发很爽的一点就是有强大的IDE和专业的文档作支持。不论是Windows下的Visual Studio还是Linux下的Mono Develop,甚至连PowerShell这样的语言都有集编辑与调试为一体的IDE:Windows PowerShell ISE。有了自动完成,即时脚本交互,调试甚至远程调试,PowerShell脚本写起来“甚爽甚强巨”。当然文档也是一般的强大,MSDN中关于PowerShell的部分依旧专业浩瀚。

蛋疼的伪装 - Profile
有了PowerShell以后,很少就去cmd了。不过作为一个蛋疼的装B男,把PowerShell伪装成cmd也是挺有乐趣的一件事。不难发现PowerShell和cmd仅仅在图标,标题,背景色,提示符,以及刚启动时的显示文字五个方面不同。图标和背景色在快捷方式属性中可以很方便的修改。而标题和提示符的修改就要用到Profile了。所谓Profile就是在每次启动PowerShell时都首先自动运行的一段脚本。这个脚本的路径在$profile变量中有设定。只要设定$host.UI.RawUI.WindowTitle为C:\windows\system32\cmd.exe就能将标题伪装为cmd。而自定义提示符为当前路径在PowerShell中自然万分简单。至于启动时的显示文字,只要通过/nologo参数隐藏原有的版本信息,再打印一行cmd中的文字就好了。最终效果如图:(关于Profile,可以参见这个链接)

另:进程级工作调度– 并行支持?
==========================================================
随着多核处理器的迅速发展,从.NET Framework 4.0开始,并行计算被一再强调。从System.Threading中新增加的并行工具类到F#这种非常适合并行化的函数式语言,微软适时对线程级并行提供了强大的支持。但是对于进程级的工作调度,Windows似乎还相当原始。举个最简单的例子来说,如果我们同时向一个移动硬盘启动5个拷贝会话的话,Windows会同时开始所有的拷贝操作。这样磁头会在不同的目标位置间反复进行无意义的移动(寻道),于是在硬盘灯的狂闪中,大量时间就被浪费了。同样当我们同时启动数个计算量大的进程时,Windows也会试图让这些进程“齐头并进”。然而为了避免某个进程被饿死,系统又不得不频繁切换进程,于是大量的时间又被浪费在了保存现场,进程切换,恢复现场上。这样来看,进程级的并行做的反而不够好。
所幸PowerShell中加入了任务调度管理功能。通过简单的实验,我们可以发现PowerShell对jobs的调度和Windows默认的大不相同,它一般维持和CPU核心数相同的进程高速运转,而其它进程仅仅占用小部分CPU时间。直到前面的进程结束工作后,后面才有新的进程递补进入高速运转的状态。==========================================================
后来更仔细地做了实验以后发现,原来Windows内置的进程调度方案就是小部分高速运转(在我的双核处理器上是两个进程占用50%CPU),大部分低速跟进(其他所有进程分享剩下的50%CPU)。这样PowerShell的工作调度并没有改善系统原有的现状。同时由于PowerShell的调度系统需要占用不小的内存,初始化也需要时间。在实测中甚至比默认调度慢了50%。这个实验结果比较囧。不晓得为什么PowerShell中为什么要加入Job这个东西,难道仅仅为了异步调用吗?
分享到:
相关推荐
标题和描述中提到的知识点包括:PowerShell简介、PowerShell与Linux Shell的比较、PowerShell强大的功能展示、PowerShell脚本编写和执行。 PowerShell是一个由微软公司开发的命令行外壳程序和脚本语言。它与Windows...
本质上说、前两种方法是一样的,第三种方法不能被cmd/bat批处理调用。所以、用reg命令是最现实的cmd/bat批处理解决方案。 四种获取已安装程序列表方法的语法如下: wmic /output:D:\InstalledSoftwareList.txt ...
亲测可用
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
【项目资源】: 物联网项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
【项目资源】: 单片机项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
【项目资源】: 单片机项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
【项目资源】: 物联网项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
IDE护眼主题套件
内容概要:文章详细介绍了基于Matlab/Simulink构建的增程式电动车仿真模型。该模型由电池、电机、发动机、整车动力学、控制策略和驾驶员模块六大组件构成,重点在于各模块间的能量流动逻辑。文中特别强调了功率跟随控制策略,通过PID闭环控制使发动机功率与电池需求动态匹配,优化了燃油经济性和SOC控制精度。此外,模型采用开放式架构,所有参数通过m脚本集中管理,便于修改和扩展。文章展示了模型在典型工况下的性能表现,并突出了其在科研和工程应用中的灵活性和实用性。; 适合人群:对新能源汽车技术感兴趣的工程师、研究人员以及高校相关专业师生。; 使用场景及目标:①用于研究增程式电动车的能量管理策略;②作为教学案例帮助学生理解复杂系统的建模方法;③为实际工程项目提供可复用的仿真平台。; 阅读建议:读者应重点关注模型的架构设计和关键控制算法实现,同时结合提供的代码片段进行实践操作,以便更好地掌握增程式电动车的工作原理及其优化方法。
51a30-main.zip
内容概要:本文详细介绍了多种类型的数据库索引及其应用场景,包括普通索引、唯一性索引、单个索引、复合索引、聚簇索引、非聚簇索引、主索引、外键索引、全文索引和空间索引。每种索引都有其独特的定义、要点和适用场景,并附有具体的SQL代码示例。此外,文章还对比了InnoDB和MyISAM两种存储引擎的特点,解释了脏读、不可重复读、可重复读和幻读的概念,并讨论了SQL优化的方法以及数据库事务的ACID特性。 适合人群:具备一定数据库基础知识的开发者、数据库管理员以及参与数据库设计和优化的技术人员。 使用场景及目标:①帮助开发者选择合适的索引类型以提高查询效率;②理解不同存储引擎的特点,选择最适合应用场景的存储引擎;③掌握事务隔离级别的概念,避免数据不一致问题;④学习SQL优化技巧,提升数据库性能;⑤理解ACID特性,确保数据库操作的一致性和可靠性。 阅读建议:本文内容较为全面且深入,建议读者结合实际项目需求,重点理解不同类型索引的应用场景,掌握SQL优化的基本原则,并熟悉事务处理的最佳实践。
内容概要:本文详细介绍了MATLAB中优化算法的实现方法,涵盖确定性算法(如梯度下降法)和随机性算法(如遗传算法、粒子群优化)。文章首先讲解了梯度下降法和MATLAB优化工具箱的应用,展示了如何使用fmincon解决约束优化问题。接着,文章深入探讨了线性规划、非线性规划和多目标优化的理论和实践,提供了具体的MATLAB代码示例。此外,文中还介绍了遗传算法、粒子群优化和模拟退火算法的原理及应用,并通过实例展示了这些算法在实际问题中的使用。最后,文章讨论了优化算法在工程、金融和机器学习领域的高级应用,以及调试和优化的常见策略。 适合人群:具备一定编程基础,对优化算法感兴趣的工程师、研究人员和学生。 使用场景及目标:①理解优化算法的基础理论和实现方法;②掌握MATLAB优化工具箱的使用,解决线性、非线性、多目标优化问题;③学习遗传算法、粒子群优化和模拟退火算法的具体应用;④提高优化算法的性能和可靠性,解决实际工程、金融和机器学习问题。 阅读建议:本文内容丰富,涉及多种优化算法及其MATLAB实现,建议读者先掌握基本的优化理论和MATLAB编程基础,再逐步深入学习各类算法的具体应用。在学习过程中,结合提供的代码示例进行实践,并尝试调整参数以优化算法性能。
this is for myself learn coding, change a pc debug.
项目资源包含:可运行源码+sql文件 适用人群:学习不同技术领域的小白或进阶学习者;可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 项目具有较高的学习借鉴价值,也可拿来修改、二次开发。 有任何使用上的问题,欢迎随时与博主沟通,博主看到后会第一时间及时解答。 开发语言:Python 框架:django Python版本:python3.8 数据库:mysql 5.7 数据库工具:Navicat 开发软件:PyCharm 浏览器:谷歌浏览器
【项目资源】: 单片机项目适用于从基础到高级的各种项目,特别是在性能要求较高的场景中,比如操作系统开发、嵌入式编程和底层系统编程。如果您是初学者,可以从简单的控制台程序开始练习;如果是进阶开发者,可以尝试涉及硬件或网络的项目。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】: 项目具有较高的学习借鉴价值,也可直接拿来修改复刻。 对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】: 有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 鼓励下载和使用,并欢迎大家互相学习,共同进步。 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。
内容概要:本文深入探讨了MMC型STATCOM/SVG的核心技术和调试技巧,重点讲解了载波移相调制(CPS-PWM)和电压均衡控制两大关键技术。载波移相调制通过为每个子模块设置不同的载波相位差,有效降低谐波含量并优化开关频率。电压均衡则分为桥臂内、桥臂间和相间三个层次,分别采用动态排序、比例控制和零序电压注入等方法,确保系统稳定运行。文章还分享了多个实战经验,如低压调试、红外热像仪检测以及避免参数设置不当引发的问题。; 适合人群:从事电力电子领域,特别是参与STATCOM/SVG项目的设计、开发和调试的技术人员。; 使用场景及目标:①理解MMC型STATCOM/SVG的工作原理和技术细节;②掌握载波移相调制的具体实现方法;③学习电压均衡控制的各种策略及其应用场景;④获取实际调试过程中常见问题的解决方案。; 阅读建议:本文涉及大量技术细节和实战经验,建议读者结合实际项目进行阅读,重点关注载波移相调制和电压均衡控制的具体实现,并参考提供的代码片段进行实践。
liangmmm_finalll.scdoc
内容概要:本文详细介绍了Solidity语言的核心概念和语法特性,涵盖结构体、函数修改器、事件、类型系统、数组、映射、操作符、合约可见性、构造函数、抽象合约、接口、继承、控制结构、异常处理和keccak256哈希函数等内容。通过这些知识点的讲解,帮助开发者理解如何构建高效、安全的智能合约。; 适合人群:对区块链开发感兴趣,尤其是希望深入了解以太坊智能合约开发的初学者及有一定编程基础的研发人员。; 使用场景及目标:①掌握Solidity语言的基本语法和高级特性,如结构体、函数修改器、事件等;②理解合约的可见性、继承、接口等面向对象编程特性;③学会使用keccak256等安全机制保障智能合约的安全性;④能够运用控制结构和异常处理编写健壮的合约逻辑。; 阅读建议:建议读者从基础语法开始逐步深入,结合实际案例进行练习。尤其要注意合约的安全性和性能优化,避免常见的漏洞和错误。在学习过程中,应多参考官方文档和其他优质资料,不断巩固和拓展知识体系。
原型模式课上代码.zip