标题: [原创教程] PowerShell 学习笔记(整理) [打印本页]
作者: WHY 时间: 2022-9-3 21:55 标题: PowerShell 学习笔记(整理)
本帖最后由 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)
复制代码
作者: 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项,可以这样:- Get-Item 'Registry::HKEY_CLASSES_ROOT\txtfile\shell\open\command'
复制代码
其中,Registry 代表 PowerShell 驱动器的提供者名称,即 Get-PSDrive 命令中 Provider 属性列的值。
同样的道理,比如测试 UNC 路径是否合法:- cd HKLM:
- Test-Path '\\127.0.0.1\C$' #false
- Test-Path 'FileSystem::\\127.0.0.1\C$' #true
复制代码
2. 脚本所在路径 $MyInvocation.MyCommand.Path 应用:
比如,需要以管理员身份运行某一个脚本文件时:- if ($args.Count -eq 0) {
- Start-Process PowerShell -Args '-exec Bypass', ('-file "' + $MyInvocation.MyCommand.Path + '"'), 'ARG' -Verb RunAs;
- } else {
- #这里是你的脚本
- echo 'Done';
- [Console]::ReadLine();
- }
复制代码
作者: WuZhengQiang 时间: 2023-2-12 21:35
回复 1# WHY
非常感谢!正在学习这个,帮助了我的大忙.
作者: lancer 时间: 2023-4-7 17:46
感觉PowerShell比bat难多了,好几次想研究一下,都没有看下去。。。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |