Board logo

标题: [原创教程] PowerShell 学习笔记(整理) [打印本页]

作者: WHY    时间: 2022-9-3 21:55     标题: PowerShell 学习笔记(整理)

本帖最后由 WHY 于 2022-9-4 19:01 编辑

我个人PowerShell学习过程中的零碎笔记,整理一下,PowerShell 初学者可以参考。

查看PowerShell版本:
  1. $Host.Version
复制代码
  1. $PSVersionTable.PSVersion
复制代码
更改脚本执行策略:
默认情况下,PowerShell脚本文件(扩展名为.ps1)被限制执行。以管理员身份运行PowerShell,执行下面命令,取消限制:
  1. Set-ExecutionPolicy RemoteSigned
复制代码
PowerShell脚本所在路径:
类似于bat的%~f0、VBS的WSH.ScriptFullName
  1. $MyInvocation.MyCommand.Path
复制代码
多行注释:
多行注释符使用"<#"和"#>"来引用一段注释,以下 dir 及 Get-Process 命令不被执行
  1. <#
  2. dir
  3. Get-Process
  4. #>
复制代码
Cmdlet命令查询:
比如,忘记命令全称,只记得包含pro字符
  1. Get-Command | ?{$_.Name -like '*pro*'}
复制代码
获取属性与方法:
  1. Get-Service | Get-Member     #对象的属性方法
  2. [Environment] | gm -sta      #静态属性方法
复制代码
获取命令帮助信息:
类似于cmd的 sc /?
  1. help Get-Service
复制代码
查找已知cmdlet的别名:
  1. Get-Alias -Definition Get-Process
复制代码
查看所有自动变量:
  1. Get-ChildItem Variable:
复制代码
查看系统环境变量:
  1. Get-ChildItem Env:   #等同于CMD的set命令
  2. $Env:Path            #环境变量Path
复制代码
特殊文件夹:
  1. [Enum]::GetValues([Environment+SpecialFolder])  #枚举所有特殊文件夹名称
  2. [Environment]::GetFolderPath('Desktop')         #获取桌面路径
复制代码
计算脚本运行时间:
  1. $st = Get-Date   #脚本开头
  2. Get-Process
  3. $et = Get-Date   #脚本结尾
  4. ($et - $st).TotalSeconds   #计算
复制代码
判断变量是否已定义
类似于批处理中的 if defined
  1. Test-Path Variable:a  #false
  2. $a = 1;
  3. Test-Path Variable:a  #true
复制代码
忽略错误并继续执行
  1. $ErrorActionPreference = 'SilentlyContinue' #放在脚本开头,PS脚本忽略错误继续执行
复制代码
脚本结尾暂停:
等同于bat中的pause
  1. echo 'Press any key to continue...'
  2. [Console]::ReadLine()
复制代码
提示用户输入:
等同于bat中的 set /p
  1. $str = Read-Host 'Please Input'
复制代码
在cmd命令提示符运行PS命令:
  1. PowerShell -C "Get-ChildItem *.txt"
复制代码
在cmd命令提示符运行PS脚本:
Bypass 可以绕过脚本执行策略限制,args 为脚本参数,&是调用运算符。
运算符参考https://docs.microsoft.com/zh-cn ... view=powershell-7.2
  1. PowerShell -exec Bypass "&'E:\Test\Test.ps1' args"
复制代码
单引号与双引号
1.单引号括起来的字符串,变量名不会自动扩展,表达式不会被计算。
  1. $a=$b=1;
  2. echo '$($a+$b)=2'    #回显$($a+$b)=2
复制代码
2.双引号括起来的字符串,变量名自动扩展为变量值,表达式被计算。
  1. $a=$b=1;
  2. echo "$($a+$b)=2"    #回显2=2
复制代码
3.单引号嵌套单引号,用两个单引号;双引号嵌套双引号,用两个双引号
  1. echo 'I Don''t Know'        # I Don't Know
复制代码
通配符
PowerShell中的通配符包括 "*"、"?" 以及表示范围的"[]"字符
1. *表示零到多个任意字符
  1. dir -Path 'E:\Test*\*.txt'  #遍历E:\Test或E:\Test1或E:\Test111等目录里面的所有txt文件
  2. dir *.*                     #遍历任意的带扩展名的文件(这与bat不同)
复制代码
2. ?表示1个任意字符(这与bat不同,bat中的?表示0~1个任意字符)
  1. dir -Path 'E:\a?\*.txt'     #遍历E:\a1或E:\d2等目录里面的所有txt文件
复制代码
3. [0-9]表示数字0~9中的任意一个;[abc]表示字母a、b、c中的任意一个
  1. dir -Path 'E:\Test\a[1-3].txt'  #遍历E:\Test 中的a1.txt、a2.txt、a3.txt
复制代码
注意:若文件名或路径包含"["字符,-Path(默认)参数将无法识别是通配符还是"["字符本身,此时要用-LiteralPath替代-Path
转义字符
PowerShell中的转义字符为后引号"`",转义字符用双引号而不是单引号括起来。
"`r`n"表示回车换行,"`t"表示Tab(跳格)字符
数组定义
  1. $arr = ,'a'         #声明数组,该数组只包含1个元素 'a'
  2. $arr -is [Array]    #判断是否为数组
  3. $arr = @('a', 'b', 'c')
  4. $arr = [Collections.ArrayList]@('a', 'b', 'c')   #转换为[Collections.ArrayList]类型
  5. $arr[0]             #第一个元素
  6. $arr[-1]            #最后一个元素
  7. [char[]](65..90)    #强制转换为字符数组,获取A~Z的简便方法
复制代码
哈希表
  1. $Hash = @{}              #初始化
  2. $Hash = @{a=1;b=2;c=3}
  3. $Hash.Add('d', 4)        #添加键名、键值对
  4. $Hash.ContainsKey('d')   #是否包含键名
  5. $Hash['d']               #4
  6. $Hash.GetEnumerator() | sort Name    #按键名排序
复制代码
ASCII码(0~128)对应的字符
  1. 0..128 | %{'' + $_ + ' ' + [char]$_}
复制代码
字符串转ASCII码(Unicode码)
  1. $str = '我是中国人!';
  2. [char[]]$str | %{ '0x' + ([int]$_).ToString('X2') }
复制代码
将结果导出到CSV
  1. Get-Process | select Name, CPU | Export-csv E:\result.csv -NoTypeInformation
复制代码
设定当前工作目录:
  1. Set-Location -Path E:\Test -PassThru
复制代码
PowerShell驱动器:
PowerShell驱动器概念与其它脚本不同,包含文件系统驱动器(C: D:)、证书(Cert:)、注册表驱动器(HKCU: HKLM:)、自动变量(Variable:)、环境变量(Env:)等。
  1. Get-PSDrive -PSprovider filesystem    #列出文件系统驱动器
  2. dir 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Office\*\Common\InstallRoot' | %{(gp $_.PSPath).Path}    #获取Office安装路径
复制代码
格式化
  1. '{0:0.00}' -f 3.1415926    #保留2位小数
  2. '{0:X2}' -f 100            #转16进制
  3. '{0:yyyy/MM/dd HH:mm:ss.fff}' -f (Get-Date)  #日期格式化
复制代码
截取字符串
  1. $str = 'abcde'
  2. $str.SubString(0,2)             #取前2位,相当于bat的%str:~0,2%
  3. $str.SubString($str.Length-2)   #取后2位,相当于bat的%str:~-2%
复制代码
赋值给变量,同时输出到控制台
  1. ($p=Get-Process)
复制代码
显示结果到控制台,同时输出结果到文件
  1. Get-Process | Tee-Object E:\test.txt
复制代码
重命名计算机
  1. $newName = Read-Host 'Please Input New ComputerName'
  2. $cs = gwmi win32_ComputerSystem -ComputerName $Env:ComputerName
  3. $cs.rename($newName)
复制代码

作者: xczxczxcz    时间: 2022-9-4 20:56

你真是帮了 Microsoft 忙。阿三懒成什么鸟样了。

查询 命令 再简化: gcm *pro*;  gcm get-*driver*
作者: WHY    时间: 2022-9-5 14:22

本帖最后由 WHY 于 2022-9-5 23:03 编辑

补充:
1. 关于PS驱动器
PowerShell注册表驱动器只有 HKCU: 和 HKLM: 两种,如果要操作其它注册表项,比如要操作HKCR项,可以这样:
  1. Get-Item 'Registry::HKEY_CLASSES_ROOT\txtfile\shell\open\command'
复制代码
其中,Registry 代表 PowerShell 驱动器的提供者名称,即 Get-PSDrive 命令中 Provider 属性列的值。

同样的道理,比如测试 UNC 路径是否合法:
  1. cd HKLM:
  2. Test-Path '\\127.0.0.1\C$' #false
  3. Test-Path 'FileSystem::\\127.0.0.1\C$' #true
复制代码
2. 脚本所在路径 $MyInvocation.MyCommand.Path 应用:
比如,需要以管理员身份运行某一个脚本文件时:
  1. if ($args.Count -eq 0) {
  2.     Start-Process PowerShell -Args '-exec Bypass', ('-file "' + $MyInvocation.MyCommand.Path + '"'), 'ARG' -Verb RunAs;
  3. } else {
  4.     #这里是你的脚本
  5.     echo 'Done';
  6.     [Console]::ReadLine();
  7. }
复制代码

作者: WuZhengQiang    时间: 2023-2-12 21:35

回复 1# WHY


    非常感谢!正在学习这个,帮助了我的大忙.
作者: lancer    时间: 2023-4-7 17:46

感觉PowerShell比bat难多了,好几次想研究一下,都没有看下去。。。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2