admin 管理员组文章数量: 887021
2024年2月20日发(作者:manufacturer翻译)
PowerShell实例教程
认识PowerShell
介绍和安装
Powershell 是运行在windows机器上实现系统和应用程序管理自动化的命令行脚本环境。你可以把它看成是命令行提示符的扩充,不对,应当是颠覆。
powershell需要.NET环境的支持,同时支持.NET对象。微软之所以将Powershell
定位为Power,并不是夸大其词,因为它完全支持对象。其可读性,易用性,可以位居当前所有shell之首。 当前powershell有四版本,分别为1.0,2.0,3.0 ,4.0
如果您的系统是window7或者Windows Server 2008,那么PowerShell 2.0已经内置了,可以升级为3.0,4.0。
•
如果您的系统是Windows 8 或者Windows server
2012,那么PowerShell 3.0已经内置了,可以升级为4.0。
•
如果您的系统为Windows 8.1或者Windows server
2012 R2,那默认已经是4.0了。
•
自定义控制台
右击标题栏选择”属性”弹出powershell控制台对话框。在这里有四个选项卡:选项、字体、布局和颜色。
“选项”设置光标,历史记录,编辑模式的切换。
控制台选项
“字体”设置字体的名称和大小
控制台字体
“布局”设置窗口的缓冲区、窗口的大小、窗口起始坐标
控制台布局
“颜色”设置屏幕和对话框的背景色和前景色。
控制台颜色
快速编辑模式和标准模式
powershell控制台有两种模式,一个是快速编辑模式,一个是标准模式。
快速编辑模式和标准模式的切换可以通过控制台标题栏->鼠标右击->属性->选项->编辑选项 。
Powershell标准模式
鼠标右击选择标记后才能实现复制和粘切功能。
•
Powershell快速编辑模式
可以通过鼠标左键选择任意矩形区域内的文本,并且鼠标右击实现复制功能。
•
快捷键
Powershell的快捷键和cmd,linux中的shell,都比较像。
ALT+F7 清除命令的历史记录
PgUp PgDn 显示当前会话的第一个命令和最后一个命令
Enter 执行当前命令
End 将光标移至当前命令的末尾
Del 从右开始删除输入的命令字符
Esc 清空当前命令行
F2
自动补充历史命令至指定字符
(例如历史记录中存在Get-Process,按F2,提示"Enter char to copy up
to",键入‘s’,自动补齐命令:Get-Proce)
F4 删除命令行至光标右边指定字符处
F7 对话框显示命令行历史记录
F8 检索包含指定字符的命令行历史记录
F9 根据命令行的历史记录编号选择命令,历史记录编号可以通过F7查看
左/右方向键 左右移动光标
上/下方向键 切换命令行的历史记录
Home 光标移至命令行最左端
Backspace 从右删除命令行字符
Ctrl+C 取消正在执行的命令
Ctrl+左/右方在单词之间移动光标
向键
Ctrl+Home 删除光标最左端的所有字符
Tab 自动补齐命令或者文件名
管道和重定向
管道
把上一条命令的输出作为下一条命令的输入。
PowerShell管道
例如通过ls获取当前目录的所有文件信息,然后通过Sort -Descending对文件信息按照Name降序排列,最后将排序好的文件的Name和Mode格式化成Table输出。
PS C:PStest> ls | sort -Descending Name | Format-Table Name,Mode
Name Mode
---- ----
-a---
-a---
-a---
ABC d----
-a---
重定向
把命令的输出保存到文件中,‘>’为覆盖,’>>’追加。
PS C:PStest> "Powershell Routing" >
PS C:PStest> Get-Content .
Powershell Routing
PS C:PStest> "Powershell Routing" >>
PS C:PStest> "Powershell Routing" >>
PS C:PStest> "Powershell Routing" >>
PS C:PStest> "Powershell Routing" >>
PS C:PStest> "Powershell Routing" >>
PS C:PStest> Get-Content .
Powershell Routing
Powershell Routing
Powershell Routing
Powershell Routing
Powershell Routing
Powershell Routing
PS C:PStest>
Powershell交互式
数学运算
我们可以把powershell当成一个计算器。象键入命令行那样输入数学表达式,回车,powershell会自动计算并把结果输出。常用的加减乘除模(+,-,*,/,%)运算和小括号表达式都支持。
PS C:pstest> 1+2+3
6
PS C:pstest> 0xABCD
43981
PS C:pstest> 3.14*10*10
314
PS C:pstest> 1+3-(2.4-5)*(7.899-4.444)
12.983
PowerShell也能自动识别计算机容量单位,包括KB,MB,GB,TB,PB
PS C:pstest> 1pb/1tb
1024
PS C:pstest> 1tb/1gb
1024
PS C:pstest> 1gb/1kb
1048576
PS C:pstest> 1gb/20mb*10kb
524288
假如一个网站每个页面大小为80kb,统计显示每天的PV操作为800,1个月下来占用的带宽:
PS C:pstest> 80kb*800*30/1gb
1.8310546875
假如一个网站的每天人均PV操作为5,页面大小为80Kb,主机提供商限制的总流量为10G,那平均每天的最大访客数
为:
PS C:pstest> 10GB/(80KB*5)/30
873.8
执行外部命令
Powershell 能够像CMD一样很好的执行外部命令。
通过netstat查看网络端口状态
PS C:PS> netstat
Active Connections
Proto Local Address Foreign Address State
TCP 192.168.0.100:3049 192.168.0.88:7575 ESTABLISHED
TCP 192.168.0.100:3052 192.168.0.88:7575 ESTABLISHED
TCP 192.168.0.100:3061 192.168.0.88:7575 ESTABLISHED
通过IPConfig查看自己的网络配置
PS C:PS> ipconfig
Windows IP Configuration
Ethernet adapter Local Area Connection:
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::b9dd:91e33:33f0:7885%10
IPv4 Address. . . . . . . . . . . : 192.168.140.100
Subnet Mask . . . . . . . . . . . : 255.255.252.0
Default Gateway . . . . . . . . . : 192.168.140.1
Tunnel adapter :
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::5efe:192.168.140.100%11
Default Gateway . . . . . . . . . :
Tunnel adapter Teredo Tunneling Pseudo-Interface:
Media State . . . . . . . . . . . : Media disconnected
Connection-specific DNS Suffix . :
route print查看路由信息
PS C:PS> route print
IPv4 Route Table
===========================================================================
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 192.168.140.1 192.168.140.100 20
192.0.0.0 255.0.0.0 On-link 192.0.0.1 306
192.0.0.1 255.255.255.255 On-link 192.0.0.1 306
192.255.255.255 255.255.255.255 On-link 192.0.0.1 306
192.168.140.0 255.255.252.0 On-link 192.168.140.100 276
192.168.140.100 255.255.255.255 On-link 192.168.140.100 276
192.168.143.255 255.255.255.255 On-link 192.168.140.100 276
224.0.0.0 240.0.0.0 On-link 192.0.0.1 306
224.0.0.0 240.0.0.0 On-link 192.168.140.100 276
255.255.255.255 255.255.255.255 On-link 192.0.0.1 306
255.255.255.255 255.255.255.255 On-link 192.168.140.100 276
===========================================================================
Persistent Routes:
None
IPv6 Route Table
===========================================================================
Active Routes:
If Metric Network Destination Gateway
1 306 ::1/128 On-link
10 276 fe80::/64 On-link
11 281 fe80::5efe:192.168.140.100/128
On-link
10 276 fe80::b965:91f3:33a0:7285/128
On-link
1 306 ff00::/8 On-link
10 276 ff00::/8 On-link
===========================================================================
Persistent Routes:
None
启动CMD控制台
启动CMD控制台键入cmd或者,退出cmd可以通过命令exit。
PS C:PS> cmd
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
C:PS>exit
PS C:PS>
查找可用的Cmd控制台命令
通过 /c 来接收命令参数,在Cmd中help可以查看可用的命令,所以可以通过Cmd /c help 查找可用的Cmd控制台命令
PS C:PS> cmd /c help
有关某个命令的详细信息,请键入 HELP 命令名
ASSOC 显示或修改文件扩展名关联。
ATTRIB 显示或更改文件属性。
BREAK 设置或清除扩展式 CTRL+C 检查。
BCDEDIT 设置启动数据库中的属性以控制启动加载。
CACLS 显示或修改文件的访问控制列表(ACL)。
CALL 从另一个批处理程序调用这一个。
CD 显示当前目录的名称或将其更改。
CHCP 显示或设置活动代码页数。
CHDIR 显示当前目录的名称或将其更改。
CHKDSK 检查磁盘并显示状态报告。
CHKNTFS 显示或修改启动时间磁盘检查。
CLS 清除屏幕。
CMD 打开另一个 Windows 命令解释程序窗口。
COLOR 设置默认控制台前景和背景颜色。
COMP 比较两个或两套文件的内容。
COMPACT 显示或更改 NTFS 分区上文件的压缩。
CONVERT 将 FAT 卷转换成 NTFS。您不能转换
当前驱动器。
COPY 将至少一个文件复制到另一个位置。
DATE 显示或设置日期。
DEL 删除至少一个文件。
DIR 显示一个目录中的文件和子目录。
DISKCOMP 比较两个软盘的内容。
DISKCOPY 将一个软盘的内容复制到另一个软盘。
DISKPART 显示或配置磁盘分区属性。
DOSKEY 编辑命令行、调用 Windows 命令并创建宏。
DRIVERQUERY 显示当前设备驱动程序状态和属性。
ECHO 显示消息,或将命令回显打开或关上。
ENDLOCAL 结束批文件中环境更改的本地化。
ERASE 删除一个或多个文件。
EXIT 退出 程序(命令解释程序)。
FC 比较两个文件或两个文件集并显示它们之间的不同。
FIND 在一个或多个文件中搜索一个文本字符串。
FINDSTR 在多个文件中搜索字符串。
FOR 为一套文件中的每个文件运行一个指定的命令。
FORMAT 格式化磁盘,以便跟 Windows 使用。
FSUTIL 显示或配置文件系统的属性。
FTYPE 显示或修改用在文件扩展名关联的文件类型。
GOTO 将 Windows 命令解释程序指向批处理程序
中某个带标签的行。
GPRESULT 显示机器或用户的组策略信息。
GRAFTABL 启用 Windows 在图形模式显示扩展字符集。
HELP 提供 Windows 命令的帮助信息。
ICACLS 显示、修改、备份或还原文件和
目录的 ACL。
IF 在批处理程序中执行有条件的处理过程。
LABEL 创建、更改或删除磁盘的卷标。
MD 创建一个目录。
MKDIR 创建一个目录。
MKLINK 创建符号链接和硬链接
MODE 配置系统设备。
MORE 逐屏显示输出。
MOVE 将一个或多个文件从一个目录移动到另一个目录。
OPENFILES 显示远程用户为了文件共享而打开的文件。
PATH 为可执行文件显示或设置搜索路径。
PAUSE 停止批处理文件的处理并显示信息。
POPD 还原由 PUSHD 保存的当前目录上一次的值。
PRINT 打印一个文本文件。
PROMPT 改变 Windows 命令提示。
PUSHD 保存当前目录,然后对其进行更改。
RD 删除目录。
RECOVER 从损坏的磁盘中恢复可读取的信息。
REM 记录批处理文件或 中的注释。
REN 重新命名文件。
RENAME 重新命名文件。
REPLACE 替换文件。
RMDIR 删除目录。
ROBOCOPY 复制文件和目录树的高级实用程序
SET 显示、设置或删除 Windows 环境变量。
SETLOCAL 开始用批文件改变环境的本地化。
SC 显示或配置服务(后台处理)。
SCHTASKS 安排命令和程序在一部计算机上按计划运行。
SHIFT 调整批处理文件中可替换参数的位置。
SHUTDOWN 让机器在本地或远程正确关闭。
SORT 将输入排序。
START 打开单独视窗运行指定程序或命令。
SUBST 将驱动器号与路径关联。
SYSTEMINFO 显示机器的具体的属性和配置。
TASKLIST 显示包括服务的所有当前运行的任务。
TASKKILL 终止正在运行的进程或应用程序。
TIME 显示或设置系统时间。
TITLE 设置 会话的窗口标题。
TREE 以图形显示启动器或路径的目录结构。
TYPE 显示文本文件的内容。
VER 显示 Windows 的版本。
VERIFY 告诉 Windows 验证文件是否正确写入磁盘。
VOL 显示磁盘卷标和序列号。
XCOPY 复制文件和目录树。
WMIC 在交互命令外壳里显示 WMI 信息。
启动外部程序
为什么可以通过notpad打开记事本,不能通过wordpad打开写字板?
因为位于C:Windowssystem32 这个目录,而这个目录已经默认被包含在Powershell的环境变量$env:Path中。
C:WINDOWSsystem32;C:WINDOWS;C:WINDOWSSystem32Wbem;C:WINDOWSSystem32WindowsPowerShellv1.0;C:Program Files (x
86)Windows Kits8.1Windows Performance Toolkit;C:Program FilesMicrosoft SQL
Server110ToolsBinn;C:Program File
s (x86)Microsoft SDKsTypeScript1.0;C:Program FilesMicrosoftWeb Platform
Installer
而 所在的“%ProgramFiles%Windows
“目录却没有包含,可以先进入这个目录,再运行wordpad,或者将wordpad所在的目录加入到环境变量中,$env:Path=$env:Path+”%ProgramFiles%Windows NTAccessories”。
默认键入一个字符串,powershell会将它原样输出,如果该字符串是一个命令或者启动程序,在字符串前加‘&’可以执行命令,或者启动程序。
PS C:PS> "ls"
ls
PS C:PS> &"ls"
Directory: C:PS
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2011/11/23 17:25 ABC
-a--- 2011/11/23 17:36 14
-a--- 2011/11/23 17:25 0
-a--- 2011/11/23 17:25 0
-a--- 2011/11/23 17:25 0
-a--- 2011/11/23 17:37 242
PS C:PS> ""
PS C:PS> &""
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
命令集 cmdlets
cmdlets是Powershell的内部命令,cmdlet的类型名为Info,包含下列属性和方法:
Name
Equals
MemberTyDefinition
pe
Method bool Equals( obj)
int GetHashCode()
type GetType()
string ToString()
dTypes
{get;}
DefaultParameterSet {get;}
CommandType
GetHashCodMethod
e
GetType
ToString
Method
Method
CommandTypProperte y
DefaultParPropertameterSet y
Definition
Property
Property
Definition {get;}
HelpFile HelpFile {get;}
ImplementiPropertngType y
Module
Property
Property
Property
Property
ImplementingType {get;}
leInfo Module {get;}
ModuleName ModuleName {get;}
Name Name {get;}
Noun Noun {get;}
lyCollection`1[[Name,
tion, Version=1.0.0.0,
Culture=neutral, PublicKeyToken=31bf3856ad364e35]]
OutputType
Property
OutputType {get;}
nary`2[[,
mscorlib, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089],[terMetadata, tion,
Version=1.0.0.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35]] Parameters {get;}
lyCollection`1[[dParameterSetInfo,
tion, Version=1.0.0.0,
Culture=neutral, PublicKeyToken=31bf3856ad364e35]]
ParameterSets {get;}
InInfo PSSnapIn {get;}
Parameters
Property
ParameterSPropertets y
PSSnapIn
Property
Property
Property
Verb Verb {get;}
nStateEntryVisibility
Visibility {get;set;}
DLL
Visibility
DLL
roperty {get=$on;}
HelpUri
HelpUri {get=try
{
# ok to cast CommandTypes enum to HelpCategory because
string/indentifier for
# cmdlet,function,filter,alias,externalscript is
identical.
# it is ok to fail for other enum values (i.e. for
Application)
ScriptP$helpObject = get-help -Name ($) -Category
roperty ([string]($dType)) -ErrorAction
SilentlyContinue# return first non-null uri (and try not to
hit any strict mode things)
if ($helpObject -eq $null) { return $null }
if ($ties[‘relatedLinks’] -eq
$null) { return $null }
if
($ties[‘navigationLink’] -eq $null) { return $null }
$helpUri =
[string]$( $tionLink | %{ if
($_.ties[‘uri’] -ne $null) { $_.uri } }
| ?{ $_ } | select -first 1 )
return $helpUri
}
catch {};}
下面是全部的Cmdlets命令
每个命令有一个动词和名词组成,命令的作用一目了然。
Name
Add-Computer
Add-Content
Add-History
Add-Member
Add-PSSnapin
Add-Type
Checkpoint-Computer
Clear-Content
Clear-EventLog
Clear-History
Clear-Item
Clear-ItemProperty
Clear-Variable
Compare-Object
Complete-Transaction
Connect-WSMan
ConvertFrom-Csv
ConvertFrom-SecureString
ConvertFrom-StringData
ModuleName
ment
ment
y
y
ment
ment
ment
ment
ment
y
y
ment
ment
y
ty
y
Help
helphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelp
Convert-Path
ConvertTo-Csv
ConvertTo-Html
ConvertTo-SecureString
ConvertTo-Xml
Copy-Item
Copy-ItemProperty
Debug-Process
Disable-ComputerRestore
Disable-PSBreakpoint
Disable-PSSessionConfiguration
Disable-WSManCredSSP
Disconnect-WSMan
Enable-ComputerRestore
Enable-PSBreakpoint
Enable-PSRemoting
Enable-PSSessionConfiguration
Enable-WSManCredSSP
Enter-PSSession
Exit-PSSession
Export-Alias
Export-Clixml
Export-Console
Export-Counter
Export-Csv
ment
y
y
ty
y
ment
ment
ment
ment
y
ment
ment
ment
y
ment
y
y
stics
y
helphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelp
Export-FormatData
Export-ModuleMember
Export-PSSession
ForEach-Object
Format-Custom
Format-List
Format-Table
Format-Wide
Get-Acl
Get-Alias
Get-AuthenticodeSignature
Get-ChildItem
Get-Command
Get-ComputerRestorePoint
Get-Content
Get-Counter
Get-Credential
Get-Culture
Get-Date
Get-Event
Get-EventLog
Get-EventSubscriber
Get-ExecutionPolicy
Get-FormatData
Get-Help
y
y
y
y
y
y
ty
y
ty
ment
ment
ment
stics
ty
y
y
y
ment
y
ty
y
helphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelp
Get-History
Get-Host
Get-HotFix
Get-Item
Get-ItemProperty
Get-Job
Get-Location
Get-Member
Get-Module
Get-PfxCertificate
Get-Process
Get-PSBreakpoint
Get-PSCallStack
Get-PSDrive
Get-PSProvider
Get-PSSession
Get-PSSessionConfiguration
Get-PSSnapin
Get-Random
Get-Service
Get-TraceSource
Get-Transaction
Get-UICulture
Get-Unique
Get-Variable
y
ment
ment
ment
ment
y
ty
ment
y
y
ment
ment
y
ment
y
ment
y
y
y
helphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelp
Get-WinEvent
Get-WmiObject
Get-WSManCredSSP
Get-WSManInstance
Group-Object
Import-Alias
Import-Clixml
Import-Counter
Import-Csv
Import-LocalizedData
Import-Module
Import-PSSession
Invoke-Command
Invoke-Expression
Invoke-History
Invoke-Item
Invoke-WmiMethod
Invoke-WSManAction
Join-Path
Limit-EventLog
Measure-Command
Measure-Object
Move-Item
Move-ItemProperty
New-Alias
stics
ment
ment
ment
y
y
y
stics
y
y
y
y
ment
ment
ment
ment
ment
y
y
ment
ment
y
helphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelp
New-Event
New-EventLog
New-Item
New-ItemProperty
New-Module
New-ModuleManifest
New-Object
New-PSDrive
New-PSSession
New-PSSessionOption
New-Service
New-TimeSpan
New-Variable
New-WebServiceProxy
New-WSManInstance
New-WSManSessionOption
Out-Default
Out-File
Out-GridView
Out-Host
Out-Null
Out-Printer
Out-String
Pop-Location
Push-Location
y
ment
ment
ment
y
ment
ment
y
y
ment
ment
ment
y
y
y
y
y
y
y
ment
ment
helphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelp
Read-Host
Receive-Job
Register-EngineEvent
Register-ObjectEvent
Register-PSSessionConfiguration
Register-WmiEvent
Remove-Computer
Remove-Event
Remove-EventLog
Remove-Item
Remove-ItemProperty
Remove-Job
Remove-Module
Remove-PSBreakpoint
Remove-PSDrive
Remove-PSSession
Remove-PSSnapin
Remove-Variable
Remove-WmiObject
Remove-WSManInstance
Rename-Item
Rename-ItemProperty
Reset-ComputerMachinePassword
Resolve-Path
Restart-Computer
y
y
y
ment
ment
y
ment
ment
ment
y
ment
y
ment
ment
ment
ment
ment
ment
ment
helphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelp
Restart-Service
Restore-Computer
Resume-Service
Select-Object
Select-String
Select-Xml
Send-MailMessage
Set-Acl
Set-Alias
Set-AuthenticodeSignature
Set-Content
Set-Date
Set-ExecutionPolicy
Set-Item
Set-ItemProperty
Set-Location
Set-PSBreakpoint
Set-PSDebug
Set-PSSessionConfiguration
Set-Service
Set-StrictMode
Set-TraceSource
Set-Variable
Set-WmiInstance
Set-WSManInstance
ment
ment
ment
y
y
y
y
ty
y
ty
ment
y
ty
ment
ment
ment
y
ment
y
y
ment
ment
helphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelp
Set-WSManQuickConfig
Show-EventLog
Sort-Object
Split-Path
Start-Job
Start-Process
Start-Service
Start-Sleep
Start-Transaction
Start-Transcript
Stop-Computer
Stop-Job
Stop-Process
Stop-Service
Stop-Transcript
Suspend-Service
Tee-Object
Test-ComputerSecureChannel
Test-Connection
Test-ModuleManifest
Test-Path
Test-WSMan
Trace-Command
Undo-Transaction
Unregister-Event
ment
ment
y
ment
ment
ment
y
ment
ment
ment
ment
ment
y
ment
ment
ment
ment
y
ment
y
helphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelp
Unregister-PSSessionConfiguration
Update-FormatData
Update-List
Update-TypeData
Use-Transaction
Wait-Event
Wait-Job
Wait-Process
Where-Object
Write-Debug
Write-Error
Write-EventLog
Write-Host
Write-Output
Write-Progress
Write-Verbose
Write-Warning
y
y
y
ment
y
ment
y
y
ment
y
y
y
y
y
helphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelphelp别名
cmdlet 的名称由一个动词和一个名词组成,其功能对用户来讲一目了然。但是对于一个经常使用powershell命令的人每天敲那么多命令也很麻烦啊。能不能把命令缩短一点呢?于是“别名”就应运而生了。Powershell内部也实现了很多常用命令的别名。例如Get-ChildItem,列出当前的子文件或目录。它有两个别名:ls 和 dir,这两个别名来源于unix 的shell和windows的cmd。
因此别名有两个作用:
•
•
继承:继承unix-shell和windows-cmd。
方便:方便用户使用。
处理别名:
查询别名所指的真实cmdlet命令。
PS C:PS> Get-Alias -name ls
CommandType Name Definition
----------- ---- ----------
Alias ls Get-ChildItem
PS C:PS> Get-Alias -name dir
CommandType Name Definition
----------- ---- ----------
Alias dir Get-ChildItem
PS C:PS> Get-Alias -name fl
CommandType Name Definition
----------- ---- ----------
Alias fl Format-List
PS C:PS> Get-Alias -name ft
CommandType Name Definition
----------- ---- ----------
Alias ft Format-Table
查看可用的别名
查看可用的别名,可以通过” ls alias:” 或者 ”Get-Alias“
如何查看所有以Remove打头的cmdlet的命令的别名呢?
PS C:PS> dir alias: | where {$_.with("Remove")}
CommandType Name Definition
----------- ---- ----------
Alias del Remove-Item
Alias erase Remove-Item
Alias rbp
Remove-PSBreakpoint
Alias rd Remove-Item
Alias rdr Remove-PSDrive
Alias ri Remove-Item
Alias rjb Remove-Job
Alias rm Remove-Item
Alias rmdir Remove-Item
Alias rmo Remove-Module
Alias rp
Remove-ItemProperty
Alias rsn
Remove-PSSession
Alias rsnp Remove-PSSnapin
Alias rv Remove-Variable
Alias rwmi
Remove-WMIObject
说明:dir alias:获取的是别名的数组,通过where对数组元素进行遍历,$_代表当前元素,alias的Definition为String类型,因为powershell支持.net,.net中的string类有一个方法Startswith。通过where过滤集合在powershell中使用非常广泛。
有的cmdlet命令可能有2-3个别名,我们可以通过下面的命令查看所有别名和指向cmdlet的别名的个数。
PS C:PS> ls alias: | Group-Object definition | sort -Descending Count
Count Name Group
----- ---- -----
6 Remove-Item {del, erase, rd, ri...}
3 Set-Location {cd, chdir, sl}
3 Get-History {ghy, h, history}
3 Get-ChildItem {dir, gci, ls}
3 Get-Content {cat, gc, type}
3 Move-Item {mi, move, mv}
3 Copy-Item {copy, cp, cpi}
2 Start-Process {saps, start}
2 Set-Variable {set, sv}
2 Write-Output {echo, write}
2 Get-Process {gps, ps}
2 Invoke-History {ihy, r}
2 New-PSDrive {mount, ndr}
2 Stop-Process {kill, spps}
2 Rename-Item {ren, rni}
2 Get-Location {gl, pwd}
2 Compare-Object {compare, diff}
2 Where-Object {?, where}
2 ForEach-Object {%, foreach}
2 Clear-Host {clear, cls}
1 Out-Host {oh}
1 New-PSSession {nsn}
1 New-Variable {nv}
1 Out-GridView {ogv}
1 Pop-Location {popd}
1 Tee-Object {tee}
1 Remove-PSBreakpoint {rbp}
1 Receive-Job {rcjb}
1 Push-Location {pushd}
1 mkdir {md}
1 Measure-Object {measure}
1 help {man}
1 Remove-PSSnapin {rsnp}
1 Out-Printer {lp}
1 New-Item {ni}
1 New-Module {nmo}
1 New-Alias {nal}
1 Move-ItemProperty {mp}
1 Wait-Job {wjb}
1 Remove-PSDrive {rdr}
1 Start-Service {sasv}
1 Set-PSBreakpoint {sbp}
1 Set-ItemProperty {sp}
1 Start-Job {sajb}
1 Set-Alias {sal}
1 Start-Sleep {sleep}
1 Set-Item {si}
1 Select-Object {select}
1 Set-Content {sc}
1 Sort-Object {sort}
1 Remove-WMIObject {rwmi}
1 Remove-Module {rmo}
1 Rename-ItemProperty {rnp}
1 Stop-Service {spsv}
1 Set-WMIInstance {swmi}
1 Remove-Job {rjb}
1 Remove-Variable {rv}
1 Resolve-Path {rvpa}
1 Stop-Job {spjb}
1 Remove-ItemProperty {rp}
1 Remove-PSSession {rsn}
1 Exit-PSSession {exsn}
1 Format-Custom {fc}
1 Enter-PSSession {etsn}
1 Export-Csv {epcsv}
1 Export-PSSession {epsn}
1 Format-List {fl}
1 Get-PSBreakpoint {gbp}
1 Get-Command {gcm}
1 Get-Alias {gal}
1 Format-Table {ft}
1 Format-Wide {fw}
1 Export-Alias {epal}
1 Clear-History {clhy}
1 Clear-Item {cli}
1 Clear-Content {clc}
1 Add-Content {ac}
1 Add-PSSnapIn {asnp}
1 Clear-ItemProperty {clp}
1 Disable-PSBreakpoint {dbp}
1 Enable-PSBreakpoint {ebp}
1 Convert-Path {cvpa}
1 Clear-Variable {clv}
1 Copy-ItemProperty {cpp}
1 Invoke-Expression {iex}
1 Invoke-Item {ii}
1 Invoke-Command {icm}
1 Get-Variable {gv}
1 Get-WmiObject {gwmi}
1 Import-Alias {ipal}
1 powershell_ {ise}
1 Invoke-WMIMethod {iwmi}
1 Import-PSSession {ipsn}
1 Import-Csv {ipcsv}
1 Import-Module {ipmo}
1 Get-Unique {gu}
1 Get-Job {gjb}
1 Get-Member {gm}
1 Get-Item {gi}
1 Get-PSCallStack {gcs}
1 Get-PSDrive {gdr}
1 Get-Module {gmo}
1 Get-PSSnapIn {gsnp}
1 Get-Service {gsv}
1 Get-PSSession {gsn}
1 Get-ItemProperty {gp}
1 Group-Object {group}
创建自己的别名
给记事本创建一个别名,并查看该别名;
PS C:PS> Set-Alias -Name Edit -Value notepad
PS C:PS> Edit
PS C:PS> $alias:Edit
notepad
删除自己的别名
别名不用删除,自定义的别名在powershell退出时会自动清除。但是请放心,powershell内置别名(诸如ls,dir,fl等)不会清除。如果你非得手工删除别名。请使用
PS C:PS> del alias:Edit
保存自己的别名
可以使用Export-Alias将别名导出到文件,需要时再通过Import-Alias导入。但是导入时可能会有异常,提示别名已经存在无法导入:
PS C:PS> Import-Alias 1
Import-Alias : Alias not allowed because an alias with the name 'ac' already exists.
At line:1 char:13
+ Import-Alias <<<< 1
+ CategoryInfo : ResourceExists: (ac:String) [Import-Alias],
SessionStateException
+ FullyQualifiedErrorId :
AliasAlreadyExists,AliasCommand
这时可以使用Force强制导入。
PS C:PS> Export-Alias 1
PS C:PS> Import-Alias -Force 1
通过函数扩展别名
在Powershell中设置别名的确方便快捷,但是在设置别名的过程中并设置参数的相关信息。尽管别名会自动识别参数,但是如何把经常使用的参数默认设定在别名里面呢?例如Test-Connection -Count 2 -ComputerName,让-“-Count 2”
固化在别名中。
这时简单的别名无法完成上述需求,可以通过函数来完成它,并且一旦把函数拉过来,定义别名会变得更加灵活。
PS C:PS> function test-conn { Test-Connection -Count 2 -ComputerName $args}
PS C:PS> Set-Alias tc test-conn
PS C:PS> tc localhost
Bytes Time(ms)
----- --------
test-me-01 localhost 127.0.0.1 ::1
32 0
test-me-01 localhost 127.0.0.1 ::1
32 0
有了函数牵线,别名可以完成更高级更强大的功能,其中$args为参数的占位符。
执行文件和脚本
象运行可执行文件一样,Powershell运行文件和脚本,也必须使用绝对路径或者相对路径,或者要运行的文件必须定义在可受信任的环境变量中。
关于脚本
脚本和批处理都属于伪可执行文件,它们只是包含了若干命令行解释器能够解释和执行的命令行代码。
执行批处理文件
批处理是扩展名为”.bat”的文本文件,它可以包含任何cmd控制台能够处理的命令。当批处理文件被打开,Cmd控制台会逐行执行每条命令。那Powershell能够直接执行批处理吗?
将下列命令保存为
@echo off
echo batch File Test
pause
Dir %windir%/system
然后执行ping
屏幕会打印ping命令帮助,说明调用的ping cmd 而不是。
改为:
PS C:PS> ./ping
batch File Test
Press any key to continue . . .
Volume in drive C has no label.
Volume Serial Number is 4E9B-D846
Directory of C:Windowssystem
2009/06/11 05:21 69,584
2009/06/11 05:21 109,456
2009/07/14 05:41 32,816
2009/07/14 05:41 2,000
2009/06/11 05:42 9,936
2009/06/11 05:21 73,376
2009/06/11 05:21 25,264
2009/06/11 05:21 28,160
2009/07/14 05:41 68,992
2009/07/14 05:41 1,152
2009/07/14 05:41 2,032
2009/06/11 05:21 126,912
2009/06/11 05:42 82,944
2009/07/14 05:41 24,064
2009/07/14 05:41 5,120
2009/07/14 05:41 1,744
2009/06/11 05:25 5,532
2009/07/14 05:41 3,360
2009/07/14 05:41 4,048
2009/06/11 05:42 9,008
2009/07/14 05:41 2,176
2009/07/14 05:41 12,704
22 File(s) 700,380 bytes
2 Dir(s) 75,927,420,928 bytes free
这时运行的是批处理。
通过cmd进入cmd控制台输入ping发现执行的不是ping命令,而是直接运行 ,也就是说可以通过.bat 覆盖cmd命令。这种机制很危险,如果有人侵入电脑,并将系统内部命令篡改成自己批处理,那就太悲剧了。 这种命令与脚本的混淆不会发生在powershell中,因为powershell有更安全的机制。
执行VB脚本文件
将下列命令保存为
Set wmi = GetObject("winmgmts:")
Set collection = ery("select * from Win32_Process")
For Each process in collection
ectText_
Next
执行 . 会遍历当前Win32进程,并把每个进程的详细信息通过窗口显示出来。
怎样让VB脚本的通过控制台输出呢?
Wscript //H:CScript
怎样还原VB脚本通过窗口输出呢?
WScript //H:WScript
在powershell中执行VB脚本
PS C:PS> .
Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation. All rights reserved.
instance of Win32_Process
{
Caption = "System Idle Process";
CreationClassName = "Win32_Process";
CSCreationClassName = "Win32_ComputerSystem";
CSName = "test-me-01";
Description = "System Idle Process";
Handle = "0";
HandleCount = 0;
KernelModeTime = "484113379271";
Name = "System Idle Process";
OSCreationClassName = "Win32_OperatingSystem";
OSName = "Microsoft Windows 7 Enterprise
|C:Windows|DeviceHarddisk0Partition2";
OtherOperationCount = "0";
OtherTransferCount = "0";
PageFaults = 0;
PageFileUsage = 0;
ParentProcessId = 0;
PeakPageFileUsage = 0;
PeakVirtualSize = "0";
PeakWorkingSetSize = 0;
Priority = 0;
PrivatePageCount = "0";
ProcessId = 0;
QuotaNonPagedPoolUsage = 0;
QuotaPagedPoolUsage = 0;
QuotaPeakNonPagedPoolUsage = 0;
QuotaPeakPagedPoolUsage = 0;
ReadOperationCount = "0";
ReadTransferCount = "0";
SessionId = 0;
ThreadCount = 2;
UserModeTime = "0";
VirtualSize = "0";
WindowsVersion = "6.1.7601";
WorkingSetSize = "24576";
WriteOperationCount = "0";
WriteTransferCount = "0";
};
执行powershell脚本
Powershell拥有自己的脚本,扩展名为“.ps1”
PS C:PS> echo "dir;Get-PSProvider;help dir" >1
PS C:PS> Get-Content ./1
dir;Get-PSProvider;help dir
PS C:PS> ./1
初次执行脚本时,可能会碰到一个异常:
File ” C:1″ cannot be loaded because the
execution of scripts is disabled on this system. Please see
“get-help about_signing” for more details.
At line:1 char:10
+ .1 <<<<
这是powershell的默认安全设置禁用了执行脚本,要启用这个功能需要拥有管理员的权限。
Powershell调用入口的优先级
别名:控制台首先会寻找输入是否为一个别名,如果是,执行别名所指的命令。因此我们可以通过别名覆盖任意powershell命令,因为别名的优先级最高。
函数:如果没有找到别名,会继续寻找函数,函数类似别名,只不过它包含了更多的powershell命令。因此可以自定义函数扩充cmdlet 把常用的参数给固化进去。
命令:如果没有找到函数,控制台会继续寻找命令,即cmdlet,powershell的内部命令。
脚本:没有找到命令,继续寻找扩展名为“.ps1”的Powershell脚本。
文件:没有找到脚本,会继续寻找文件,如果没有可用的文件,控制台会抛出异常。
The term ‘now’ is not recognized as the name of a cmdlet, function,
script file, or operable program. Chec
g of the name, or if a path was included, verify that the path is correct
and try again.
At line:1 char:4
+ now <<<<
+ CategoryInfo : ObjectNotFound: (now:String) [],
CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
变量
定义变量
变量可以临时保存数据,因此可以把数据保存在变量中,以便进一步操作。
#定义变量
$a=10
$b=4
#计算变量
$result=$a*$b
$msg="保存文本"
#输出变量
$result
$msg
40
保存文本
powershell 不需要显示地去声明,可以自动创建变量,只须记住变量的前缀为$.
创建好了变量后,可以通过变量名输出变量,也可以把变量名存在字符串中。但是有个例外单引号中的字符串不会识别和处理变量名。
选择变量名
在powershell中变量名均是以美元符”$”开始,剩余字符可以是数字、字母、下划线的任意字符,并且powershell变量名大小写不敏感($a和$A 是同一个变量)。
某些特殊的字符在powershell中有特殊的用途,一般不推荐使用这些字符作为变量名。当然你硬要使用,请把整个变量名后缀用花括号括起来。
PS C:test> ${"I"like $}="mossfly"
PS C:test> ${"I"like $}
mossfly
赋值和返回值
赋值操作符为“=”,几乎可以把任何数据赋值给一个变量,甚至一条cmdlet命令
,为什么,因为Powershell支持对象,对象可以包罗万象。
PS C:test> $item=Get-ChildItem .
PS C:test> $item
Directory: C:test
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2011/11/23 17:25 ABC
-a--- 2011/11/24 18:30 67580
-a--- 2011/11/24 20:04 26384
-a--- 2011/11/24 20:26 12060 alias
-a--- 2011/11/24 20:27 12060 1
-a--- 2011/11/23 17:25 0
-a--- 2011/11/23 17:25 0
-a--- 2011/11/23 17:25 0
-a--- 2011/11/25 11:20 556
-a--- 2011/11/24 17:37 7420
-a--- 2011/11/28 15:30 63
-a--- 2011/11/24 17:44 735892 Powershell_
-a--- 2011/11/28 17:03 60 1
-a--- 2011/11/23 17:37 242
-a--- 2011/11/28 16:42 170
PS C:test> $result=3000*(1/12+0.0075)
PS C:test> $result
272.5
给多个变量同时赋值
赋值操作符不仅能给一个变量赋值,还可以同时给多个变量赋相同的值。
PS C:test> $a=$b=$c=123
PS C:test> $a
123
PS C:test> $b
123
PS C:test> $c
123
交换变量的值
要交换两个变量的值,传统的程序语言至少需要三步,并且还需定义一个中间临时变量。
$Value1 = 10
$Value2 = 20
$Temp = $Value1
$Value1 = $Value2
$Value2 = $Temp
在powershell中,交换两个变量的值,这个功能变得非常简单。
PS C:test> $value1=10
PS C:test> $value2=20
PS C:test> $value1,$value2=$value2,$value1
PS C:test> $value1
20
PS C:test> $value2
10
查看正在使用的变量
Powershell将变量的相关信息的记录存放在名为variable:的驱动中。如果要查看所有定义的变量,可以直接遍历variable:
PS C:test> ls variable:
Name Value
---- -----
"I"like $ mossfly
$ cls
True
^ cls
_
1 1
a 123
args {}
b 123
c 123
ConfirmPreference High
ConsoleFileName
DebugPreference SilentlyContinue
。。。
查找变量
因为有虚拟驱动variable:的存在,可以象查找文件那样使用通配符查找变量。例如要查询以value打头的变量名。
PS C:test> ls variable:value*
Name Value
---- -----
value1 20
value2 10
验证变量是否存在
验证一个变量是否存在,仍然可以象验证文件系统那样,使用cmdlet Test-Path。为什么?因为变量存在变量驱动器中。
PS C:test> Test-Path variable:value1
True
PS C:test> Test-Path variable:value2
True
PS C:test> Test-Path variable:valueUnkonw
False
删除变量
因为变量会在powershell退出或关闭时,自动清除。一般没必要删除,但是你非得删除,也可以象删除文件那样删除它。
PS C:test> Test-Path variable:value1
True
PS C:test> del variable:value1
PS C:test> Test-Path variable:value1
False
使用专用的变量命令
为了管理变量,powershell提供了五个专门管理变量的命令Clear-Variable,Get-Variable,New-Variable,Remove-Variable,Set-Variable。因为虚拟驱动器variable:的存在,clear,remove,set打头的命令可以被代替。但是Get-Variable,New-Variable。却非常有用new-variable可以在定义变量时,指定变量的一些其它属性,比如访问权限。同样Get-Variable也可以获取这些附加信息。
变量写保护
可以使用New-Variable 的option选项 在创建变量时,给变量加上只读属性,这样就不能给变量重新赋值了。
PS C:test> New-Variable num -Value 100 -Force -Option readonly
PS C:test> $num=101
Cannot overwrite variable num because it is read-only or constant.
At line:1 char:5
+ $num <<<< =101 + CategoryInfo : WriteError: (num:String) [],
SessionStateUnauthorizedAccessException + FullyQualifiedErrorId :
VariableNotWritable PS C:test> del Variable:num
Remove-Item : Cannot remove variable num because it is constant or read-only. If the
variable is read-only,
ration again specifying the Force option.
At line:1 char:4
+ del <<<< Variable:num
+ CategoryInfo : WriteError: (num:String) [Remove-Item],
SessionStateUnauthorizedAccessExcepti
+ FullyQualifiedErrorId :
VariableNotRemovable,ItemCommand
但是可以通过删除变量,再重新创建变量更新变量内容。
PS C:test> del Variable:num -Force
PS C:test> $num=101
PS C:test> $num
101
有没有权限更高的变量,有,那就是:选项Constant,常量一旦声明,不可修改
PS C:test> new-variable num -Value "strong" -Option constant
PS C:test> $num="why? can not delete it."
Cannot overwrite variable num because it is read-only or constant.
At line:1 char:5
+ $num <<<< ="why? can not delete it." + CategoryInfo : WriteError:
(num:String) [], SessionStateUnauthorizedAccessException +
FullyQualifiedErrorId : VariableNotWritable PS C:test> del Variable:num -Force
Remove-Item : Cannot remove variable num because it is constant or read-only. If the
variable is read-only,
ration again specifying the Force option.
At line:1 char:4
+ del <<<< Variable:num -Force
+ CategoryInfo : WriteError: (num:String) [Remove-Item],
SessionStateUnauthorizedAccessExcepti
+ FullyQualifiedErrorId :
VariableNotRemovable,ItemCommand
变量描述
在New-Variable 可以通过-description 添加变量描述,但是变量描述默认不会显示,可以通过Format-List 查看。
PS C:test> new-variable name -Value "me" -Description "This is my name"
PS C:test> ls Variable:name | fl *
PSPath : riable::name
PSDrive : Variable
PSProvider : riable
PSIsContainer : False
Name : name
Description : This is my name
Value : me
Visibility : Public
Module :
ModuleName :
Options : None
Attributes : {}
自动化变量
Powershell 自动化变量 是那些一旦打开Powershell就会自动加载的变量。
这些变量一般存放的内容包括
1.
2.
3.
用户信息:例如用户的根目录$home
配置信息:例如powershell控制台的大小,颜色,背景等。
运行时信息:例如一个函数由谁调用,一个脚本运行的目录等。
PS> $HOME
C:Userstest
PS> $currentProcessID=$pid
PS> $currentProcessID
5356
PS> Get-Process -Id $pid
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
390 10 30604 33100 172 1.11 5356 powershell
PS> $PROFILE
C:hell_1
powershell中的某些自动化变量只能读,不能写。例如:$Pid。
可以通过Get-Help about_Automatic_variables查看Automatic_variables的帮助。
TOPIC
about_Automatic_Variables
主题
about_Automatic_Variables
简短说明
说明存储 Windows PowerShell 状态信息的变量。
这些变量由 Windows PowerShell 创建并维护。
详细说明
下面是 Windows PowerShell 中的自动变量的列表:
$$
包含会话所收到的最后一行中的最后一个令牌。
$?
包含最后一个操作的执行状态。如果最后一个操作成功,则包含 TRUE,失败则包含 FALSE。
$^
包含会话所收到的最后一行中的第一个令牌。
$_
包含管道对象中的当前对象。在对管道中的每个对象或所选对象执行操作的命令中,可以使用此变量。
$Args
包含由未声明参数和/或传递给函数、脚本或脚本块的参数值组成的数组。
在创建函数时可以声明参数,方法是使用 param 关键字或在函数名称后添加以圆括号括起、逗号
分隔的参数列表。
$ConsoleFileName
包含在会话中最近使用的控制台文件 (.psc1) 的路径。在通过 PSConsoleFile
参数启动
Windows PowerShell 或使用 Export-Console cmdlet 将管理单元名称导出到控制台文件
时,将填充此变量。
在使用不带参数的 Export-Console cmdlet 时,它自动更新在会话中最近使用的控制台文件。
可以使用此自动变量确定要更新的文件。
$Error
包含错误对象的数组,这些对象表示最近的一些错误。最近的错误是该数组中的第一个错误对象
($Error[0])。
$Event
包含一个 PSEventArgs 对象,该对象表示一个正在被处理的事件。
此变量只在事件注册命令(例如 Register-ObjectEvent)的 Action 块内填充。
此变量的值是 Get-Event cmdlet 返回的同一个对象。
因此,可以在 Action 脚本块中使用 $Event 变量的属性(例如
$nerated)。
$EventSubscriber
包含一个 PSEventSubscriber 对象,该对象表示正在被处理的事件的事件订阅者。
此变量只在事件注册命令的 Action 块内填充。此变量的值
是 Get-EventSubscriber cmdlet 返回的同一个对象。
$ExecutionContext
包含一个 EngineIntrinsics 对象,该对象表示 Windows PowerShell 主机的执行上下文。
可以使用此变量来查找可用于 cmdlet 的执行对象。
$False
包含 FALSE。可以使用此变量在命令和脚本中表示 FALSE,而不是使用字符串”false”。如果
该字符串转换为非空字符串或非零整数,则可将该字符串解释为 TRUE。
$ForEach
包含 ForEach-Object 循环的枚举数。可以对 $ForEach 变量的值使用枚举数的属性和方法。
此变量仅在运行 For 循环时存在,循环完成即会删除。
$Home
包含用户的主目录的完整路径。此变量等效于 %homedrive%%homepath% 环境变量。
版权声明:本文标题:PowerShell实例教程讲解 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1708444542h524405.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论