System.Collections...
搜索 System.Collections.Generic.List,你会看到它所有的方法(Add, Remove, Sort 等)。[Parameter()] 里还能写什么?搜索 "PowerShell Parameter Attributes"。Get-Command (找命令) 不知道用什么命令 Get-Command *service*Get-Help (查用法) 不知道参数怎么写 Get-Help Get-Process -Examples (看示例最有用)Get-Member (看对象) 这是 PowerShell 的神器。 拿到一个对象,不知道它有什么属性 Get-Process | Get-Member (查看进程对象有哪些属性和方法)Select-Object (选属性) 对象属性太多,只想看几个 Get-Process | Select-Object Name, CPU, Idgrep, awk, cut 等工具去切割字符串。System.Diagnostics.Process 对象。$proc.Name 直接获取名称,而不是用正则去匹配。Cmdlet (发音为 command-let)。Verb-Noun 格式,例如 Get-Process (获取进程), Set-Location (设置路径), Invoke-WebRequest (发起网页请求)。$开头(在声明和使用时都要 $)。类型通常是动态推断的,但也可以强类型。-eq:等于 $a -eq 10-ne:不等于 $a -ne 10-gt / -lt:大于 / 小于 $a -gt 5-like:通配符匹配 $name -like "Ad*",* 匹配任意多个字符,? 匹配单个字符-match:正则匹配 $name -match "^A",匹配结果存入 $matches 变量,第0个表示捕获的所有内容-and:与 $a -gt 1 -and $b -lt 5-or:或 $a -eq 1 -or $b -eq 2-not / !:非 -not $true -is:类型检查 $var -is [string]| 类型 | 写法 | 示例 | 说明 |
|---|---|---|---|
| 字符串 | [string] | $S = "Hello" | 文本 |
| 整数 | [int] | $i = 10 | 32 位整数 |
| 长整数 | [long] | $i = 10000000000 | 大数字 |
| 布尔 | [bool] | $b = $true | 真/假 |
| 小数 | [double] | $d = 3.14 | 浮点数 |
| 日期 | [datetime] | $dt = Get-Date | 时间对象 |
| 空值 | $null | $x = $null | 无值 |
[switch] 类型 (布尔标志) 这是一个特殊的类型,用于函数的参数。它不需要赋值,存在即为真 ($true),不存在即为假 ($false)。常用于开关选项。function Start-Service {
param (
[switch]$Force # 调用时只需写 -Force,不用写 -Force $true
)
if ($Force) { Write-Host "强制执行" }
}
Start-Service -Force # $Force 自动变为 $true
# 定义
$arr = @() # 空数组
$arr = 1, 2, 3 # 快速定义
$arr = @("A", "B", "C") # 显式定义
# 访问
$arr[0] # 第一个元素
$arr[-1] # 最后一个元素 (负数索引)
$arr.Count # 长度
# 添加 (注意:这会创建新数组,大数据量时性能差)
$arr += 4
# 定义
$hash = @{
Name = "Admin"
ID = 101
Active = $true
}
[hashtable]$props=@{}
# 访问
$hash.Name # 点号访问
$hash["ID"] # 索引访问
# 添加/修改
$hash["Location"] = "Beijing"
# 遍历
foreach ($key in $hash.Keys) {
Write-Host "$key : $($hash[$key])"
}
# 高级用法:参数 splatting, 哈希表常用于将一堆参数“展开”传递给命令,使代码更整洁。
$params = @{
Path = "C:\Log"
Filter = "*.txt"
Recurse = $true
}
Get-ChildItem @params # 注意这里是 @ 而不是 $
# 泛型哈希
System.Collections.Generic.Dictionary[K,V]
[ArrayList]) 非泛型,可存任意类型# 定义
[ArrayList]$list = [ArrayList]::new()
# 或者
$list = [System.Collections.ArrayList]@()
# 添加元素 (⚠️ 必须用 $null = 接收返回值,否则屏幕会打印数字)
$null = $list.Add("Apple")
$null = $list.Add(123)
$null = $list.Add(@("Nested", "Array"))
# 添加多个
$null = $list.AddRange(@("A", "B", "C"))
# 访问
$list[0] # "Apple"
$list.Count # 6
# 删除
$null = $list.Remove("Apple")
$null = $list.RemoveAt(0)
[System.Collections.Generic.List[T]])# 定义 (指定只能存字符串)
[System.Collections.Generic.List[string]]$list = [System.Collections.Generic.List[string]]::new()
# 添加 (不需要 $null =,因为 .Add() 返回 void)
$list.Add("Apple")
$list.Add("Banana")
# $list.Add(123) # ❌ 报错!类型不匹配
# 访问
$list[0]
$list.Count
# 查找
$list.Contains("Apple") # True
$list.IndexOf("Banana") # 1
# 排序
$list.Sort()
System.Collections.Generic.Dictionary[K,V]# ❌ 错误:不能省略泛型参数
# [Dictionary]$dict = ...
# ✅ 正确:必须指定 Key 和 Value 类型
[System.Collections.Generic.Dictionary[string, int]]$dict =
[System.Collections.Generic.Dictionary[string, int]]::new()
# 或者使用 New-Object (旧式)
$dict = New-Object 'System.Collections.Generic.Dictionary[string,int]'
# 初始化时添加数据
$dict = [System.Collections.Generic.Dictionary[string, string]]::new(
@{
Name = "Admin"
Role = "Manager"
}
)
$obj = [PSCustomObject]@{
Name = "Server01"
IP = "192.168.1.1"
Status = "Online"
}
# 访问
$obj.Name
# 导出
$obj | Export-Csv -Path "servers.csv" -NoTypeInformation
class Person {
[string]$Name
[int]$Age
Say-Hello() {
return "Hi, I am $($this.Name)"
}
}
$p = [Person]::new()
# 使用 New-Object
# 旧写法 (兼容 PowerShell 2.0)
$list = New-Object System.Collections.Generic.List[object]
# 新写法 (PowerShell 5.0+, 推荐)
$list = [System.Collections.Generic.List[object]]::new()
# 使用
$list.Add("Item 1")
$p.Name = "Tom"
$p.Say-Hello()
# If 语句
if ($count -gt 10) {
Write-Host "Count is large"
} elseif ($count -eq 10) {
Write-Host "Count is 10"
} else {
Write-Host "Count is small"
}
# ForEach 循环 (遍历对象)
foreach ($proc in Get-Process) {
if ($proc.CPU -gt 100) {
Write-Host $proc.Name
}
}
# While 循环
$i = 0
while ($i -lt 5) {
$i++
}
# switch
switch ($value) {
1 { "One" }
2 { "Two" }
default { "Other" }
}
Write-Output: 将数据送入管道(推荐用于脚本逻辑)。Write-Host: 直接打印到屏幕(仅用于显示信息,数据无法传递给下一个命令)。Write-Error: 写入错误流。Write-Warning: 写入警告流。[CmdletBinding()]function Invoke-MyTask {
[CmdletBinding()] # 启用高级功能
param (
[Parameter(Mandatory=$true, ValueFromPipeline=$true)] # 1. 参数属性 (Attribute)
[ValidateNotNullOrEmpty()] # 2. 验证属性 (Validation)
[string] # 3. 类型约束 (Type)
$Path # 4. 变量名 (Variable)
)
Write-Verbose "正在处理路径:$Path" # 只有加 -Verbose 时才显示
if ($PSCmdlet.ShouldProcess($Path)) { # 支持 -WhatIf 模拟运行
Write-Output "处理完成:$Path"
}
}
[Parameter(...)]:这是一个 Attribute 类。它告诉 PowerShell 引擎如何处理这个参数。Mandatory=$true:用户必须提供此参数,否则报错。ValueFromPipeline=$true:允许通过管道 | 传递值给这个参数(这是 PowerShell 强大的关键)。Position=0:允许 positional 参数(不用写参数名,直接按顺序传值)。[Validate...]:在代码运行前自动检查数据合法性。[ValidateSet("A", "B")]:只能传 A 或 B。[ValidateRange(1, 10)]:数字必须在 1 到 10 之间。[string]:强制类型转换。[hashtable]$props:表示这个参数必须接收一个哈希表对象。调用时:My-Function -props @{ Name="A"; ID=1 }Write-Output (或直接在最后一行写变量): 推荐。将对象送入管道,可以被后续命令接收。return: 会立即退出函数。通常只用于返回状态码或提前终止,不要用来返回数据对象。# 正确做法
function Get-Data {
$data = "Some Data"
$data # 隐式输出,等价于 Write-Output $data
}
# 错误做法 (在管道中会中断)
function Get-Data-Bad {
return "Some Data"
}
Get-UserInfo)。Get-Verb 命令查看微软推荐的动词列表(避免使用 Do-, Run- 等非标准动词)。[string]::IsNullOrWhiteSpace($coord) 调用 string 类中的方法&):如果你有一个字符串变量存着命令名,或者想动态执行代码:$cmd = "Get-Process"
& $cmd # 执行变量里的命令
& { param($a) $a * 2 } 10 # 调用匿名脚本块,输出 20
# 定义参数包
$params = @{
Path = "C:\Windows"
Filter = "*.exe"
Recurse = $true
ErrorAction = "SilentlyContinue"
}
# 调用时注意用 @ 而不是 $
Get-ChildItem @params
修改 cmd 的编码方式:在注册表:HKEY_LOCAL_ACHINE\SOFTWARE\Microsoft\Command Processor 新增 DWORD32 类型的值,名字为 autorun,值为十进制65001
powershell 修改编码:在修改 C:\Users\zmy_1\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
递归查找所有 HTML 文件 $files = Get-ChildItem -Path $localFolder -Recurse -Filter *.html
策略模式(管理员运行)
Get-ExecutionPolicy 查询策略模式Set-ExecutionPolicy Restricted 修改Restricted:不允许执行任何脚本。AllSigned:仅允许签名的脚本运行。RemoteSigned:允许来自受信任发布者的脚本运行,并且本地脚本在首次运行前必须签名。Unrestricted:允许所有脚本运行,这是最宽松的模式。Bypass:绕过执行策略用于测试脚本。这不是推荐的日常执行策略设置。Undefined:移除执行策略。Test-NetConnection -ComputerName 47.122.65.237 -Port 9000 测试端口连通性
Get-CimInstance Win32_Process -Filter "ProcessId = 1234" | Select-Object CommandLine 查看指定进程的命令行信息
Stop-Process -Id (Get-NetTCPConnection -LocalPort 8080).OwningProcess 关闭指定端口的进程
Test-Connection -ComputerName 47.122.65.237 测试网络连通性,ping
$_: 这是 PowerShell 中的特殊变量,表示当前管道中的对象。在 Where-Object 或 ForEach-Object 中使用时,它指的是当前正在处理的对象。
$env:AI_DASHSCOPE_API_KEY 查看环境变量
rsync 上传本地文件,目录需要使用 cygdriver/e/Vue/
查看目录下文件大小 ~/Get-DirSize.ps1 .\dir Get-ChildItem "C:\Users\zmy_1" -Force | ForEach-Object { $s=0; if($_.PSIsContainer){$r=(Get-ChildItem $_.FullName -Recurse -File -EA SilentlyContinue|Measure-Object Length -Sum).Sum; $s=if($r){$r}else{0}}else{$s=$_.Length}; [PSCustomObject]@{Name=$_.Name; Size_MB=[math]::Round($s/1MB,2)} } | Sort-Object Size_MB -Descending | Format-Table -AutoSize
发起网络请求
# 发起GET请求
$response = Invoke-WebRequest -Uri "http://47.122.65.237:3000/DocPreview/api/html-files"
# 显示响应内容
$response.Content
# 将响应内容转换为 json 对象
$jsonResponse = ConvertFrom-Json $response.Content
# 访问对象属性
$jsonResponse.Backend
# 设置请求时间
$response = Invoke-WebRequest -Uri "http://www.example.com" -TimeoutSec 30
# POST 请求
# 创建请求体
$body = @{
key1 = "value1"
key2 = "value2"
} | ConvertTo-Json
# 设置请求头
$headers = @{
'Content-Type' = 'application/json'
}
# 发起POST请求
$response = Invoke-WebRequest -Uri "http://www.example.com/api" -Method POST -Body $body -Headers $headers
# 自定义请求参数:
# 设置请求头
$headers = @{
'Authorization' = 'Bearer your-access-token'
'Content-Type' = 'application/json'
}
# 设置请求体
$body = @{
username = "your_username"
password = "your_password"
} | ConvertTo-Json
# 发起带有认证信息的POST请求
$response = Invoke-WebRequest -Uri "http://www.example.com/api/login" -Method POST -Body $body -Headers $headers
# 列出可用版本
winget search Microsoft.PowerShell
# 安装最新稳定版
winget install --id Microsoft.PowerShell --source winget
# 安装预览版
winget install --id Microsoft.PowerShell.Preview --source winget
删除目录:rm -r -Force "E:\folder_to_delete"
有些命令输出的是对象,查看所有属性和方法 Get-Service | Get-Member 仅查看属性 Get-Service | Get-Member -MemberType Property
对象过滤需要使用 where-object: Get-Service|where-object {$_.Name -eq "mysql"
对于错误输出,可以使用 -ErrorAction SilentlyContinue: Get-Service -ErrorAction SilentlyContinue | Where-Object { $_.Name -like "*sql*" } 或者使用 Get-Service 2>$null
select-string -Path a.txt -Pattern "xxxx" 用来过滤文本
PowerShell 的转义符是反引号 `(而不是反斜杠 \),在双引号字符串中可通过 `n、`t 等表示转义:
发起http请求:(Invoke-WebRequest -method POST -Body '{"model":"gemma3:4b", "prompt":"Why is the sky blue?", "stream": false}' -uri http://localhost:11434/api/generate).Content | ConvertFrom-json
查看端口占用:
# 显示所有正在监听的端口及对应进程
Get-NetTCPConnection | Where-Object { $_.State -eq 'Listen' } | Select-Object LocalPort, OwningProcess | Sort-Object LocalPort | Format-Table
# 检查端口 8080 是否被占用
$port = 8080
$process = Get-NetTCPConnection -LocalPort $port -ErrorAction SilentlyContinue
if ($process) {
Write-Host "端口 $port 被以下进程占用:" -ForegroundColor Red
$process | Format-Table LocalPort, OwningProcess, State -AutoSize
} else {
Write-Host "端口 $port 未被占用" -ForegroundColor Green
}
# 根据端口号查找进程名称和路径
$port = 8080
$pid = (Get-NetTCPConnection -LocalPort $port -ErrorAction SilentlyContinue).OwningProcess
if ($pid) {
Get-Process -Id $pid | Select-Object Id, ProcessName, Path
}
# 强制结束占用 8080 端口的进程
$port = 8080
$pid = (Get-NetTCPConnection -LocalPort $port).OwningProcess
if ($pid) {
Stop-Process -Id $pid -Force
Write-Host "已终止进程 (PID: $pid)" -ForegroundColor Yellow
}