• 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




  • 相关阅读:
    Kubernetes 命令行工具之kubctl
    新一代数据库之Etcd 简介
    算法题 打家劫舍(动态规划)
    算法题 位1的个数
    Class强制类型转换
    算法题 阶乘后的零
    算法题 Excel表列序号
    多数元素
    有序数组两数之和
    一杯果汁和一杯水的故事
  • 原文地址:https://www.cnblogs.com/ziyue7575/p/e19a0dca4a19512425006a956b8ad444.html
Copyright © 2020-2023  润新知