返回列表 发帖

[原创教程] PowerShell 学习笔记(整理)

本帖最后由 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 命令不被执行
<#
dir
Get-Process
#>COPY
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:   #等同于CMDset命令
$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  #false
$a = 1;
Test-Path Variable:a  #trueCOPY
忽略错误并继续执行
$ErrorActionPreference = 'SilentlyContinue' #放在脚本开头,PS脚本忽略错误继续执行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.2
PowerShell -exec Bypass "&'E:\Test\Test.ps1' args"COPY
单引号与双引号
1.单引号括起来的字符串,变量名不会自动扩展,表达式不会被计算。
$a=$b=1;
echo '$($a+$b)=2'    #回显$($a+$b)=2COPY
2.双引号括起来的字符串,变量名自动扩展为变量值,表达式被计算。
$a=$b=1;
echo "$($a+$b)=2"    #回显2=2COPY
3.单引号嵌套单引号,用两个单引号;双引号嵌套双引号,用两个双引号
echo 'I Don''t Know'        # I Don't KnowCOPY
通配符
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'         #声明数组,该数组只包含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的简便方法COPY
哈希表
$Hash = @{}              #初始化
$Hash = @{a=1;b=2;c=3}
$Hash.Add('d', 4)        #添加键名、键值对
$Hash.ContainsKey('d')   #是否包含键名
$Hash['d']               #4
$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}    #获取Office安装路径COPY
格式化
'{0:0.00}' -f 3.1415926    #保留2位小数
'{0:X2}' -f 100            #转16进制
'{0:yyyy/MM/dd HH:mm:ss.fff}' -f (Get-Date)  #日期格式化COPY
截取字符串
$str = 'abcde'
$str.SubString(0,2)             #取前2位,相当于bat的%str:~0,2%
$str.SubString($str.Length-2)   #取后2位,相当于bat的%str:~-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
3

评分人数

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

查询 命令 再简化: gcm *pro*;  gcm get-*driver*
1

评分人数

    • WHY: 正确技术 + 1
QQ: 458609586
脚本优先 [PowerShell win10]

TOP

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

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

同样的道理,比如测试 UNC 路径是否合法:
cd HKLM:
Test-Path '\\127.0.0.1\C$' #false
Test-Path 'FileSystem::\\127.0.0.1\C$' #trueCOPY
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();
}COPY

TOP

回复 1# WHY


    非常感谢!正在学习这个,帮助了我的大忙.

TOP

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

TOP

返回列表