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