Windows powershell 常用代码段

变量与环境变量设置

# 变量设置
$Username=user
$Password=password

# 临时环境变量设置,powershell窗口关闭则失效
$env:Username="user"
$env:FadadaPassword="password"

# 永久生效的环境变量,系统级别
[environment]::SetEnvironmentvariable("JRE_HOME","C:\Program Files\Java\jdk1.7.0_80\jre","Machine")

# 永久生效的环境变量,当前用户
[environment]::SetEnvironmentvariable("JRE_HOME","C:\Program Files\Java\jdk1.7.0_80\jre","User")

# 通配查看环境变量
ls Env:test-*

下载不保存powershell脚本直接运行

$Username=user
$password=password
$Script="https://example.com/example.ps1"
# 下载地址为http时,去掉下面一行
[Net.ServicePointManager]::SecurityProtocol=[Net.SecurityProtocolType]::Tls12
$Wc=new-object System.Net.WebClient
$CredCache=new-object System.Net.CredentialCache
$Creds=new-object System.Net.NetworkCredential($env:ExampleUsername,$password)
$Wc.Credentials=$CredCache.Remove("$Script","Basic")
$CredCache.Add("$Script", "Basic", $Creds)
$Wc.Credentials=$CredCache
iex $Wc.DownloadString($Script)

一个简单的带时间戳的日志输出函数

function LogTime($Log)
{
    Get-Date -Format 'yyyy-MM-dd-HH_hh:mm:ss' | Tee-Object -Variable NowTime
    Write-Host "$NowTime $Log"
    "$NowTime $Log"|Out-File -Append "C:\info.log"
}

# 使用方法
LogTime($Log)

http状态码检测函数,状态码大于400表示网络联通性无误

function TestHttpStatusCode($url)
{
	$req = [system.Net.WebRequest]::Create($url)

	try {
		$res = $req.GetResponse()
	} 
	catch [System.Net.WebException] {
		$res = $_.Exception.Response
	}
    $HttpStatusCode=[int]$res.StatusCode
    if ( $HttpStatusCode -gt 400 -and $HttpStatusCode -ne 401) {
        LogTime("${url}无法访问,状态码为${HttpStatusCode}!!!")
        exit
    }
    else {
        LogTime("${url}连通性检测通过!!!")
    }
}

# 使用方法
$Addrs="https://baidu.com","http://qq.com"
foreach ($Addr in $Addrs) {
    TestHttpStatusCode("$Addr")
}

下载文件函数

function DownloadFile($Rfile)
{
    $Tempdir=C:\Tempdir
    $Username=user
    $Password=password
    # 访问地址为http时,去掉下面一行
    [Net.ServicePointManager]::SecurityProtocol=[Net.SecurityProtocolType]::Tls12
    $Filename=$Rfile.Split("/")[$Rfile.Split("/").Length-1]
    $Username=$env:ExampleUsername
    $Password=SystemTo-SecureString $env:ExamplePassword -AsPlainText -Force
    $Redential=New-Object System.Management.Automation.PSCredential($Username,$Password)
    LogTime("正在下载文件:${Rfile}")
    Invoke-WebRequest -Uri $Rfile -OutFile "${Tempdir}\${Filename}" -Credential $Redential
    if (-not $?){
        exit
    }
}

# 使用方法
$Files = $Hashtable.ExampleSystemSignPkg,"https://example.com/1.txt","https://example.com/2.txt"
foreach ($File in $Files) {
    DownloadFile("$File")
}

创建程序快捷方式至桌面函数

$Desktop = [System.Environment]::GetFolderPath('Desktop')
function SaveDesktopShortcut([string]${TargetFile}, [string]${ShortcutName}, [string]${IconLocation})
{
$Shell = New-Object -ComObject WScript.Shell
Remove-Item ${Desktop}\${ShortcutName}'.lnk' -Recurse -ErrorAction SilentlyContinue
$Shortcut = $Shell.CreateShortcut("${Desktop}\${ShortcutName}"+'.lnk')
$Shortcut.TargetPath = "$TargetFile"
$Shortcut.IconLocation = "$IconLocation"
$Shortcut.Save()
}

# 使用方法
SaveDesktopShortcut "C:\navicat\Navicat for MySQL\navicat.exe" "NavicatForMySQL" "C:\navicat\Navicat for MySQL\navicat.exe"

读取配置文件

# example.conf内容
k1=123
k2=456

$Hashtable = @{}
$Payload = Get-Content -Path 'example.conf' |
Where-Object { $_ -like '*=*' } |
ForEach-Object {
    $Infos = $_ -split '='
    $Key = $Infos[0].Trim()
    $Value = $Infos[1].Trim()
    $Hashtable.$Key = $Value
}

# 使用方法,k1为example.conf中的键
$Hashtable.k1
$Hashtable.k2

获取系统CPU、内存信息

$SysMemory=$([Math]::Round((Get-WmiObject -Class Win32_ComputerSystem).TotalPhysicalMemory /1gb))
$Cpu=get-wmiobject win32_processor
$SysCpuProcessors=@($Cpu).count*$Cpu.NumberOfLogicalProcessors

for循环

for($t=5; $t -ge 0; $t=$t-1)
{
    LogTime("${t}秒后检查系统资源(CPU、内存、磁盘)是否充足!!!")
    Start-Sleep -Seconds 1
}

防火墙管理

# 启用Windows防火墙
Set-NetFirewallProfile -All -Enabled true

# 清理法大大历史防火墙规则
Remove-NetfirewallRule -DisplayName "Tcp8080" -ErrorAction SilentlyContinue
Remove-NetfirewallRule -DisplayName "Tcp8887" -ErrorAction SilentlyContinue

# 创建防火墙规则:Tcp8080 Tcp8887
New-NetFirewallRule -Name Tcp8080 -Direction Inbound -DisplayName 'Tcp8080' -LocalPort 8080 -Protocol 'TCP' -ErrorAction SilentlyContinue
New-NetFirewallRule -Name Tcp8887 -Direction Inbound -DisplayName 'Tcp8887' -LocalPort 8887 -Protocol 'TCP' -ErrorAction SilentlyContinue

文本字符串替换

$ConfigFile=a.conf
$CatalinaFile=catalina.bat
SystemConfig=System.conf

# 简单字符串替换,
(Get-Content "$ConfigFile") | Foreach-Object {$_ -replace '256',"${SystemMaxMemoryMB}"} | Set-Content "$ConfigFile"
# 字符串替换,带字符串拼接
(Get-Content -Encoding utf8 "$CatalinaFile") | Foreach-Object {$_ -replace 'Xmx3g',"Xmx${SystemMaxMemory}g"} | Set-Content -Encoding utf8 "$CatalinaFile"
# 字符串替换,以test开头的全部替换
(Get-Content -Encoding utf8 "$SystemConfig") | Foreach-Object {$_ -replace '(?<=^)test.*',"qcloud.secretkey=$Hashtable.ExampleQcloudSecretKey"} | Set-Content -Encoding utf8 "$SystemConfig"
# 字符串替换,带转义的
(Get-Content -Encoding utf8 "$SystemConfig") | Foreach-Object {$_ -replace '=D\\:','=C:'}  | Set-Content -Encoding utf8 "$SystemConfig"
上一篇:在网页上直接运行Win11,5秒内用AI克隆自己的声音 | 蛮三刀酱的Github周刊第二期


下一篇:Powershell 源码批判