From 2c6244b6f84d5268f6c11a12fb4040cbcc2ef7b5 Mon Sep 17 00:00:00 2001 From: zhangym <40376181+zhangymPerson@users.noreply.github.com> Date: Tue, 29 Oct 2024 20:01:50 +0800 Subject: [PATCH] feat:add powershell reference (#845) --- README.md | 1 + assets/powershell.svg | 28 +++ docs/powershell.md | 391 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 420 insertions(+) create mode 100644 assets/powershell.svg create mode 100644 docs/powershell.md diff --git a/README.md b/README.md index 634c5af2656..f803d082b45 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,7 @@ Quick Reference ## 编程 [Bash](./docs/bash.md) +[Powershell](./docs/powershell.md) [C 语言](./docs/c.md) [C#](./docs/cs.md) [C++](./docs/cpp.md) diff --git a/assets/powershell.svg b/assets/powershell.svg new file mode 100644 index 00000000000..e3515b8e6ad --- /dev/null +++ b/assets/powershell.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/powershell.md b/docs/powershell.md new file mode 100644 index 00000000000..8665e355683 --- /dev/null +++ b/docs/powershell.md @@ -0,0 +1,391 @@ +## 基本命令 + +### 辅助命令 + +**_Powershell 的命令遵循动词-名词格式_** + +一些常见的动词: + +| 动词 | 描述 | +| ------- | ------------------------ | +| Get | 用于检索信息 | +| Set | 用于配置或更改设置 | +| New | 用于创建新对象实例 | +| Remove | 用于删除或移除项目 | +| Invoke | 用于执行特定的操作或动作 | +| Start | 用于启动进程或操作 | +| Stop | 用于停止或终止进程或操作 | +| Enable | 用于激活或启用功能 | +| Disable | 用于停用或禁用功能 | +| Test | 用于执行测试或检查 | +| Update | 用于更新或刷新数据或配置 | + +列出可用模块 + +```powershell +Get-Module --ListAvailable +``` + +列出可用的 cmdlet 和函数 + +```powershell +Get-Command -Module ActiveDirectory +``` + +获取帮助 + +```powershell +Get-Help +Get-Help -Examples +Get-Help -Name Get-Process -Parameter Id +``` + +列出别名及其对应的 cmdlet 名称 + + +```powershell +Get-Alias | Select-Object Name, Definition +``` + +**Get-Member:** 显示对象的属性和方法 + +```powershell +Get-Process | Get-Member +``` + +### 对象操作 + +**Select-Object:** 选择对象的特定属性或自定义其显示 + +```powershell +Get-Process | Select-Object Name, CPU +``` + +**Where-Object:** 根据指定条件过滤对象 + +```powershell +Get-Service | Where-Object { $PSItem.Status -eq 'Running' } +#OR +Get-Service | ? { $_.Status -eq 'Running' } +``` + +**Measure-Object:** 计算对象属性的统计信息,如总和、平均值和计数 + +```powershell +Get-Process | Measure-Object -Property WorkingSet -Sum +``` + +**ForEach-Object:** 对集合中的每个对象执行操作(注意:以下命令将为当前目录中的文件/文件夹添加前缀) + +```powershell +Get-ChildItem | ForEach-Object { Rename-Item $_ -NewName "Prefix_$_" } +``` + +**Sort-Object:** 按指定属性对对象进行排序 + +```powershell +Get-ChildItem | Sort-Object Length -Descending +``` + +**Format-Table:** 将输出格式化为带有指定列的表格 + +```powershell +Get-Service | Format-Table -AutoSize # ft alias +``` + +**Format-List:** 将输出格式化为属性和值的列表 + +```powershell +Get-Process | Format-List -Property Name, CPU # fl alias +``` + +### 文件系统 + +```powershell +New-Item -path file.txt -type 'file' -value 'contents' +New-Item -path file.txt -type 'dir' +Copy-Item -destination +Move-Item -path -destination +Remove-Item +Test-Path +Rename-Item -path -newname + +# using .NET Base Class Library +[System.IO.File]::WriteAllText('test.txt', '') +[System.IO.File]::Delete('test.txt') + +Get-Content -Path "test.txt" +Get-Process | Out-File -FilePath "processes.txt"# 输出到文件 +Get-Process | Export-Csv -Path "processes.csv" # 输出到 CSV +$data = Import-Csv -Path "data.csv" # 从 CSV 导入 +``` + +## 系统管理 + +```powershell +# 获取 BIOS 信息 +Get-CimInstance -ClassName Win32_BIOS +# 获取本地连接的物理磁盘设备信息 +Get-CimInstance -ClassName Win32_DiskDrive +# 获取安装的物理内存(RAM)信息 +Get-CimInstance -ClassName Win32_PhysicalMemory +# 获取安装的网络适配器(物理 + 虚拟)信息 +Get-CimInstance -ClassName Win32_NetworkAdapter +# 获取安装的图形/显卡(GPU)信息 +Get-CimInstance -ClassName Win32_VideoController + +# 列出所有类名 +Get-CimClass | Select-Object -ExpandProperty CimClassName +# 探索 root\cimv2 命名空间中的各种 WMI 类 +Get-CimClass -Namespace root\cimv2 +# 探索 root\cimv2 命名空间下的子 WMI 命名空间 +Get-CimInstance -Namespace root -ClassName __NAMESPACE +``` + +### 网络管理 + +```powershell +# 测试与远程主机的网络连接 +Test-Connection -ComputerName google.com + +# 获取网络适配器信息 +Get-NetAdapter + +# 获取 IP 地址信息 +Get-NetIPAddress + +# 获取路由表信息 +Get-NetRoute + +# 测试远程主机上的端口是否开放 +Test-NetConnection google.com -Port 80 + +``` + +### 用户和组管理 + +```powershell +# 获取本地用户账户信息 +Get-LocalUser + +# 创建新的本地用户账户 +New-LocalUser -Name NewUser -Password (ConvertTo-SecureString "Password123" -AsPlainText -Force) + +# 删除本地用户账户 +Remove-LocalUser -Name UserToRemove + +# 获取本地组信息 +Get-LocalGroup + +# 将成员添加到本地组 +Add-LocalGroupMember -Group Administrators -Member UserToAdd +``` + +### 安全性和权限 + +```powershell +# 获取文件/目录的访问控制列表 +Get-Acl C:\Path\To\File.txt + +# 设置文件/目录的访问控制列表 +Set-Acl -Path C:\Path\To\File.txt -AclObject $aclObject +``` + +### 注册表管理 + +```powershell +# 获取注册表键值 +Get-ItemProperty -Path "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*" | Select DisplayName, DisplayVersion + +# 设置注册表键值 +Set-ItemProperty -Path "HKLM:\Software\MyApp" -Name "SettingName" -Value "NewValue" + +# 创建新的注册表键值 +New-ItemProperty -Path "HKCU:\Software\MyApp" -Name "NewSetting" -Value "NewValue" -PropertyType String + +# 删除注册表键值 +Remove-ItemProperty -Path "HKCU:\Software\MyApp" -Name "SettingToRemove" + +# 检查注册表键是否存在 +Test-Path "HKLM:\Software\MyApp" +``` + +## 脚本 + +### 变量 + +初始化变量,指定或不指定类型: + +```powershell +$var = 0 +[int] $var = 'Trevor' # (抛出异常) +[string] $var = 'Trevor' # (不会抛出异常) +$var.GetType() + +# 多重赋值 +$a,$b,$c = 'a','b','c' + +# 创建数组 +$arrayvar = @('va1','va2') + +# 创建字典 +$dict = @{k1 = 'test'; k2 = 'best'} +``` + +变量命令 + +```Powershell +New-Variable -Name FirstName -Value Trevor +New-Variable FirstName -Value Trevor -Option + +Get-Variable +Get-Variable | ? { $PSItem.Options -contains 'constant' } +Get-Variable | ? { $PSItem.Options -contains 'readonly' } + +Remove-Variable -Name firstname +# 删除只读变量 +Remove-Variable -Name firstname -Force +``` + +变量类型:int32, int64, string, bool + +### 运算符 + +```powershell +# 运算符 +# (a b) + += , += / -= , ++ / -- +-eq / -ne , -lt / -gt , -le / -ge + +$FirstName = 'Trevor' +$FirstName -like 'T*' +$true; $false # 布尔值 true/false + +# 三元运算符 +$FoodToEat = $BaconIsYummy ? 'bacon' : 'beets' + +# -notin 或 -in +'Celery' -in @('Bacon', 'Sausage', 'Steak') + +# 输出: True +5 -is [int32] + +# 正则表达式匹配,可以使用数组 +'Trevor' -match '^T\w*' + +# 查找多个匹配项 +$regex = [regex]'(\w*)' +$regex.Matches('this is test').Value + +``` + +### Structure + +#### 输入输出操作 + +```powershell +"This displays a string" + +Write-Host "color" -ForegroundColor Red + +$age = Read-host "Enter age" + +$pwd = Read-host "password" -asSecureString + +Clear-Host +``` + +#### 流控制 + +```powershell +IF(<#Condition#>){ +<#Commands#>}ELSEIF(){}ELSE{} + +Switch($var){ + "val1"{<#Commands#>; break} + "val2"{<#Commands#>; break} +} + +For($ct=0;$ct -le 3;$ct++){} + +ForEach($var in $arr){} + +while($var -ne 0){} + +Do{}While() + +``` + +### 函数 / 模块 + +#### 示例 1 + +```powershell +function funcname{ + + [CmdletBinding()] + param( + [Parameter(Mandatory)] + [String]$user + ) + Write-Host "welcome " $user + return "value" +} +$var = funcname -user pcb +``` + +#### 示例 2 + +```powershell +function Get-EvenNumbers { + [CmdletBinding()] + param ( + [Parameter(ValueFromPipeline = $true)] + [int] $Number + ) + begin {<#command#>} + process { + if ($Number % 2 -eq 0) { + Write-Output $Number + } + } + end {<#command#>} +} +1..10 | Get-EvenNumbers + +``` + +#### 模块 + +```powershell +# PowerShell 在路径中查找模块 +$env:PSModulePath + +# 列出系统上安装的所有模块 +Get-Module -ListAvailable +# 列出当前会话中导入的模块 +Get-Module + +Import-Module +Remove-Module + +Find-Module -Tag cloud +Find-Module -Name ps* + +# 创建一个内存中的 PowerShell 模块 +New-Module -Name trevor -ScriptBlock { + function Add($a,$b) { $a + $b } } + +``` + +### 注意 + + +- 在大多数语言中,转义字符是反斜杠 **\\**,而在 PowerShell 中是反引号 **`** + + +## 参考 + +- [Microsoft Powershell](https://learn.microsoft.com/en-us/powershell/scripting/samples/sample-scripts-for-administration?view=powershell-7.3) _(learn.microsoft.com)_ +- [cheatsheets](https://cheatsheets.zip/powershell)