下一代命令行MSH完全上手指南

系统专区

微软在2005年向世人展示了下一代命令行工具MSH(代号Monad)的Beta版本,该工具将在未来逐步取代现有DOS命令行。作为长期使用DOS命令的用户,如何快速了解MSH的简单使用,并熟悉MSH的使用环境呢?本文将引领你快速进入MSH的世界。

一、MSH快速入门

1.什么是MSH

MSH,即Microsoft Command Shell,从字面上你可以知道这是微软推出的“命令行外壳”。根据微软的计划,它将是下一代命令行处理工具。与诸多命令行“外壳”一样,MSH也有属于自己的概念且有丰富的脚本支持(可支持Perl和Python等脚本语言)。此外,它还是一个构建在微软.NET Framework之上,完全面向对象的编程系统。MSH彻底依赖.NET对象反射的元数据来使动态脚本运作,不仅对文本管道输出如此,而且对大多数处理数据排列的命令行界面也是一样。通过这种渠道,能使各种命令和脚本更准确地在MSH环境下被执行。

2.MSH与DOS比较

我们知道,大多数外壳程序(例如,现存Windows系统中的Cmd.exe所调用的DOS环境)都是通过执行特定的命令行或在一个进程中执行相应的程序来实现其操作,并将结果以文本的形式反馈给用户,“基于文本的进程处理”是这些外壳实现系统交互的方式。以往出现了很多种文本进程处理工具,例如,Sed、Awk和Perl等。这些外壳都有相应的内置命令,例如,在Cmd.exe中的“DIR”命令。

MSH外壳与传统的外壳处理程序有显著不同:

首先,它不以文本作为系统交互的基础,而是使用基于.NET平台的“对象模型”来实现交互,由此衍生出大量的系统交互方式。其次,系统内置的命令更丰富(这些命令被放置于称为“Cmdlets”的“容器”中,Cmdlets相当于一个命令集合),这将最大限度地保证实现更多和对象模型相关的系统交互。第三,与DOS相比,该外壳处理程序可创建功能更为强大的脚本文件,从而能通过使用语法分析(而不是单纯依赖于单独的命令)来保持与内置命令相关的系统交互的连贯性。

当然,我们在这里提到的不同是指深层次的,而要想快速从DOS过渡到MSH,你会发现它其实提供了相当丰富且快捷的、与DOS类似的操作命令。

3.安装MSH

MSH能在Windows XP/2003系统下运行,为确保正常使用MSH,首先需要安装微软的.NET Framework 2.0。安装好.NET Framework后,进行MSH安装,在安装过程中可以指定安装的具体位置。

4.使用MSH Shell

(1)进入MSH环境

安装好MSH之后,单击“开始→运行”菜单项,然后在对话框中输入“MSH”并回车,稍后你将看到与DOS窗口非常相似的MSH操作窗口。不过,在窗口中所显示的提示符“MSH>”和标题栏中的信息已告诉你不是在传统的DOS命令提示符下。

提示:在“开始→程序”菜单项中单击“Microsoft Command Shell”,也可以打开MSH操作窗口。

(2)在MSH 中获得帮助

初次使用MSH肯定不知道到底能干什么,不过,MSH完全兼容DOS的操作命令,所以,如果你要在这里实现文件、磁盘等操作,可原样输入DOS命令。

但MSH毕竟不是DOS,为了查看关于MSH的帮助信息,你可以在“MSH>”提示符后输入“help”或“get-help”命令,回车后便能获得一些帮助指引信息。

如果在“Get-help”后带上命令名称,可得到关于该命令的帮助,例如,“Get-Help Get-Process”命令将获取“Get-Process”的详细信息。

5.掌握MSH的基本概念

在MSH中提出了一些新的概念,了解这些概念将有助于深入领会它的基本使用方法。

(1)命令(Cmdlet)

“Cmdlet”是MSH中对操作命令的称呼,它是与其他外壳处理程序中的内置命令非常类似的一个小的功能单元。一个“Cmdlet”通常由一个动词与名词组成,中间用“-”隔开,例如,“Get-Process”。在MSH 环境中的可用命令共有100多条。

“Get-command”是初学者使用MSH命令时的得力帮手,在“MSH>”提示符后输入“Get-command”,可列出MSH的命令集列表和使用格式,但冗长的列表会让初学者无所适从。其实,当我们对某条命令的使用不清楚时,使用“Get-command”命令还可以查询相应命令的格式。例如,键入“Get-command set-location”命令,回车后将在“Definition”列显示“set-location”命令的使用格式。

任何一条MSH命令都有自己的特定格式,在使用中,必须严格遵守其使用格式的要求,更重要的是,与DOS在细微之处的不同在于,如果要在命令后面跟上参数,别忘了一定要先加上空格,例如,在DOS中,输入“cd\”可到当前盘的根目录,而在MSH中,你必须输入“cd \”(斜杠前有一空格)。

注意:在DOS中的命令可直接在MSH环境下使用,且使用格式和功能遵从于它在DOS中的规定。

(2)别名(Alias)

“Alias”是MSH中的另一个重要概念,简单地说,Alias相当于是对某个命令(Cmdlet)的缩写。使用别名可减少用户输入时的按键次数,如同我们在DOS中可以用“CD”命令取代“Chdir”命令。

为了便于大家了解和使用别名,我们在后面介绍某条命令的使用时,将一并提供它的别名格式。更多命令别名信息,请查阅相关参考书。

在提示符后输入“get-alias”命令或“gal”(这里的gal本身就是“get-alias”命令的别名),可查看系统中可用的别名与命令之间的对应关系。

提示:通过“get-alias”命令所获取的命令别名比微软在MSH帮助文档中提供的更全面。也就是说,对于相同的命令,系统可能已经为我们准备了不同的多个别名,例如,copy-item的别名有cpi,也有copy(所有DOS下的文件复制命令Copy也可以在MSH中运行)。

当需要使用某命令时,为节省时间而提高输入效率,请尽量使用别名来代替本名。

二、磁盘操作

MSH提供了强大的磁盘操作功能,而磁盘操作可借助于它的相应命令来完成。

1.显示当前系统盘符——Get-Drive

格式:Get-Drive

别名:gdr

功能:返回当前系统中所有的盘符、注册表的两大根键“HKEY_CURRENT_USER”和“HKEY_LOCAL_MACHINE”、当前所处的盘符路径(系统默认进入MSH时的当前路径为“C:\Documents and Settings\<用户名>”)等。

说明:在提示符后输入“get-drive”或“gdr”并回车,将得到类似下图所示的结果:

msh1.jpg
显示当前系统盘符

从图中我们可以看到,按首字母顺序排列的系统当前所有的盘符、注册表两大根键等相关信息。通过使用该命令,我们可快速了解系统中盘符的分布情况。

2.改变当前路径——Set-Location

格式:Set-Location <路径>

别名:sl、cd、chdir

功能:转换当前路径。

说明:该命令相当于DOS中的“CD”命令,使用该命令可将命令后指定的位置切换为当前路径。

举例:在提示符后输入“set-location D:\”或“sl d:\”命令,可使D盘根目录变更为当前路径。如果接着输入“dir”命令,可看到D盘根目录下的文件和文件夹名称。

3.查看当前路径——Get-Location

格式:Get-Location

别名:gl、pwd

功能:查询当前所处的路径信息。

说明:刚进入MSH环境时,系统当前路径为当前账户名所处的文件夹(例如,C:\Documents and Settings\<用户名>),这一点用“get-location”命令可查询到。如果执行“set-location e:\”命令后再执行“get-location”,可见到系统返回的当前路径(Path)为E:\。

4.堆栈存取——Push-Location

格式:Push-Location [<路径>]

功能:将<路径>存入堆栈中,以备今后使用“Pop-Location”命令取出。如果省略<路径>,则将当前路径信息存入堆栈。

说明:如果希望在使用Set-Location命令之前某个路径信息不丢失,则可用“Push-Location”命令将该路径信息保存到堆栈中。这也许并不太好理解,但相信下面这个例子能让你看懂。

举例:输入“set-location e:\web”命令,则当前路径将变为“e:\web”,如果之后输入“set-location c:\windows”命令,很明显当前路径会变成C:\Windows。而我们希望等会儿不再次输入“set-location e:\web”命令将当前路径改变为“e:\web”,则可在执行“set-location c:\windows”之前先输入“push-location e:\web”命令将其保存起来,稍后,我们只需要用“pop-location”命令,便可以将当前路径变为E:\Web。

5.堆栈存取——Pop-Location

格式:Pop-Location

功能:将保存在堆栈中的路径信息取出并设置其为当前路径。

说明:该命令通常和Push-Location一起使用,目的是将使用“Push-Location”命令所存放的路径信息设置为当前路径。

举例:请试着输入以下命令序列,以体会该命令的作用。

set-location c:\windows

dir

push-location

dir

set-location c:\file

dir

pop-location

dir

想想看并试着做一下,最后一个“dir”命令所显示的信息,是不是应该为C:\Windows中的文件列表信息?

三、文件(夹)操作

在MSH中,使用命令同样可完成文件(夹)的复制、删除等操作。

1.显示文件内容——Get-Content

格式:Get-Content [<文件名>]

别名:gc、cat、type

功能:显示文本文件的内容,相当于DOS中的TYPE命令。

说明:该命令只能查看文本文件的内容。如果不输入文件名,则在执行该命令时,会要求在提示信息后输入。

举例:在提示符后输入“get-content”或“gc”命令并回车,则在提示信息中表明该命令需要跟上参数(即文件名),此时在“Path[0]”后输入文本文件的路径及名称,在后面的“path[1]”后直接回车,可显示出文件内容。

msh2.jpg
显示指定文件内容

2.查看目录结构——Get-ChildItem

格式:Get-ChildItem [路径]

别名:gci

功能:显示指定路径下的目录结构,相当于DOS中的“DIR”命令。

说明:如果省略“[路径]”,则显示当前路径下的文件目录结构。在所显示的结果中,可以查看某个项目是文件还是文件夹。如果“Mode”列的第一个字母为“d”则表示这是一个文件夹(该项目的“Length”列不显示任何数字)。通过该命令还可获取文件(夹)创建的日期和时间等信息。

msh3.jpg
查看目录结构

3.删除文件(夹)——Remove-Item

格式:Remove-Item [<路径> [文件名]]

别名:ri、del、erase、rm 、rmdir、rd

功能:删除指定的文件或文件夹。该命令并不会将文件放入回收站,而是直接删除。

说明:如果在命令中省略文件名,则会给出提示要求在“path[0]”后输入。如果指定的是一个空文件夹,则直接删除,如果文件夹非空,则会要求确认后再进行相应操作。

注意:该命令不能删除具备“只读”、“隐藏”、“系统”属性的文件或文件夹。

举例1:在提示符后输入“remove-item c:\1.xls”命令,将删除C:盘根目录下的1.xls文件。

举例2:假定在C盘有一个“AAA”文件夹且其中存有文件和下级文件夹。

当输入“remove-item aaa”命令时,系统将询问“The item at C:\aaa has children and the -recurse parameter was not specified.If you continue, all children will be removed with the item.Are you sure you want to continue? ”并提供如下选择:

[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help

如果你逐个删除,则按“Y”键,如果要全部删除,则按“A”键,按“N”键则逐个确认不删除,如果全部都不需要删除,则按“L”键。

4.复制文件(夹)——Copy-Item

格式:Copy-Item 源文件(夹) [目标位置] [参数]

别名:cpi、cp、copy

功能:复制文件(夹)到指定的位置。

说明:如果省略目标位置,则将文件复制到当前路径下;如果命令后跟上“-recurse”参数,则在复制一个包含文件的文件夹到目标位置时,会同时复制其中的文件,否则,只复制该文件夹而不包含其中的内容。

举例:如果在C盘中有一名为“AAA”的文件夹,且其中包含有文件,当使用“copy-item c:\aaa d:\”命令时,只会在D盘根目录中复制生成一个名为“AAA”的文件夹。如果跟上“-recurse”参数,则会把C盘AAA文件夹的所有内容复制到D盘的AAA文件夹中。

5.移动文件——Move-Item

格式:Move-Item 源文件名 [目标位置]

别名:mi

功能:移动文件到一个新的位置。

说明:该命令仅能移动文件,而不能移动文件夹。如果在源文件名中使用通配符,则符合该类文件名特征的文件都将被移动。

举例:在提示符后输入“move-item d:\*.doc e:\”命令,可将D盘中的所有扩展名为DOC的文件移动到E盘根目录下。

6.创建文件(夹)——New-Item

格式:New-Item [路径] [文件(夹)名称]

别名:ni

功能:新建一个文件或文件夹。

说明:该命令可用于在指定位置创建一个文件或文件夹。

如果直接在命令中指定文件(夹)名称,则弹出提示要求在“Type”后指定要建立的对象是文件还是文件夹。输入“d”表示创建文件夹,输入“f”表示创建文件。命令完成后将在下面显示才建立的该对象的相关信息。

如果直接输入“new-item”命令,不带任何参数,则在提示信息中必须提供足够的信息才能创建文件或文件夹。在“path[0]”后输入要创建的对象的路径和名称,后面的“path”值可跳过。而当询问“Type”时则要回答“d”或者“f”以便让系统知道是建立文件夹还是文件。

举例:假定系统D盘中存在一个AAA文件夹,则输入“new-item d:\aaa\file.txt”命令,并回答“Type”为“f”后,将在AAA下创建一个大小为0字节的文本文件file.txt。

7.重命名文件(夹)——Rename-Item

格式:Rename-Item [源文件(夹)名] [目标名称]

别名:rmi、ren

功能:对已有的文件(夹)进行更名操作。

举例:在提示符后输入“rename-item c:\aaa bbb”命令,将把C盘中的AAA文件夹更名为BBB。“rename-item e:\aaa\file.txt bbb”命令则把E盘AAA目录下的File.txt改名为BBB。

8.为文本文件增加内容——Add-Content

格式:Add-Content 文本文件名

别名:ac

功能:在指定的文本文件末尾添加文字内容。

说明:执行该命令时,系统会弹出提示要求输入要添加的内容,如果你需要添加,则在value[0]后直接输入,如果有多行文字需要添加,则依次在后面的value[1]、value[2]等后输入,每输入完一行就按回车。如果要结束添加,则直接在value后按回车。

举例:假定在E:盘根目录中有一个空文本文件3.txt,下面的操作可为其添加三行文字。

在提示符后输入“add-content e:\3.txt”或“ac e:3.txt”命令,然后依次序在提示信息中的Value[0]、value[1]、Value[2]后输入文字,最后在value[3]后直接回车返回MSH提示符。用记事本打开该文件可看到添加的内容。

msh4.jpg
为文本文件增加内容

四、“别名”操作

MSH提供了一组命令专用于别名操作,这里特别列出。

1.查看和显示别名——Get-Alias

格式:Get-Alias

别名:gal [别名]

功能:列出系统中的别名和Cmdlet之间的对应关系。

说明:当省略“[别名]”参数时,该命令将详细显示所有别名(包括用户自行创建的别名)和相应命令的对应关系。当带上“[别名]”参数时,可查询该别名对应的命令。

2.设置新别名——Set-Alias

格式:Set-Alias [<新别名>] [<命令>]

别名:sal

功能:为现有别名或命令设置一个新的别名。

说明:系统中已有的别名或许并不符合你的习惯,好在MSH提供了重新设置别名的命令。创建的新别名同样可代替MSH中任何现有的Cmdlet操作。

举例:在提示符后输入“set-alias filelist get-childItem”命令,将为“Get-ChildItem”命令指定一个新的别名“filelist”,则在提示符后输入“get-childitem c:\”和“filelist c:\”的效果相同。

需要注意的是,创建新别名时,不能使用系统保留的默认别名名称,例如,“ac”已经默认为“Add-Content”命令的别名,就不允许将其作为其他命令的别名。但原有的DOS内部命令除外,你可以用“set-alias dir get-date”将DOS的“DIR”设置为查看系统日期命令“Get-Date”的别名,这样,输入“dir”后显示的是系统日期而不再是文件夹下的内容。

注意:设置新别名后,系统默认的别名同样有效,我们只是为某个命令增加了一个新的别名而已。

举例:希望在MSH提示符下输入“word”以启动位于“E:\Program Files\Microsoft Office\OFFICE11\下的“Winword.exe”程序,则需要先为其创建一个别名“word”,创建该别名的命令格式如下:

Set-Alias word "E:\Program Files\Microsoft Office\OFFICE11\winword.exe"

这样,当要运行Word时,只需在提示符后输入“Word”并回车即可。

3.定义新别名——New-Alias

MSH还提供了一个“New-Alias”命令,也可为系统已有的命令或别名再创建新的别名。

格式:New-Alias 新别名 命令或别名

别名:nal

功能:为当前MSH环境创建一个新的别名。

举例:系统已经用“DIR”来做为Get-Childitem命令的别名,现在我们要为它创建一个新的别名“lml”(意为“列目录”),则只要在提示符后输入“new-alias lml dir”并回车即可。这样,输入“lml”和“dir”的效果相同。

注意:设置的新别名只在当前MSH窗口下有效,如果你关闭了MSH窗口后重新进入,或者新打开一个MSH窗口,在前面设置的别名都无效。

4.导出别名列表到文件——Export-Alias

格式:Export-Alias [-Path] 路径 [[-Name] 文件名]

功能:将系统的别名导出为文本文件。

说明:将系统当前的别名对应关系导出为一个文本文件。

举例:使用“export-alias d:\alias.txt”命令,可将系统中所有别名(包含用户自定义的别名)导出到D盘的Alias.txt文件中。生成的文本文件除了头部为说明信息外(每行以#开头),其余各行显示一个别名对应关系,在对应关系中列出了别名、所对应的命令或别名、属性、作用范围等。

说明:导出别名为文本文件后,可在记事本中按照相应格式编辑。

5.导入别名文件——Import-Alias

只要按照要求编写好需要导入的文本文件,便可以使用“Import-Alias”命令将其导入到MSH系统,从而实现不通过New-Alias或Set-Alias命令向系统添加新的别名的目的。

格式:Import-Alias [<文本文件>]

别名:ipal

功能:从文本文件中导入别名到系统中。

说明:如果省略后面的“[文本文件]”参数,则会在命令运行过程中要求输入。由于相比创建的别名只在当前MSH窗口中有效,因此,常备一个包含别名定义的文本文件并在需要是导入系统,是非常有必要的。

五、进程/服务操作

与DOS有很大区别的是,MSH提供了专门用于控制系统进程和系统服务的操作命令。灵活使用这些命令,可以方便地控制系统服务的启动、停止或在系统中安装一个新的服务。

1.查看当前运行的进程——Get-Process

格式:Get-Process

别名:gps、ps

功能:列出当前正在运行的程序进程。在列出的进程中包含句柄、内存占用、CPU占用、进程ID和进程名称等。

2.终止进程的运行——Stop Process

格式:Stop-Process [-ProcessName <进程名>]

别名:spps、kill

功能:终止一个进程的运行。

举例:使用命令“stop-process –ProcessName QQ”,可终止QQ的运行。

3.查看系统服务信息——Get-Service

格式:Get-Service

别名:gsv

功能:显示所有系统服务的名称、显示名称和状态。

4.安装新服务——New-Service

格式:New-Service [-ServiceName] 服务名称 [-PathToExecutable] 可执行文件的路径及文件名 [-DisplayName 显示名称] [-Description 对服务的描述] [-StartupType 启动类型] [-Credential credential]

功能:该命令将在系统中安装一个新的服务。

说明:当你需要在系统中注册一个新的服务时可用该命令,“-StartupType”参数后的启动类型有三种选择,“Automatic”表示系统启动时自动启动该服务(默认选项);“Manual”表示手工启动;“Disabled”禁止该服务启动。如果所安装的服务还需要依赖于其他服务,则要跟上“[-DependsOn 依赖的服务名]”参数部分。

举例:将安装在“E:\Program Files\aaa”中的“aaa.exe”安装为一个系统服务。可在提示符后输入“new-service -ServiceName AAA -PathToExecutable "E:\Program Files\AAA\AAA.exe" -DisplayName AAA -StartupType Automatic”命令。

注意:这里的AAA.exe是虚构的一个文件,要确保某文件能成功安装为服务,在程序编写时就有相应要求,这里没有述及编程要求。

5.重新启动服务——Restart-Service

格式:Restart-Service [<服务名称>]

功能:暂停某个服务并重新启动它。

说明:如果某个服务和另外的服务存在依存关系,则需要先启动与之有依存关系的那些服务。

6.停止服务——Stop-Service

格式:Stop-Service [服务名称]

功能:停止某个正在运行的服务。

7.恢复服务运行——Resume-Service

格式:Resume-Service [<服务名称>]

功能:继续执行某个被暂停的服务。

8.设置服务属性——Set-Service

格式:Set-Service [-ServiceName] 服务名称 [-StartupType 启动类型] [-DisplayName 显示名称] [-Description 服务描述信息]

功能:重新设置某个服务的相关信息,例如,服务名称、启动类型、显示名称以及关于服务的描述性文字等。

举例:在提示符后输入“Set-Service messenger -Description "禁用后就没有垃圾消息来打扰了!"”命令,将更改Messenger服务的描述为“禁用后就没有垃圾消息来打扰了!”。