提高开发效率!提高电脑使用效率!powershell7 非常有用的脚本和命令分享!

本文详细介绍了如何在Powershell7中管理环境变量,如设置和获取用户级别变量,以及执行文件操作、计划任务、命令别名和函数定义。还涵盖了错误处理、模块使用和工具如CertUtil的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Github 仓库长期频繁更新!

文章摘录自 Lim-note-CLI | linhieng

只记录 powershell7 内容

注意事项:

  • 调用函数时,没有括号!
  • 脚本使用 utf8 BOM 编码

环境变量

  • [Environment]::SetEnvironmentVariable(KEY, VALUE)
  • [Environment]::GetEnvironmentVariable
[Environment]::SetEnvironmentVariable("NODE_HOME", $(npm root -g), "User")
# 添加用户环境变量。
# [Environment]::SetEnvironmentVariable() 是一个 .NET Framework 中 System.Environment 类
# 的静态方法,用于设置环境变量。


# 设置环境变量名和值
$envVariableName = "NGINX_HOME"
$envVariableValue = "C:\soft\it\nginx-1.25.4"
# 使用 [System.Environment]::SetEnvironmentVariable() 方法添加环境变量到用户级别
[System.Environment]::SetEnvironmentVariable($envVariableName, $envVariableValue, [System.EnvironmentVariableTarget]::User)
# 或者直接写成下面这样也是可以的
[Environment]::SetEnvironmentVariable("HELLO", "WORLD", "User")

[Environment]::SetEnvironmentVariable("TEMPORARY_KEY", "hello, world")
# 临时的环境变量

[Environment]::GetEnvironmentVariable("NGINX_HOME")
# 获取环境变量
  • env:
  • $env
$env:NGINX_HOME
# 输出环境变量 NGINX_HOME
# 如果是用户权限,则只能获取用户级别的环境变量
# 如果是管理员权限,则可以获取系统级别的环境变量


Get-ChildItem env:
ls env:
# 获取环境变量 $env 的值
# 能获取什么级别,取决于运行的模式(用户还是管理员)

$env:<key> = "<value>"
# 设置临时环境变量,

explorer $env:LOCALAPPDATA
# 使用环境变量

其他

gv
Get-Variable
# 查看当前 powershell 的变量

常用的 Windows 内置变量

Windows 中一些我觉得有用的全局变量,内容提取自 ls env:

envpath
SystemDriveC:
HOMEDRIVEC:
SystemRootC:\Windows
windirC:\Windows
PUBLICC:\Users\Public
USERPROFILEC:\Users{username}
APPDATAC:\Users{username}\AppData\Roaming
LOCALAPPDATAC:\Users{username}\AppData\Local
TEMPC:\Users{username}\AppData\Local\Temp
TMPC:\Users{username}\AppData\Local\Temp
ProgramDataC:\ProgramData
ALLUSERSPROFILEC:\ProgramData
ProgramFilesC:\Program Files
ProgramFiles(x86)C:\Program Files (x86)
CommonProgramFilesC:\Program Files\Common Files
CommonProgramFiles(x86)C:\Program Files (x86)\Common Files
COMPUTERNAMEDESKTOP-???
HOMEPATH\Users{username}
LOGONSERVER\{HOST_NAME}
PROCESSOR_ARCHITECTUREAMD64
USERDOMAIN{HOST_NAME}
USERNAME{username}

文件和文件夹

  • Copy-Item
  • Get-Content
  • New-Item
  • Get-ChildItem

案例

Copy-Item -Path "D:\draft\all-code-tmp\MyTool.psm1" -Destination "$PSHOME\Modules\MyTool"
# 将文件拷贝到指定目录

Get-Content G:\backup-mysql\db01.sql | mysql -uroot -p old_db01
# 导入 sql 文件

New-Item -ItemType SymbolicLink -Target (npm root -g) -Path "$HOME\.node_modules" -Force
# 以管理员方式运行。强制创建文件夹 $HOME\.node_modules,并将其指向 npm 全局模块中。
# 注意创建的是符号链接,而不是 win 中的快捷方式

cd C:\soft\it\mkcert
New-Item -ItemType SymbolicLink -Target .\mkcert-v1.4.4-windows-amd64.exe -Path mkcert.exe
# 为 mkcert-v1.4.4-windows-amd64.exe 创建一个软连接,名为 mkcert.exe 注意要有后缀名 exe
# 或者,如果已经添加 C:\soft\it\mkcert 到 path,则可以不需要移动到 mkcert,直接:
New-Item -ItemType SymbolicLink -Target mkcert-v1.4.4-windows-amd64.exe -Path C:\soft\it\mkcert\mkcert.exe
# 注意两个 .exe 都不能省略。

New-Item -Path '<new_directory_url>' -ItemType Directory
# 创建文件夹

New-Item -Path '<new_file_url>' -ItemType File
# 创建文件,如果文件已存在则报错

New-Item -Force -Path '<new_file_url>' -ItemType File
# 强制创建文件,如果文件已存在则会被覆盖

Get-ChildItem -Path . -Recurse -Exclude "node_modules" -File | Where-Object { $_.Name -like "playwright.config*" }
# 在该目录下查找 playwright.config 开头文件,并忽略 node_modules 文件夹

获取 lnk 文件的指向

function get_lnk_target($fullpath) {
  $sh = New-Object -ComObject WScript.Shell
  $target = $sh.CreateShortcut($fullpath).TargetPath
  return $target
}

系统和硬件相关信息、pwsh 版本

$PSVersionTable
$host.version
Get-Host
# pwsh 版本信息


(Get-CimInstance win32_processor).NumberOfLogicalProcessors
# 获取逻辑处理器个数

获取硬件 ID 相关命令。
注意,没有什么是能够绝对标识唯一主机的,相对靠谱的是主板 UUID。


systeminfo
# 获取系统信息,包括:
# 网卡 MAC 地址、BIOS、虚拟化支持等等

wmic cpu get processorid
# 可以获取 CPU ID。(并不唯一,Intel现在可能同一批次的CPU ID都一样)
# 实测,重装系统不会改变它

wmic diskdrive get serialnumber
# 获取硬盘序列号。(不一定所有的电脑都能获取到硬盘序列号)
# 实测,重装系统不会改变它

wmic csproduct get UUID
# 主板序列号(不是所有的厂商都提供一个UUID,可能返回一个全 F 的无效 UUID)
# dmidecode -s system-uuid 用于 linux 获取主板 UUID
# 实测,重装系统不会改变它

样式、颜色

# 定义颜色数组
$colors = @(
    "Black", "DarkBlue", "DarkGreen", "DarkCyan",
    "DarkRed", "DarkMagenta", "DarkYellow", "Gray",
    "DarkGray", "Blue", "Green", "Cyan",
    "Red", "Magenta", "Yellow", "White"
)

# 遍历数组并输出每种颜色的示例
foreach ($color in $colors) {
    Write-Host "This is $color text" -ForegroundColor $color
}

计划任务

更多配置项可以参考:new-scheduledtasksettingsset

$taskName = "MyTask"

# 检查任务是否存在
$taskExists = Get-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue

# 如果任务存在,则删除它
if ($taskExists) {
    Unregister-ScheduledTask -TaskName $taskName -Confirm:$false
} else {
    Write-Host "任务 $taskName 不存在,不需要删除。"
}

# 如果需要隐藏窗口,可以直接在 Start-Process 后添加 -WindowStyle hidden
$action = New-ScheduledTaskAction -Execute "pwsh.exe" -Argument "-Command `"Start-Process -FilePath pwsh.exe -ArgumentList 'D:\github-code\AutoTask\scripts\auto-push.ps1'`""
# 每晚 10:20 分
$trigger = New-ScheduledTaskTrigger -Daily -At "10:20:00 PM"
# 需要有网络时才运行
$settings = New-ScheduledTaskSettingsSet -Hidden -RunOnlyIfNetworkAvailable
$description = "这是一个定时推送本地 git 仓库的计划任务"
Register-ScheduledTask -TaskName $taskName -Action $action -Trigger $trigger -Settings $settings -Description $description

零碎,暂不成体系

命令别名、函数

New-Alias -Name "ls" -Value "Get-ChildItem"
# 为一个命令提供别名。只能是命令,不支持参数。
# New-Alias -Name "ll" -Value "get-childitem -af -h" ❌


# 想要为多个命令使用别名,可以采用函数的方式
function Get-NginxProcesses {
  tasklist | Select-Object -First 3
  tasklist | findstr "imagename eq nginx.exe"
}
Get-NginxProcesses


function hello_world {
  param(
    [string] $hello,
    [string] $world
  )

  Write-Host $hello $world -ForegroundColor "green"
}

hello_world -hello "你好" -world "世界"

错误处理

function test {
  throw "这是一个自定义错误"
}

try {
  test
} catch {
  Write-Host $_
}

模块

Write-Host $PSHOME\Modules
# 查看模块路径。pwsh

Copy-Item -Path "D:\draft\all-code-tmp\MyTool.psm1" -Destination "$PSHOME\Modules\MyTool"
# 模块内要有一个文件名与模块名相同

Get-Command -Module MyTool
# 查看模块

Hello-World
# 直接运行模块内的函数

工具 CertUtil, Get-Command

CertUtil -hashfile <file_url> [<hash>]
# 可用于计算文件的哈希值。默认 SHA1,还支持 MD5, SHA256 等

Get-Command
# 获取所有可运行命令。替代 where。案例:
(Get-Command cmd).Path
(Get-Command cmd).Source

其他 ForEach-Object, Start-Process

ls | ForEach-Object { echo $_ }
# ForEach-Object { } 是 PowerShell 中的一个 cmdlet,用于迭代集合中的每个对象
# $_ 代表当前迭代的对象

Start-Process -WindowStyle hidden -FilePath pwsh.exe -ArgumentList "D:\draft\all-code-tmp\test.ps1"
# 隐藏窗口运行脚本

脚本参数

在 a.ps1 中

Start-Process -FilePath pwsh.exe -ArgumentList "-File", "D:\draft\all-code-tmp\x.ps1", "-param1", "value1", "-param2", "value2"

在 D:\draft\all-code-tmp\x.ps1 文件夹中:

param (
    [string]$param1,
    [string]$param2
)

Write-Host "参数1:$param1"
Write-Host "参数2:$param2"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值