从最简单的例子讲起吧。
查看f:/game目录下的文件,可以用dir f:/game,也可以用ls f:/game,还可以用gci f:/game,更可以用Get-ChildItem f:/game。其实,dir或ls就是get-ChildItem的一个Alias。我们可以用Get-Alias查询所有的Alias。或者跟上要查询的Alias,例如,Get-Alias ls。
当然,我们也可以自己设置Alias。怎么用呢?呃。。。。。。我只记得是set-Alias。没关系,我们可以用get-help来查询。get-help set-alias。我当然最好有现成的例子,那就用get-help set-alias -full。
我们就按照例子1的写法,写:
set-alias -name listfiles -value get-childitem。其实,-name 和 -value也可以省略。这样,用listfiles等同于get-chileditem了。
想知道所有的命令,可以用get-command命令。如果想查询set-xxx的命令,可以用get-command -verb set。又如果想查询操作List的命令,可以用get-command -noun list。亦或干脆用通配符,例如,看看哪些命令以“process”结尾的:get-command *process。
还是以dir f:/game为例。假设我们只关心name和length,那么只要get-childitem f:/game|select-object name,length。更进一步,我们想对length排个序:get-childitem f:/game|select-object name,length|sort-object length。如果想要排倒序,最后再加一个参数-desc即可。
管道符“|”用来承接上一命令获取的对象。
又例如,我们想要看看系统的当前进程。用命令get-process。我们要看看进程名为“notepad”的进程。get-process|where-object {$_.ProcessName -eq "notepad"}。又比如,我们要看看sql开头的进程,那么可以打get-process|where-object {$_.ProcessName -match "^sql*"}。支持正则表达式。
或者就用简单方法,get-process sql*。
$_是个特殊的变量,代表对集合中的每一个值进行操作时的那个变量。
现在来个好玩一点,顺便理解下为啥说PowerShell返回的可以是对象。我们开一个计算器calc.exe,然后用PowerShell关闭它。
$calc = Get-Process|where-object {$_.ProcessName -eq "calc"}
或者 $calc = Get-Process calc
Stop-Process $calc.Id
如果calc并不存在会报错,暂时不用理会,先按我们设定的来吧。
当然了,$calc不会只有那么点属性的。既然是对象,那一定也有方法有属性。我们可以用Get-Member来查看。
$calc = Get-Process calc
Get-Member -InputObject $calc
顺便提一句题外话,还有连写的写法,例如:Get-Member -InputObject (Get-Process calc)。
注意到有个Kill方法。我们用$calc.Kill(),哈哈,也关掉了。
我们也可以显示默认不显示的值,比如echo $calc |select-object starttime。当然前提是计算器还是要运行着。