001_Powershell概述

TOC

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版本

image-20200813103325937如果默认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

各版本独立包下载地址如下:

另外在2016年8月18日,微软宣布开源跨平台版本的PowerShell可以支持Windows,macOS,CentOS和Ubuntu多个操作系统了,叫做PowerShell Core,基于.NET Core运行。

各版本新添加功能参考链接如下:

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模式)

image-20200813103517298

运行程序、脚本和已有的软件

如果以前经常使用一些别的工具进行开发,可能会有一些可执行文件、Perl脚本、批处理文件等,如果不想放弃这些,可以使用PowerShell直接运行它们。

  • 系统路径(C:WindowsSystem32)下运行程序、脚本、批处理文件或者其它可执行文件,可以直接输入文件名运行。

比如我把一个Test.cmd文件放在了”C:WindowsSystem32”下, 就可以如下方式运行它:

image-20200813103549051

输入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。

image-20200813103558725

执行文件和脚本

像运行可执行文件一样,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个弹窗
image-20200813144138393

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




原文地址:https://www.cnblogs.com/ziyue7575/p/e19a0dca4a19512425006a956b8ad444.html