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)