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