当前位置: 首页 > 编程日记 > 正文

不一样的命令行 – Windows PowerShell简介

引子

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

按 Ctrl+C 复制代码
# create new excel instance $objExcel = New-Object -comobject Excel.Application $objExcel.Visible = $True $objWorkbook = $objExcel.Workbooks.Add() $objWorksheet = $objWorkbook.Worksheets.Item(1) # write information to the excel file $i = 0 $first10 = (ps | sort ws -Descending | select -first 10) $first10 | foreach -Process {$i++; $objWorksheet.Cells.Item($i,1) = $_.name; $objWorksheet.Cells.Item($i,2) = $_.ws} $otherMem = (ps | measure ws -s).Sum - ($first10 | measure ws -s).Sum $objWorksheet.Cells.Item(11,1) = "Others"; $objWorksheet.Cells.Item(11,2) = $otherMem # draw the pie chart $objCharts = $objWorksheet.ChartObjects() $objChart = $objCharts.Add(0, 0, 500, 300) $objChart.Chart.SetSourceData($objWorksheet.range("A1:B11"), 2) $objChart.Chart.ChartType = 70 $objChart.Chart.ApplyDataLabels(5)
按 Ctrl+C 复制代码

(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这个东西,难道仅仅为了异步调用吗?

 

[Update] Another post also about powershell can be found in my blog: http://grapeot.me/post/2011/09/22/Computing-Powershell-as-a-glue-language.aspx

转载于:https://www.cnblogs.com/TNSSTAR/archive/2013/03/13/2957139.html

相关文章:

excel中会计专用格式问题_解决方法

excel 2003在使用格式中当选择会计专用会出现负号在左,数字在右的情况.这类设置并不是在excel中完成,而是在控制面板,区域和语言选项---自定义中设置---货币中设置,-&#xffe5;1.1改为&#xffe5;-1.1就可以解决了.包括千位分割样式保留的小数点位数等都可以在这里进行设置来…

Spring.Net Aop

Spring.Net 有四种通知&#xff1a; IMethodBeforeAdvice&#xff0c;IAfterReturningAdvice&#xff0c;IMethodInterceptor&#xff0c;IThrowsAdvice BeforeAdvice 1 using System.Reflection;2 using Spring.Aop;3 public class BeforeAdvice : IMethodBefore…

Oracle to_char函数的使用方法

本文转载于:https://blog.csdn.net/mikyz/article/details/69397030 本文转载于:https://www.cnblogs.com/aipan/p/7941917.html 本文转载于:https://blog.csdn.net/jinlong5200/article/details/3135949 转载于:https://www.cnblogs.com/demon09/p/9485627.html

python装饰器教学_Python装饰器学习(九步入门)

这是在Python学习小组上介绍的内容&#xff0c;现学现卖、多练习是好的学习方式。第一步&#xff1a;最简单的函数&#xff0c;准备附加额外功能 # -*- coding:gbk -*-示例1: 最简单的函数,表示调用了两次def myfunc():print("myfunc() called.")myfunc()myfunc()第二…

跨平台表空间传输(linux 10g表空间跨平台迁移到window 11g)

最近公司的一个项目里的linux 系统中的oracle 10g数据库&#xff0c;需要把某个表空间里的所有数据都迁移到window 2003的11g里&#xff0c;经过我与dba的交流、测试&#xff0c;决定使用跨平台的表空间传输技术&#xff0c;目前此项任务已经完成&#xff0c;经过测试&#xff…

YY的GCD 莫比乌斯反演

&#xff5e;&#xff5e;&#xff5e;题面&#xff5e;&#xff5e;&#xff5e; 题解&#xff1a; $ans \sum_{x 1}^{n}\sum_{y 1}^{m}\sum_{i 1}^{k}[gcd(x, y) p_{i}]$其中k为质数个数 $$ans \sum_{i 1}^{k}\sum_{x 1}^{n}\sum_{y 1}^{m}[gcd(x, y) p_{i}…

python答辩结束语_Beta答辩总结

前言队名&#xff1a;拖鞋旅游队项目的链接与宣传项目总结原计划实现功能预期完成程度上传照片完美实现照片信息标注在地图上对于有地理信息的照片能够较为精确的定位足迹地图可视化能够用颜色区分出到到每个省份的程度以及显示到达的地点生成旅游故事能够生成不同的故事模板&a…

在一台电脑上使用两个github账号

问题描述&#xff1a; 我公司有一个github账号&#xff0c;每天工作把代码传上去&#xff0c;我觉得代码写的好&#xff0c;我同时想上传到自己的github账号上面去&#xff0c;但是目前只有一台电脑&#xff0c;如何在一台电脑上面进行设置&#xff0c;使这一台电脑可以同时上传…

[唐胡璐]QTP框架 - 关键字驱动测试框架之七 - Settings管理

这里主要是存放一些框架相关的Global设置的相关项&#xff0c;如图所示&#xff1a;转载于:https://www.cnblogs.com/yongfeiuall/archive/2013/03/18/4134155.html

ASP.NET MVC以ValueProvider为核心的值提供系统: DictionaryValueProvider

NameValueCollectionValueProvider采用一个NameValueCollection作为数据源&#xff0c;DictionnaryValueProvider的数据源类型自然就是一个Dictionnary。NameValueCollection和Dictionnary都是一个键值对的集合&#xff0c;它们之间的不同之处在NameValueCollection运行元素具有…

串口 发送 接收 高位_电工进阶PLC大神,必备PLC串口通讯的基本知识!

戳上方蓝字“技成电工课堂”快速关注&#xff01;&#xff01;&#xff01;电力作业人员在使用PLC的时候会接触到很多的通讯协议以及通讯接口&#xff0c;最基本的PLC串口通讯和基本的通讯接口你都了解吗&#xff1f;1&#xff0c;什么是串口通讯&#xff1f;串口是计算机上一种…

HTTP请求时connectionRequestTimeout 、connectionTimeout、socketTimeout三个超时时间的含义...

1.connectionRequestTimout 指从连接池获取连接的timeout 2.connetionTimeout 指客户端和服务器建立连接的timeout&#xff0c; 就是http请求的三个阶段&#xff0c;一&#xff1a;建立连接&#xff1b;二&#xff1a;数据传送&#xff1b;三&#xff0c;断开连接。超时后会Con…

搜索引擎优化培训教程

很详细的搜索引擎优化培训教材 View more presentations from mysqlops 转载于:https://www.cnblogs.com/macleanoracle/archive/2013/03/19/2967982.html

C语言-扫雷游戏

头文件 #ifndef __MINE_H__ #define __MINE_H__#define LINE 10 #define LIST 10 #define ROWS 6 #define COWS 6int game(char UserBoard[LINE2][LIST2], char PlayerBoard[LINE][LIST]); void PrintBoard(char Playerboard[LINE][LIST]); void MineLay(char UserBoard[LINE …

PHP的命令行脚本调用

1.使用PHP命令调用php脚本接受键盘输入然后输出 1 <?php 2 fwrite(STDOUT, "Please input your name:\t"); 3 $name trim(fgets(STDIN)); 4 fwrite(STDOUT, Hello . $name); 5 ?> 2.使用PHP命令调用php脚本并接受参数 1 <?php2 if($ar…

控制输入框只能输入数字

1.将input的属性type改为number 2.这时的输入框会有小箭头&#xff0c; 去掉小箭头的方法&#xff0c;给input添加样式 input::-webkit-outer-spin-button,input::-webkit-inner-spin-button { -webkit-appearance: none;}input[type"number"] { -moz-appearan…

main函数参数,在VS中向命令行添加参数的方法

问题描述 使用main函数的参数&#xff0c;实现一个整数计算器&#xff0c;程序可以接受三个参数&#xff0c;第一个参数“-a”选项执行加法&#xff0c;“-s”选项执行减法&#xff0c;“-m”选项执行乘法&#xff0c;“-d”选项执行除法&#xff0c;后面两个参数为操作数。 例…

2.monotouch 控件的使用

1.我们打开一个xib 右下角会看到如下图所示&#xff1a; 这一部分包含了界面和各种各样的控件。选取一个控件&#xff0c;使用鼠标拖动到界面上即可使用。 2.选中一个控件&#xff0c;该控件的相关信息会在右边进行显示。做出相关设置即可。 3.设置控件属性和绑定控件事件。 首…

python视频延迟严重_【Python】改善 VideoCapture 的影像延迟

许多的范例程序大多仅介绍该如何用 VideoCapture 撷取摄影机的画面&#xff0c;却没有充分说明其隐含的问题。以下示范一个最基本的影像撷取程序。# -*- coding: utf-8 -*-import cv2# ip camera 的撷取路径URL "rtsp://admin:admin192.168.1.1/video.h264"# 建立 V…

CentOS 6.0配置pptp ××× Client和Squid透明网关

目的&#xff1a; 构建一台单网卡Linux网关&#xff08;透明代理&#xff09;&#xff0c;该网关拨入某海外服务器&#xff0c;客户端设定该网关后&#xff0c;网络出口则为海外服务器&#xff0c;实现加速访问一些网站的目的。 环境信息&#xff1a; 硬件&#xff1a;DELL机器…

mysql汉字转拼音函数

-- 创建汉字拼音对照临时表 CREATE TABLE IF NOT EXISTS t_base_pinyin (pin_yin_ varchar(255) CHARACTER SET gbk NOT NULL,code_ int(11) NOT NULL,PRIMARY KEY (code_) ) ENGINEInnoDB DEFAULT CHARSETlatin1;-- 插入数据 INSERT INTO t_base_pinyin (pin_yin_,code_) VAL…

数据挖掘的一些经典算法

数据挖掘能做以下七种不同事情&#xff08;分析方法&#xff09;&#xff1a;数据挖掘能做以下七种不同事情 分类 &#xff08;Classification&#xff09; 估计&#xff08;Estimation&#xff09; 预测&#xff08;Prediction&#xff09; 相关性分组或关联规则&#xff08;…

python cx oracle安装_python3.6的安装及cx_oracle安装

一、创建所需目录mkdir -p /home/用户名/software/python3.6.1mkdir -p /home/用户名/priv/bydmkdir -p /home/用户名/priv/byd/src/pythonmkdir -p /home/用户名/priv/byd/org二、修改byd目录的权限cd /home/用户名/priv/llchmod 777 byd/ll三、将安装包放到byd中&#xff0c;…

opencv 无法找到tbb_debug.dll

本人环境&#xff1a;vs 2010 在opencv(你的opencv install 路径)\build\common\tbb\ia32\vc10下&#xff0c;将tbb.dll 拷贝一份&#xff0c;改名为tbb_debug.dll. 并将此路径加入到系统环境变量中即可。转载于:https://blog.51cto.com/danielllf/871369

【天命奇御】成就进度62/71的通关攻略(1·开篇前言)

天命奇御于2018.8.9号在wegame上发售 先是一周目记录&#xff1a; 可以说一周目是熟悉最终boss技能后&#xff0c;靠技术过的...... 然后是二周目记录&#xff1a; 开篇前言&#xff1a; 转载于:https://www.cnblogs.com/wuduojia/p/9494700.html

使用git上传代码到github

1. github上创建项目 github是一个服务器托管商&#xff0c;我们写好的代码可以上传到github上面去 登录github的官方网站&#xff1a;http://github.com/ 注册一个自己的用户 新建一个项目&#xff0c;我这里有我自己的一个github账号&#xff0c;我直接登录上去了&am…

gpg加密命令 linux_用 PGP 保护代码完整性(五):将子密钥移到一个硬件设备中 | Linux 中国...

在这个系列教程中&#xff0c;将为你提供使用 PGP 和保护你的私钥的最佳体验。-- Konstantin Ryabitsev致谢译自 | linux.com 作者 | Konstantin Ryabitsev译者 | LCTT / qhwdw在这个系列教程中&#xff0c;将为你提供使用 PGP 和保护你的私钥的最佳体验。在本系列教程中&#…

在Android使用XML文件控制按钮文字在各种状态下的颜色

最近在项目中遇到新的需求&#xff0c;就是在按钮在选按的时候需要将文字变为白色&#xff0c;但android默认的按钮颜色为黑色&#xff0c;之前也没有考虑过类似的问题。 通过doc文档&#xff0c;发现按钮文字的处理方式和背景的处理方式很相似&#xff0c;同样可以用一份selec…

人人网 6.0 版申请页面随着滚动条拖动背景图片滚动出现的原理

第一步是考虑静态实现。整个页面分成几大块&#xff0c;比如&#xff1a; <div class"section" id"topic-a"></div> <div class"section" id"topic-b"></div> <div class"section" id"topi…

Python内部类,内部类调用外部类属性,方法

一 Python中内部类 典型定义&#xff1a; class MyOuter:age18def __init__(self,name):self.namenameclass MyInner:def __init__(self,inner_name):self.inner_nameinner_nameoutMyOuter(lqz) innerout.MyInner(lqz_inner) print(inner.inner_name) 二 内部类调用外部类的类属…