001_Powershell概述
Windows PowerShell简介
Windows PowerShell版本
PowerShell运行
启动PowerShell
运行程序、脚本和已有的软件
运行PowerShell命令
在外部调用PowerShell脚本
执行文件和脚本
关于脚本
执行批处理文件
执行VB脚本文件
执行powershell脚本
解除powershell脚本的禁用
Powershell调用入口的优先级
快速编辑模式和标准模式
快捷键
管道
显示信息中被...隐藏的内容
重定向
Powershell概述
参考:
Windows PowerShell简介
Windows PowerShell® 是基于任务的命令行管理程序和脚本语言,专为进行系统管理而设计。 在 .NET Framework 的基础上构建的 Windows PowerShell 可帮助 IT 专业人士和高级用户控制和自动执行 Windows 操作系统以及在 Windows 上运行的应用程序的管理。
UNIX 系统一直有着功能强大的脚本(shell),Windows PowerShell 的诞生就是要提供功能相当于 UNIX 系统 BASH 的命令行外壳程序,同时也内建脚本语言以及辅助脚本程序的工具。
在2002年,微软开始研究一个新的产品叫做”Monad”,第一个公开测试版本是在2005年6月发布的,到2006年4月,微软把它重新命名为Windows PowerShell。从2006年微软正式发布Windows PowerShell 1.0以来,目前已经更新到了5.1版本。
Windows PowerShell:
- 微软为Windows开发的命令行工具和脚本语言
- 建立在.NET FrameWork基础上
- 用于取代DOS命令和BAT、VBS脚本
特点:
- 面向对象,每个命令都有自己属性和方法
- 提供丰富的控制和自动化管理功能
- 完全支持DOS命令
Windows PowerShell版本
如果默认Windows集成版本中有,可以直接开启Feature,对于其它可支持Windows版本,点击下面下载地址去安装独立更新包。
操作系统自带版本:
- Windows Vista/2008: v1.0
- Windows7/2008R2:v2.0
- Windows 8/2012: v3.0
以下操作系统需要安装相应的版本
- Windows XP/2003需要手动安装2.0
- Windows Vista/2008需要手动安装2.0
各版本独立包下载地址如下:
- Windows PowerShell 1.0:
- Windows PowerShell 2.0:
- Windows PowerShell 3.0:
- Windows PowerShell 4.0:
- Windows PowerShell 5.0:
- Windows PowerShell 5.1:
另外在2016年8月18日,微软宣布开源跨平台版本的PowerShell可以支持Windows,macOS,CentOS和Ubuntu多个操作系统了,叫做PowerShell Core
,基于.NET Core运行。
各版本新添加功能参考链接如下:
- Windows PowerShell 1.0:https://support.microsoft.com/en-us/help/928439/windows-powershell-1.0-installation-package-for-windows-vista。
- Windows PowerShell 2.0:https://support.microsoft.com/en-us/help/968929/windows-management-framework-windows-powershell-2.0,-winrm-2.0,-and-bits-4.0。
- Windows PowerShell 3.0:https://msdn.microsoft.com/en-us/powershell/scripting/whats-new/what-s-new-in-windows-powershell-50#BKMK_wps3。
- Windows PowerShell 4.0:https://msdn.microsoft.com/en-us/powershell/scripting/whats-new/what-s-new-in-windows-powershell-50#BKMK_wps4。
- Windows PowerShell 5.0:https://msdn.microsoft.com/en-us/powershell/scripting/whats-new/what-s-new-in-windows-powershell-50#BKMK_new50。
- Windows PowerShell 5.1:https://msdn.microsoft.com/en-us/powershell/wmf/5.1/release-notes。
Windows PowerShell是个很强大的工具,很多现有的成型产品都有对应的PowerShell API,如SQL Server、NetApp Data ONTAP、Windows Azure和SharePoint等,因此学会使用它对Windows上的开发工作有很大的帮助。
PowerShell运行
启动PowerShell
现在的Windows系统中一般都集成了PowerShell,启动方法有如下几种:
- 直接开始菜单 -> 所有程序 -> Windows PowerShell -> Windows PowerShell(不同系统可能路径不一样)。(会打开PowerShell窗口)
- 开始菜单 -> 运行(run) -> 输入”PowerShell”。(会打开PowerShell窗口)
- 命令提示符(cmd) -> PowerShell。(不开启窗口,cmd窗口进入PowerShell模式)
运行程序、脚本和已有的软件
如果以前经常使用一些别的工具进行开发,可能会有一些可执行文件、Perl脚本、批处理文件等,如果不想放弃这些,可以使用PowerShell直接运行它们。
- 在系统路径(
C:\Windows\System32
)下运行程序、脚本、批处理文件或者其它可执行文件,可以直接输入文件名运行。
比如我把一个Test.cmd文件放在了”C:\Windows\System32”下, 就可以如下方式运行它:
输入Test的时候,会从系统路径下找这个文件,运行
- 如果文件名字或路径中有空格,需要用(
'
)引号将命令扩起来,同时在前面加上符号(&
),这种叫做调用操作:
比如,运行
C:\test test\a.exe
,需要加&和'
命令变为:
& 'C:\test test\a.exe'
- 要运行当前目录下的命令,需要文件名前加
.\
比如运行当前路径的test.bat
命令是:
.\test.bat
- 要运行当前目录下的命令,而且命令名字或路径带有空格,需要同时加上符号(&)和('):
比如:
& .\Test File\test.bat
运行PowerShell命令
除了支持传统的Windows可执行文件,PowerShell还推出了一个功能强大的新的命令叫做cmdlet
。所有的cmdlet命令规则都遵循动词-名词这种语法结构,如Get-Command、Get-Content等.
在外部调用PowerShell脚本
有时候可能需要从批处理文件、定时任务或者其它非PowerShell程序调用PowerShell脚本,
语法:
PowerShell "& 'full path of the script' arguments"
如下例子是从CMD调用PowerShell。
执行文件和脚本
像运行可执行文件一样,Powershell运行文件和脚本,也必须使用绝对路径或者相对路径,或者要运行的文件必须定义在可受信任的环境变量中。
关于脚本
脚本和批处理都属于伪可执行文件,它们只是包含了若干命令行解释器能够解释和执行的命令行代码。
执行批处理文件
批处理是扩展名为”.bat
”的文本文件,它可以包含任何cmd控制台能够处理的命令。当批处理文件被打开,Cmd控制台会逐行执行每条命令。
若是有.bat
文件的文件名与cmd的命令同名
- PowerShell:不会覆盖原命令
- cmd:会覆盖原命令
比如:
# 创建一个 ping.bat 文件,内容为:
@echo off
echo 123
# 测试
PS F:\test1\ddtest2> .\ping.bat # powershell运行批处理文件
123 # 执行的是bat文件
PS F:\test1\ddtest2> ping # powershell运行命令
用法: ping [-t] [-a] [-n count] [-l size] [-f] [-i TTL] [-v TOS] # 执行的是命令
[-r count] [-s count] [[-j host-list] | [-k host-list]]
[-w timeout] [-R] [-S srcaddr] [-c compartment] [-p]
[-4] [-6] target_name
选项:
-t Ping 指定的主机,直到停止。
若要查看统计信息并继续操作,请键入 Ctrl+Break;
若要停止,请键入 Ctrl+C。
-a 将地址解析为主机名。
-n count 要发送的回显请求数。
-l size 发送缓冲区大小。
-f 在数据包中设置“不分段”标记(仅适用于 IPv4)。
-i TTL 生存时间。
-v TOS 服务类型(仅适用于 IPv4。该设置已被弃用,
对 IP 标头中的服务类型字段没有任何
影响)。
-r count 记录计数跃点的路由(仅适用于 IPv4)。
-s count 计数跃点的时间戳(仅适用于 IPv4)。
-j host-list 与主机列表一起使用的松散源路由(仅适用于 IPv4)。
-k host-list 与主机列表一起使用的严格源路由(仅适用于 IPv4)。
-w timeout 等待每次回复的超时时间(毫秒)。
-R 同样使用路由标头测试反向路由(仅适用于 IPv6)。
根据 RFC 5095,已弃用此路由标头。
如果使用此标头,某些系统可能丢弃
回显请求。
-S srcaddr 要使用的源地址。
-c compartment 路由隔离舱标识符。
-p Ping Hyper-V 网络虚拟化提供程序地址。
-4 强制使用 IPv4。
-6 强制使用 IPv6。
PS F:\test1\ddtest2> cmd # 进入cmd
Microsoft Windows [版本 10.0.18363.592]
(c) 2019 Microsoft Corporation。保留所有权利。
F:\test1\ddtest2>ping.bat #cmd运行cmd文件
123 # 执行的是文件
F:\test1\ddtest2>ping # cmd运行命令
123 #执行的是文件
通过cmd进入cmd控制台输入ping发现执行的不是ping命令,而是直接运行ping.bat ,也就是说可以通过.bat 覆盖cmd命令。这种机制很危险,如果有人侵入电脑,并将系统内部命令篡改成自己批处理,那就太悲剧了。 这种命令与脚本的混淆不会发生在powershell中,因为powershell有更安全的机制。
执行VB脚本文件
将下列命令保存为test.vbs
# 遍历当前Win32进程,并把每个进程的详细信息通过窗口显示出来
Set wmi = GetObject("winmgmts:")
Set collection = wmi.ExecQuery("select * from Win32_Process")
For Each process in collection
WScript.Echo process.getObjectText_
Next
执行 .\test.vbs 会遍历当前Win32进程,并把每个进程的详细信息通过窗口显示出来。
有n个弹窗
cscript.exe .test.\vbs
# 太多了,我写到文件中了
F:\test1\ddtest2>cscript.exe .\test.vbs > vbstext.txt
#文件内容
Microsoft (R) Windows Script Host Version 5.812
版权所有(C) Microsoft Corporation。保留所有权利。
instance of Win32_Process
{
Caption = "System Idle Process";
CreationClassName = "Win32_Process";
CreationDate = "20200813082141.788357+480";
CSCreationClassName = "Win32_ComputerSystem";
CSName = "DESKTOP-TPFM5VI";
Description = "System Idle Process";
Handle = "0";
HandleCount = 0;
KernelModeTime = "791874687500";
Name = "System Idle Process";
OSCreationClassName = "Win32_OperatingSystem";
OSName = "Microsoft Windows 10 教育版|C:\\\\WINDOWS|\\Device\\Harddisk0\\Partition1";
OtherOperationCount = "0";
OtherTransferCount = "0";
PageFaults = 9;
...
执行powershell脚本
Powershell拥有自己的脚本,扩展名为“.ps1
”
PS F:\test1\ddtest2> echo "dir;Get-PSProvider;help dir" >test.ps1
PS F:\test1\ddtest2> Get-Content ./test.ps1
dir;Get-PSProvider;help dir
PS F:\test1\ddtest2> ./test.ps1
./test.ps1 : 无法加载文件 F:\test1\ddtest2\test.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microso
ft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。
所在位置 行:1 字符: 1
+ ./test.ps1
+ ~~~~~~~~~~
+ CategoryInfo : SecurityError: (:) [],PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
解除powershell脚本的禁用
- 以管理员的身份打开powershell
- 输入
set-ExecutionPolicy RemoteSigned
回车 - 输入y或a确定
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
快速编辑模式和标准模式
powershell控制台有两种模式,一个是快速编辑模式,一个是标准模式。
快速编辑模式和标准模式的切换可以通过控制台标题栏->鼠标右击->属性->选项-ll>编辑选项 。
- 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 | 自动补齐命令或者文件名 |
管道
在Shell中一个重要的基本概念就是管道(pipeline),即在一组命令中,输出的命令结果成为下一个命令的输入参数。(把上一条命令的输出作为下一条命令的输入。)
比如:
#通过ls获取当前目录的所有文件信息,然后通过Sort -Descending对文件信息按照Name降序排列,最后将排序好的文件的Name和Mode格式化成Table输出
PS F:\test1\ddtest2> ls | sort -Descending Name | Format-Table Name,Mode
Name Mode
---- ----
text1.txt -a----
h.txt -a----
显示信息中被...隐藏的内容
使用Select-Object中的 -ExpandProperty属性来调用查看完整的属性信息
后面加管道
|Select-Object中的 -ExpandProperty 字段名
比如
PS C:\Users\jsy1> Get-Service BITS
Status Name DisplayName
------ ---- -----------
Stopped BITS Background Intelligent Transfer Ser...
PS C:\Users\jsy1> Get-Service BITS | Select-Object -ExpandProperty DisplayName
Background Intelligent Transfer Service
重定向
重定向可以使用>
覆盖,或>>
追加,也可以使用powershell的命令Out-File
(下面的命令中有讲解)
比如:
PS F:\test1\ddtest2> "Powershell Routing" >test.txt # 覆盖写入 ==>"Powershell Routing"| Out-File test.txt
PS F:\test1\ddtest2> Get-Content .\test.txt
Powershell Routing
PS F:\test1\ddtest2> "Powershell Routing" >>test.txt # 追加
PS F:\test1\ddtest2> "Powershell Routing" >>test.txt
PS F:\test1\ddtest2> Get-Content .\test.txt # 查看
PS C:\Users\jsy1> "123213213" | Out-File .\test123.txt
PS C:\Users\jsy1> Get-Content .\test123.txt # 覆盖写入
123213213