命令

PowerShell包含大量的命令,用以实现不同的功能。

使用命令

PowerShell命令使用动词-名词的命名方式,命令的结果是对象,显示为文本。

PowerShell命令和参数名称不区分大小写。

Get-ChildItem

PowerShell拥有大量的命令,每个命令也拥有大量的参数,不可能一一说明。

可以通过Get-Help查询命令的详细信息。

Get-Help Get-ChildItem

为命令提供-?参数同样可以获取帮助。

Get-ChildItem -?

Get-Help提供-Examples参数可以获取示例

Get-Help Get-ChildItem -Examples

命令的类型

PowerShell支持多种命令。

命令的类型有:

如果名称有冲突,按照列出的优先级使用。

where在PowerShell中是Where-Object的别名,会屏蔽系统的where.exe,如果想要使用后者,可以使用全名。

function ping
{
    "我的ping函数"
}
ping

自定义的函数屏蔽了ping.exe程序。同样可以使用全名使用后者。

命令的参数

命令可以携带参数。

Get-ChildItem -Filter C:\*.tmp -Recurse

-Filter的参数类型是string字符串,表示过滤字符串。 -Recurse的参数类型是switch开关,表示是否递归搜索。这类参数提供是表示是,不提供表示否,无需提供参数值。

包含特殊字符的参数

Get-ChildItem "C:\Program Files\*.exe"

忽略参数名传参

在使用命令时,可以忽略参数名向其直接传递参数,参数会传根据顺序递给对应的参数。

Get-ChildItem C:\Windows\ *.txt

参数分别传递给了NameFilter

参数别名

参数可能支持别名。比如Get-Process中的Id参数也可以用别名Pid代替。

Get-Process -Pid 4

Get-Help命令使用-Detailed的参数可以查看参数的别名。

参数组

一个命令支持的参数分为多个组,比如查询进程Get-Process命令,既可以使用Id参数查询,也可以通过名称Name来过滤,这两者各是一组参数,但IdName参数不能够同时提供。

Get-Process -Pid 4 -Name System

提示无法使用指定的命名参数解析参数集。

命令包含多个参数组,某些参数只用于特定参数组,而有些参数用于所有参数组。 互相排斥的参数组中的参数不能同时使用。

每个命令都有默认的参数组,在所有用于特定参数组的参数不存在时,会优先使用默认参数组。

在忽略参数名称使用命令是,使用默认参数组。

通过Get-Help可以查看每种使用方式,排在第一位的是默认参数组。

通用参数

所有的命令都支持一些PowerShell预定的通用参数,这些参数可以提供给任何命令,不过不是对于所有命令都有效。

参数名称 类型 说明
Verbose 布尔值 产生操作执行过程更多的细节信息, 有点像跟踪或事务日志. 只有支持生成详细信息的命令该参数才有效
Debug 布尔值 生成面向程序员处理的详细调式信息. 只有支持生成调式信息的命令该参数才有效
ErrorAction 枚举 确定错误出现时采取的行动 允许值: Continue [default], Stop, SilentlyContinue, Inquire
ErrorVariable 字符串 指定在命令执行过程中产生的错误对象保存的变量名称. $error变量会保存相同的错误对象
OutVariable 字符串 指定在命令执行过程中产生的对象保存的变量名称
OutBuffer 32位整形 确定执行管道线中下一个命令前 需要缓存的对象数量

额外的通用参数, 这两个参数只包含在那些会修改系统信息的命令中。 即SupportShouldProcess的命令。

参数名称 类型 说明
WhatIf 布尔值 解释执行命令将产生的各种操作, 但不会实际执行该命令
Confirm 布尔值 执行任何修改系统的操作时, 提示用户, 获得允许后才会执行

看一些执行删除命令会删除那些文件,并不实际操作

rm *.tmp -WhatIf

删除文件,要求用户确认

rm *.tmp -Confirm

别名

为了减少代码量,很多命令都有别名,比如dirGet-ChildItem的别名,pwdGet-Location的别名。

使用别名和使用原命令效果是一致的。

通过Get-Alias命令,可以查询别名。

也可以通过Set-Alias设置别名。别名可以是命令、函数、脚本或可执行文件。

Set-Alias np C:\Windows\System32\notepad.exe

默认情况,别名仅用于当前会话,窗口关闭后别名就失效了。

可以通过Export-Alias命令,将别名导出到文件,下次使用时通过Import-Alias导入,便可以永久使用别名了。

提供程序

PowerShell的提供程序提供了一致的访问数据形式,类似于文件系统驱动器。

PowerShell内置提供程序

提供程序 驱动器 输出类型
别名 Alias Alias: System.Management.Automation.AliasInfo
环境变量 Environment Env: System.Collections.DictionaryEntry
文件系统 FileSystem C:~Z: System.IO.FileInfo,System.IO.DirectoryInfo
函数 Function Function: System.Management.Automation.FunctionInfo
注册表 Registry HKLM: HKCU: Microsoft.Win32.RegistryKey
变量 Variable Variable: System.Management.Automation.PSVariable

提供程序相关命令

命令 功能
Get-PSProvider 查询提供程序

驱动器相关命令

驱动器命令

驱动器命令用来操作驱动器。

命令 功能
Get-PSDrive 查询驱动器
New-PSDrive 创建驱动器,以其他驱动器的某个路径
Remove-PSDrive 删除驱动器

创建驱动器

# 创建HKEY_CLASSES_ROOT跟驱动器
New-PSDrive -Name HKCR -PSProvider Registry -Root HKLM:software\classes
dir HKCR:exefile
# 删除驱动器
Remove-PSDrive HKCR

内容命令

内容项目用来操作驱动器的项目的内容。

命令 别名 功能
Add-Content ac 向项目如文件追加内容
Clear-Content clc 清除项目如文件的内容
Get-Content cat,gc,type 获取项目如文件的内容
Set-Content 设置项目如文件的内容

内容命令示例

Add-Content file.txt "hello" # 追加内容到文件,文件不存在会创建。
Get-Content file.txt # 读取文件内容
${.\file.txt}
Set-Content file.txt # 设置文件内容,覆盖。
Clear-Content file.txt # 清除内容

项目命令

项目命令用来操作驱动器的项目。

命令 别名 功能
Clear-Item cli 清除项目的内容,但不删除项目
Copy-Item copy,cp,cpi 复制项目
Get-Item gi 获取项目,不同驱动器的类型各异
Invoke-Item ii 使用默认行为运行项目
Move-Item mv,move,mi 移动项目
New-Item ni 创建新项目
Remove-Item ri,rm,rmdir,erase,del 删除项目
Rename-Item rni 重命名项目
Set-Item si 设置项目
Get-ChildItem dir,gci,ls 获取子项目
New-Item file.txt # 创建文件
Get-Item file.txt # 获取文件
Get-Item . # 获取当前目录
Invoke-Item file.txt # 使用默认关联程序打开文件
Set-Item -Path alias:np -Value "c:\windows\notepad.exe" # 设置别名
Set-Item -Path env:test "MyValue" # 设置环境变量
dir env:# 查看环境变量

项目属性命令

项目属性命令用来操作项目的属性,如注册表键值。

命令 别名 功能
Clear-ItemProperty clp 清除项目属性
Copy-ItemProperty cpp 复制项目属性
Get-ItemProperty gp 获取项目属性
Move-ItemProperty mp 移动项目属性
New-ItemProperty 创建项目属性
Remove-ItemProperty rnp 删除项目属性
Rename-ItemProperty rp 重命名项目属性
Set-ItemProperty sp 设置项目属性
Get-ItemProperty HKLM:\Software\classes\exefile

位置命令

位置命令用来变更当前驱动器目录。

命令 别名 功能
Get-Location pwd,gl 获取当前驱动器路径
Set-Location cd,chdir,sl 设置当前驱动器路径
Pop-Location pushd 恢复上次保存的当前路径
Push-Location popd 保存当前路径

PowerShell定义名称为文件驱动器A:~Z:的函数,用于切换到对应驱动器。

使用Set-Location切换到不同驱动器时,如果仅仅切换驱动器,下次切换回来时保留上次目录。

pwd # 获取当前目录
cd C:\Windows # 切换目录
C: # 切换到C跟目录

路径命令

路径命令用来操作路径。

命令 别名 功能
Join-Path 链接或查找路径
Convert-Path cvpa PowerShell路径转换到提供程序路径
Split-Path 获取路径的特定部分,如文件名
Resolve-Path rvpa 解析通配符路径
Test-Path 检查路径是否存在
Join-Path .  -ChildPath "Child" # 链接路径
Convert-Path .
Split-Path file.txt -Leaf # 获取文件名
Split-Path -Path "C:\Windows" -Qualifier # 获取驱动器
Resolve-Path "C:\windows\*" # 获取符合通配符路径
Test-Path file.txt # 检查路径

程序命令

Powershell支持程序命令,如ping.exe

ping www.baidu.com

使用旧式的命令结果是字符串,而非对象。

如果要执行当前目录的程序,需要使用.\ping.exe这种格式,否则会找不到程序。

如果执行不是控制台应用程序,会直接运行。

管道

管道是将一个命令的输出结果作为另一个命令的输入参数。

PowerShell使用竖杠|作为管道符。

PowerShell管道传递的是对象。

一个命令的输出结果可能有多个记录,每个记录都会执行管道中的操作。

Get-Process chrome | Kill-Process

查找chrome进程,并将找到的进程结束。

管道将一系列操作串联起来,操作更方便。

传统的命令提示符也支持管道,然而由于结果都是文本,处理其他非常困难,而PowerShell命令的结果都是对象,使用非常方便。

格式化结果

默认的结果是通过预设的格式来显示的结果,我们可以改变他。

Format-Table命令将对象显示为表,别名ft

dir | ft

Format-List命令将对象显示为列表,别名fl

dir | fl

通用管道命令

通用管道命令可以用于任何对象。

排序

Sort-Object命令可以将对象进行排序,别名sort

dir | sort Length

过滤

Where-Object命令可以将对象进行过滤,别名where?

dir | where {$_.Length -gt 1kb}

其中{}中的是代码块,包含过滤逻辑。$_表示当前的对象。

新版本可以不使用代码块,直接输入条件。

dir | where Length -gt 1kb

选择

Select-Object命令可以选择对象的特定属性,别名select

dir | select Name,Length

选择的时候可以使用代码块,获取需要的结果。

Get-Process | select { "$($_.Name)($($_.Id))"}

使用代码块时可以同时设定列名

Get-Process | select @{l="进程信息"; e={ "$($_.Name)($($_.Id))"}}

需要提供一个字典,键名称l,'label'表示标题,值得类型是字符串;键名称e,expression是表达式,值的类型是代码块。

逐个操作

ForEach-Object命令可以对每一条记录进行操作,别名foreach%

dir | foreach {$_.Name}

分组

Group-Object命令可以将记录按照列进行分组,别名group

ps | group name | sort Count -Descending | where Count -gt 1

将字符串作为命令执行

使用&运算符,支持执行没有参数的命令。

&"dir"

使用Invoke-Expression,可以执行任何带参数的命令和任意PowerShell代码。

Invoke-Expression 'ps *qq*'

在使用Invoke-Expression时,为了防止参数中的字符串被进一步解析,建议使用单引号。