001_Powershell概述 Powershell概述 参考: https://www.cnblogs.com/lavender000/p/6931405.html https://www.cnblogs.com/lavender000/p/6935589.html PowerShell管道入门,看看你都会不(管道例子大全) PowerShell 在线教程 PowerShell学习(一),简介 Windows PowerShell简介 Windows PowerShell® 是基于任务的命令行管理程序和脚本语言,专为进行系统管理而设计。 在 .NET Framework 的基础上构建的 Windows PowerShell 可帮助 IT 专业人士和高级用户控制和自动执行 Windows 操作系统以及在 Windows 上运行的应用程序的管理。 UNIX 系统一直有着功能强大的脚本(shell),Win
Windows PowerShell简介
Windows PowerShell版本
PowerShell运行
启动PowerShell
运行程序、脚本和已有的软件
运行PowerShell命令
在外部调用PowerShell脚本
执行文件和脚本
关于脚本
执行批处理文件
执行VB脚本文件
执行powershell脚本
解除powershell脚本的禁用
Powershell调用入口的优先级
快速编辑模式和标准模式
快捷键
管道
显示信息中被...隐藏的内容
重定向
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:WindowsSystem32
)下运行程序、脚本、批处理文件或者其它可执行文件,可以直接输入文件名运行。
比如我把一个Test.cmd文件放在了”C:WindowsSystem32”下, 就可以如下方式运行它:
输入Test的时候,会从系统路径下找这个文件,运行
- 如果文件名字或路径中有空格,需要用(
'
)引号将命令扩起来,同时在前面加上符号(&
),这种叫做调用操作:
比如,运行
C: est testa.exe
,需要加&和'
命令变为:
& 'C: est testa.exe'
- 要运行当前目录下的命令,需要文件名前加
.
比如运行当前路径的test.bat
命令是:
. est.bat
- 要运行当前目录下的命令,而且命令名字或路径带有空格,需要同时加上符号(&)和('):
比如:
& .Test File est.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: est1ddtest2> .ping.bat # powershell运行批处理文件
123 # 执行的是bat文件
PS F: est1ddtest2> 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: est1ddtest2> cmd # 进入cmd
Microsoft Windows [版本 10.0.18363.592]
(c) 2019 Microsoft Corporation。保留所有权利。
F: est1ddtest2>ping.bat #cmd运行cmd文件
123 # 执行的是文件
F: est1ddtest2>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
执行 . est.vbs 会遍历当前Win32进程,并把每个进程的详细信息通过窗口显示出来。
有n个弹窗
cscript.exe .test.vbs
# 太多了,我写到文件中了
F: est1ddtest2>cscript.exe . est.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: est1ddtest2> echo "dir;Get-PSProvider;help dir" >test.ps1
PS F: est1ddtest2> Get-Content ./test.ps1
dir;Get-PSProvider;help dir
PS F: est1ddtest2> ./test.ps1
./test.ps1 : 无法加载文件 F: est1ddtest2 est.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: est1ddtest2> ls | sort -Descending Name | Format-Table Name,Mode
Name Mode
---- ----
text1.txt -a----
h.txt -a----
显示信息中被...隐藏的内容
使用Select-Object中的 -ExpandProperty属性来调用查看完整的属性信息
后面加管道
|Select-Object中的 -ExpandProperty 字段名
比如
PS C:Usersjsy1> Get-Service BITS
Status Name DisplayName
------ ---- -----------
Stopped BITS Background Intelligent Transfer Ser...
PS C:Usersjsy1> Get-Service BITS | Select-Object -ExpandProperty DisplayName
Background Intelligent Transfer Service
重定向
重定向可以使用>
覆盖,或>>
追加,也可以使用powershell的命令Out-File
(下面的命令中有讲解)
比如:
PS F: est1ddtest2> "Powershell Routing" >test.txt # 覆盖写入 ==>"Powershell Routing"| Out-File test.txt
PS F: est1ddtest2> Get-Content . est.txt
Powershell Routing
PS F: est1ddtest2> "Powershell Routing" >>test.txt # 追加
PS F: est1ddtest2> "Powershell Routing" >>test.txt
PS F: est1ddtest2> Get-Content . est.txt # 查看
PS C:Usersjsy1> "123213213" | Out-File . est123.txt
PS C:Usersjsy1> Get-Content . est123.txt # 覆盖写入
123213213