PowerShell 技能连载 - 使用 PowerShell 自动化 Windows 11 任务:实用指南

您想通过自动化Windows 11系统上的各种任务来节省时间和精力吗?如果是这样,您应该学习如何使用PowerShell,这是一种强大的脚本语言和命令行工具,可以帮助您更快速、更轻松地完成任务。在本博客中,我们将向您展示如何使用PowerShell来自动化Windows 11上常见或复杂任务的一些实际示例,例如:

  • 使用PowerShell管理网络设置和连接
  • 使用PowerShell监视系统性能和资源
  • 使用PowerShell备份和恢复文件夹与文件
  • 使用PowerShell安装和更新Windows功能
  • 使用PowerShell创建并运行定时任务

使用 PowerShell 管理网络设置与连接

PowerShell 可以帮助您轻松高效地管理 Windows 11 系统上的网络设置与连接。您可以使用 PowerShell 执行各种操作,比如配置 IP 地址、DNS 服务器、防火墙、代理以及 VPN。 您还可以使用 PowerShell 测试网络连通性、ping 命令、traceroute 和解析主机名。

1
2
3
4
5
6
7
8
9
10
11
# 定义接口别名, IP 地址, 子网掩码, 网关 和 DNS 服务器
$interface = "Ethernet"
$ip = "192.168.1.100"
$subnet = "255.255.255.0"
$gateway = "192.168.1.1"
$dns = "8.8.8.8"

# 设置接口的IP地址, DNS服务器 和 防火墙配置文件
Set-NetIPAddress -InterfaceAlias $interface -IPAddress $ip -PrefixLength $subnet -DefaultGateway $gateway
Set-DnsClientServerAddress -InterfaceAlias $interface -ServerAddresses $dns
Set-NetFirewallProfile -Profile Private -Enabled True

使用 PowerShell 监控系统性能和资源

PowerShell 可以帮助您轻松高效地监控 Windows 11 系统的系统性能和资源。您可以使用 PowerShell 执行各种操作,如获取 CPU、内存、磁盘和网络使用情况,测量命令或脚本的执行时间和内存消耗,并生成性能报告和图表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# PowerShell script for monitoring system performance
# Define the performance counters for CPU and memory usage
$cpu = "\Processor(_Total)\% Processor Time"
$memory = "\Memory\Available MBytes"

# Get the performance counter data for CPU and memory usage
$data = Get-Counter -Counter $cpu,$memory -SampleInterval 1 -MaxSamples 10

# Create a chart object from the performance counter data
$chart = New-Object System.Windows.Forms.DataVisualization.Charting.Chart
$chart.Width = 800
$chart.Height = 600
$chart.BackColor = "White"

# Add a chart area, a series for CPU usage, a series for memory usage, and a legend to the chart object
$area = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea
$area.AxisX.Title = "Time (seconds)"
$area.AxisY.Title = "Usage (%)"
$area.AxisY2.Title = "Available (MB)"
$chart.ChartAreas.Add($area)

$series1 = New-Object System.Windows.Forms.DataVisualization.Charting.Series
$series1.Name = "CPU"
$series1.ChartType = "Line"
$series1.Color = "Red"
$series1.BorderWidth = 3
$series1.Points.DataBindXY($data.Timestamps,$data.CounterSamples[0].CookedValue)
$chart.Series.Add($series1)

$series2 = New-Object System.Windows.Forms.DataVisualization.Charting.Series
$series2.Name = "Memory"
$series2.ChartType = "Line"
$series2.Color = "Blue"
$series2.BorderWidth = 3
$series2.YAxisType = "Secondary"
$series2.Points.DataBindXY($data.Timestamps,$data.CounterSamples[1].CookedValue)
$chart.Series.Add($series2)

$legend = New-Object System.Windows.Forms.DataVisualization.Charting.Legend
$legend.Docking = "Top"
$chart.Legends.Add($legend)

# Save the chart object as an image file
$chart.SaveImage("C:\Performance.png","png")

使用 PowerShell 备份和恢复文件夹

PowerShell 可以帮助您轻松高效地备份和恢复 Windows 11 系统中的文件夹。您可以使用 PowerShell 执行各种操作,如创建、复制、移动、重命名、删除、搜索和压缩文件夹。您还可以使用 PowerShell 创建和使用备份策略、备份集和备份项。

1
2
3
4
5
6
7
8
9
10
11
12
13
# PowerShell script for backing up and restoring files and folders
# Define the folder to backup and the backup location
$folder = "C:\Users\YourName\Documents"
$location = "D:\Backup"

# Create a backup policy that runs daily and keeps backups for 30 days
$policy = New-BackupPolicy -Frequency Daily -RetentionPeriod 30

# Set the backup policy for the computer
Set-BackupPolicy -Policy $policy

# Backup the folder to the backup location
Backup-File -Source $folder -Destination $location

Here is a summary of a PowerShell script that restores a file or folder from a backup to a specified location:

1
2
3
4
5
6
7
8
9
10
11
12
13
# Define the file or folder to restore and the restore location
$file = "C:\Users\YourName\Documents\Report.docx"
$location = "C:\Users\YourName\Desktop"

# Get the latest backup set that contains the file or folder
$set = Get-BackupSet | Sort-Object -Property CreationTime -Descending | Select-Object -First 1

# Get the backup item that matches the file or folder
$item = Get-BackupItem -BackupSet $set -Path $file

# Restore the file or folder to the restore location
Restore-File -BackupItem $item -Destination $location

使用 PowerShell 安装和更新 Windows 功能

PowerShell 可以帮助您轻松高效地在 Windows 11 系统上安装和更新 Windows 功能。您可以使用 PowerShell 执行各种操作,如列出、启用、禁用或更新诸如 Hyper-V、Windows 子系统 for Linux 或 Windows 沙盒等 Windows 功能。

1
2
3
# 用于安装和更新 Windows 功能的 PowerShell 脚本
# 在计算机上安装 Hyper-V 功能
Install-WindowsFeature -Name Hyper-V -IncludeManagementTools -Restart

以下是一个概要说明了一个 PowerShell 脚本,该脚本从计算机中卸载了 Windows 子系统 for Linux 功能并移除相关文件:

1
2
# 从计算机中卸载 Windows 子系统 for Linux 功能
Uninstall-WindowsFeature -Name Microsoft-Windows-Subsystem-Linux -Remove

使用 PowerShell 创建和运行定时任务

PowerShell 可以帮助您轻松高效地在 Windows 11 系统上创建和运行定时任务。您可以使用 PowerShell 执行各种操作,如创建、注册、启动、停止或禁用定时任务,例如运行一个 PowerShell 脚本、发送电子邮件或显示消息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 用于创建和运行定时任务的 PowerShell 脚本
# 定义要运行的 PowerShell 脚本
$script = "C:\Scripts\Backup.ps1"

# 创建一个新的定时任务动作来运行这个 PowerShell 脚本
$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-File $script"

# 创建一个新的触发器,在每天早上10点执行该任务
$trigger = New-ScheduledTaskTrigger -Daily -At 10am

# 创建一组新的设置,如果任务执行时间过长则停止该任务
$setting = New-ScheduledTaskSettingSet -ExecutionTimeLimit (New-TimeSpan -Minutes 30)

# 在计算机上注册这个新的定时任务,并指定名称、动作、触发器及设置
Register-ScheduledTask –Name "Backup" –Action $action –Trigger $trigger –Setting $setting

结论

PowerShell 是一款多才多艺且强大的工具,可帮助您自动化处理在Windows 11系统上进行各种操作。您可以在官方PowerShell文档中找到更多关于PowerShell 的信息和示例。感谢阅读此篇博客文章。希望对你有所帮助并且有趣。 😊

PowerShell 技能连载 - AI 集成技巧

在 PowerShell 中集成 AI 功能是一项前沿任务,本文将介绍一些实用的 AI 集成技巧。

首先,让我们看看如何与 OpenAI API 进行交互:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 创建 OpenAI 交互函数
function Invoke-OpenAIAPI {
param(
[string]$ApiKey,
[string]$Prompt,
[ValidateSet('gpt-4', 'gpt-3.5-turbo')]
[string]$Model = 'gpt-3.5-turbo',
[float]$Temperature = 0.7,
[int]$MaxTokens = 500
)

try {
$headers = @{
'Content-Type' = 'application/json'
'Authorization' = "Bearer $ApiKey"
}

$body = @{
model = $Model
messages = @(
@{
role = "user"
content = $Prompt
}
)
temperature = $Temperature
max_tokens = $MaxTokens
} | ConvertTo-Json

$response = Invoke-RestMethod -Uri "https://api.openai.com/v1/chat/completions" -Method Post -Headers $headers -Body $body
return $response.choices[0].message.content
}
catch {
Write-Host "OpenAI API 调用失败:$_"
}
}

使用 AI 生成 PowerShell 脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 创建 AI 脚本生成函数
function New-AIScript {
param(
[string]$ApiKey,
[string]$Description,
[string]$OutputPath
)

try {
$prompt = @"
生成一个 PowerShell 脚本,完成以下功能:$Description

要求:
1. 脚本应包含详细的注释
2. 包含适当的错误处理
3. 遵循 PowerShell 最佳实践
4. 只返回脚本代码,不要额外的解释
"@

$script = Invoke-OpenAIAPI -ApiKey $ApiKey -Prompt $prompt -MaxTokens 2000

if ($OutputPath) {
$script | Out-File -FilePath $OutputPath -Encoding UTF8
Write-Host "脚本已保存至:$OutputPath"
}

return $script
}
catch {
Write-Host "AI 脚本生成失败:$_"
}
}

利用 AI 进行日志分析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 创建 AI 日志分析函数
function Analyze-LogsWithAI {
param(
[string]$ApiKey,
[string]$LogFilePath,
[string]$OutputPath,
[switch]$IncludeRecommendations
)

try {
$logs = Get-Content -Path $LogFilePath -Raw

# 将日志截断到合理的大小
if ($logs.Length -gt 4000) {
$logs = $logs.Substring(0, 4000) + "... [日志截断]"
}

$promptSuffix = ""
if ($IncludeRecommendations) {
$promptSuffix = "并提供解决方案建议。"
}

$prompt = @"
分析以下系统日志,识别可能的错误、警告和问题模式$promptSuffix

日志内容:
$logs
"@

$analysis = Invoke-OpenAIAPI -ApiKey $ApiKey -Prompt $prompt -MaxTokens 1500

if ($OutputPath) {
$analysis | Out-File -FilePath $OutputPath -Encoding UTF8
Write-Host "分析结果已保存至:$OutputPath"
}

return $analysis
}
catch {
Write-Host "AI 日志分析失败:$_"
}
}

AI 辅助的自动化故障排除:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 创建 AI 故障排除函数
function Start-AITroubleshooting {
param(
[string]$ApiKey,
[string]$Issue,
[switch]$RunDiagnostics
)

try {
$systemInfo = Get-ComputerInfo | ConvertTo-Json

if ($RunDiagnostics) {
$eventLogs = Get-WinEvent -LogName Application -MaxEvents 20 | Select-Object TimeCreated, LevelDisplayName, Message | ConvertTo-Json
$services = Get-Service | Where-Object { $_.Status -eq 'Stopped' -and $_.StartType -eq 'Automatic' } | ConvertTo-Json

$diagnosticInfo = @"
系统信息:
$systemInfo

最近事件日志:
$eventLogs

已停止的自动启动服务:
$services
"@
} else {
$diagnosticInfo = "系统信息:$systemInfo"
}

$prompt = @"
我有以下系统问题:$Issue

基于以下系统信息,提供排查步骤和可能的解决方案:

$diagnosticInfo
"@

$troubleshooting = Invoke-OpenAIAPI -ApiKey $ApiKey -Prompt $prompt -MaxTokens 2000 -Model 'gpt-4'

return $troubleshooting
}
catch {
Write-Host "AI 故障排除失败:$_"
}
}

使用 AI 优化 PowerShell 脚本性能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 创建 AI 脚本优化函数
function Optimize-ScriptWithAI {
param(
[string]$ApiKey,
[string]$ScriptPath,
[string]$OutputPath,
[switch]$IncludeExplanation
)

try {
$script = Get-Content -Path $ScriptPath -Raw

$promptSuffix = ""
if ($IncludeExplanation) {
$promptSuffix = "并解释所做的改动和优化理由。"
}

$prompt = @"
优化以下 PowerShell 脚本的性能和代码质量$promptSuffix

脚本内容:
$script
"@

$optimizedScript = Invoke-OpenAIAPI -ApiKey $ApiKey -Prompt $prompt -MaxTokens 2000 -Model 'gpt-4'

if ($OutputPath) {
$optimizedScript | Out-File -FilePath $OutputPath -Encoding UTF8
Write-Host "优化后的脚本已保存至:$OutputPath"
}

return $optimizedScript
}
catch {
Write-Host "AI 脚本优化失败:$_"
}
}

这些技巧将帮助您更有效地在 PowerShell 中集成 AI 功能。记住,在处理 AI 相关任务时,始终要注意 API 密钥的安全性和成本控制。同时,建议使用适当的错误处理和日志记录机制来跟踪所有操作。

PowerShell 技能连载 - 错误处理机制

异常处理基础结构

1
2
3
4
5
6
7
8
9
10
11
12
try {
Get-Content -Path '不存在的文件.txt' -ErrorAction Stop
}
catch [System.IO.FileNotFoundException] {
Write-Warning "文件未找到: $($_.Exception.Message)"
}
catch {
Write-Error "未知错误: $_"
}
finally {
Write-Output "清理操作完成"
}

错误类型识别

  1. 终止错误:必须使用-ErrorAction Stop
  2. 非终止错误:通过$Error自动变量捕获

高级处理技巧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 自定义错误记录
$ErrorActionPreference = 'Continue'
$ErrorView = 'NormalView'

function Invoke-SafeOperation {
[CmdletBinding()]
param([scriptblock]$ScriptBlock)

try {
& $ScriptBlock
}
catch {
[PSCustomObject]@{
Timestamp = Get-Date
ErrorType = $_.Exception.GetType().Name
Message = $_.Exception.Message
ScriptLine = $_.InvocationInfo.ScriptLineNumber
} | Export-Csv -Path 'errors.log' -Append
}
}

最佳实践

  1. 区分可恢复与不可恢复错误
  2. 使用ErrorRecord对象获取完整信息
  3. 通过$ErrorActionPreference控制默认行为
  4. 定期清理$Error自动变量
1
2
3
4
# 错误信息增强处理
$Error[0] | Select-Object *
$Error[0].InvocationInfo | Format-List *
$Error[0].Exception | Format-List *

PowerShell blog post collection (2023-04 ~ 2024-03)

2023 年 04 月

2023 年 05 月

2023 年 06 月

2023 年 07 月

2023 年 08 月

2023 年 09 月

2023 年 10 月

2023 年 11 月

2024 年

2024 年 01 月

2024 年 02 月

2024 年 03 月

PowerShell 技能连载 - PowerShell函数的手把手指南

为了在多个脚本中重复使用相同的代码,我们使用PowerShell函数。

PowerShell函数是一组已经被命名的PowerShell语句。每当我们想要运行一个函数时,我们需要输入它的名称。

函数可以像cmdlet一样具有参数。可以通过管道或命令行访问函数参数。
它们返回一个值,该值可以赋给变量或作为命令行参数或函数参数传递。为了指定返回值,我们可以使用关键字return

函数语法

以下是用于Function的语法。

1
2
3
4
5
6
7
8
function [<scope:>]<name> [([type]$parameter1[,[type]$parameter2])]
{
param([type]$parameter1 [,[type]$parameter2])
dynamicparam {<statement list>}
begin {<statement list>}
process {<statement list>}
end {<statement list>}
}

以上语法中包括以下术语:

  1. 一个函数关键短语
  2. 您选择的名称
  3. 功能范围(可选)
  4. 可以有任意数量的命名参数。
  5. 一个或多个 PowerShell 命令被大括号括起来。

函数示例:

1
2
3
4
5
6
7
8
9
function Operation{
$num1 = 8
$num2 = 2
Write-Host "Multiply : $($num1*$num2)"
Write-Host "Addition : $($num1+$num2)"
Write-Host "Subtraction : $($num1-$num2)"
Write-Host "Divide : $($num1 / $num2)"
}
Operation

结果:

1
2
3
4
Multiply : 16
Addition : 10
Subtraction : 6
Divide : 4

函数范围

  • 在 PowerShell 中,函数存在于创建它的范围内。
  • 如果一个函数包含在脚本中,那么它只能在该脚本中的语句中使用。
  • 当我们在全局范围指定一个函数时,我们可以在其他函数、脚本和命令中使用它。

PowerShell 中的高级功能

高级功能是可以执行类似于 cmdlet 执行的操作的功能。当用户想要编写一个不必编写已编译 cmdlet 的函数时,他们可以使用这些功能。

使用已编译 cmdlet 和高级功能之间主要区别是已编译 cmdlet 是.NET Framework 类,必须用.NET Framework 语言编写。此外,高级功能是用 PowerShell 脚本语言编写的。

以下示例展示了如何使用 PowerShell 的高级功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function show-Message
{
[CmdletBinding()]
Param (
[ Parameter (Mandatory = $true)]

[string] $Name
)
Process
{
Write-Host ("Hi $Name !")
write-host $Name "today is $(Get-Date)"
}
}

show-message

结果:

1
2
3
4
5
cmdlet show-Message at command pipeline position 1
Supply values for the following parameters:
Name: Dhrub
Hi Dhrub !
Dhrub today is 09/01/2021 13:41:12

结论

我们在每种语言中都使用函数,通常会减少代码的行数。如果您的代码有1000行,那么借助函数的帮助,您可以将计数降至500。希望您喜欢这篇文章,我们下一篇文章再见。

PowerShell 技能连载 - 轻松掌握PowerShell中的ErrorAction

PowerShell 是一种强大的脚本语言,允许用户轻松自动化任务和管理系统。PowerShell 的一个关键特性是 ErrorAction 参数,它允许用户控制脚本或命令中如何处理错误。

理解 PowerShell 中的 ErrorAction

ErrorAction 是一个参数,可用于任何 PowerShell 命令或脚本块,用于指定如何处理错误。可以为 ErrorAction 参数分配几个值,例如 Continue、SilentlyContinue、Stop 和 Inquire。

示例:使用 ErrorAction

在 PowerShell 中,-ErrorAction 参数允许您指定如何处理特定命令或脚本的错误。您可以使用此参数与多个可能值,包括 ContinueSilentlyContinueStopInquire。以下是如何使用这些值的示例:

  1. Continue: 此选项告诉 PowerShell 在发生错误时继续执行脚本或命令,并显示错误消息后继续执行剩余代码。
1
Get-ChildItem -Path “C:\\NonexistentFolder” -ErrorAction Continue**
  1. SilentlyContinue: 此选项告诉 PowerShell 抑制错误消息并继续执行脚本或命令。不会显示错误消息。
1
Get-Item -Path “C:\\NonexistentFile” -ErrorAction SilentlyContinue**
  1. Stop: 此选项告诉 PowerShell 如果发生错误,则停止执行脚本或命令。它将终止该脚本并显示错误消息。
1
Remove-Item -Path “C:\\ImportantFile” -ErrorAction Stop**
  1. Inquire:这个选项与其他选项有些不同。当发生错误时,它会提示用户输入,让他们决定是继续执行还是停止。通常与trycatch块一起用于交互式错误处理。

请注意,这些错误操作的实际行为可能会因您使用的特定 cmdlet 或脚本而异,因为并非所有 cmdlet 都支持所有错误操作首选项。但根据您的需求,在 PowerShell 中处理错误的常见方法如下。

使用 ErrorAction 的最佳实践

在使用 ErrorAction 参数时,请记住以下一些最佳实践:

  • 始终明确指定 ErrorAction 参数以确保一致的错误处理。
  • 如果要确保捕获并显示任何错误,请考虑使用 Stop 值。
  • 使用 Try-Catch-Finally 结构来处理特定错误并执行清理操作。

结论

ErrorAction 参数是 PowerShell 中一个强大的工具,允许用户控制如何处理错误。通过了解如何使用此参数并遵循最佳实践,您可以编写更健壮和可靠的脚本。所以,在下次在 PowerShell 脚本中遇到错误时,请记得利用 ErrorAction 参数来优雅地处理它!

PowerShell 技能连载 - 理解 PowerShell 执行策略:初学者指南

PowerShell 是一种强大的脚本语言和自动化框架,被广泛应用于IT专业人员和系统管理员。PowerShell 的一个重要方面是 PowerShell 执行策略,它确定了在系统上运行脚本的安全级别。

如果您是 PowerShell 新手,可能已经遇到过像“set-executionpolicy”和“get-executionpolicy”这样的术语。在本博客文章中,我们将探讨这些命令的作用以及它们为何重要。

什么是 PowerShell 执行策略?

执行策略是 PowerShell 中的一个安全功能,确定是否可以在系统上运行脚本。它有助于防止恶意脚本在用户不知情或未经同意的情况下被执行。

有不同级别的执行策略:

  • Restricted:不允许运行任何脚本。这是默认设置。
  • AllSigned:只有由受信任发布者签名的脚本才能运行。
  • RemoteSigned:从互联网下载的脚本需要签名,但可以无需签名地运行本地脚本。
  • Unrestricted:任何脚本都可以无限制地运行。

设置 PowerShell 执行策略

要设置执行策略,您可以使用‘set-executionpolicy’命令后跟所需的策略级别。例如,要将执行策略设置为‘RemoteSigned’,您可以运行:

1
set-executionpolicy RemoteSigned

请注意,在更改执行策略时需要具备管理权限。

获取执行策略

要检查当前执行策略,请使用‘get-executionpolicy’命令。这将显示当前策略等级。

1
get-executionpolicy

执行策略为什么重要?

执行策略对于维护系统安全至关重要。默认情况下,PowerShell具有受限的执行策略,这意味着无法运行任何脚本。这有助于防止意外运行恶意脚本。

然而,在某些情况下,您可能需要在系统上运行脚本。在这种情况下,您可以将执行策略更改为更宽松的级别,例如“RemoteSigned”或“Unrestricted”。

值得注意的是,将执行策略更改为更宽松的级别可能会增加运行恶意脚本的风险。因此,建议仅在必要时更改执行策略,并在从不受信任的来源运行脚本时保持谨慎。

结论

了解PowerShell执行策略对于任何IT专业人员或系统管理员都是至关重要的。它有助于维护系统安全性同时允许您在需要时运行脚本。

在这篇博客文章中,我们介绍了执行策略的基础知识、如何设置以及如何检查当前政策水平。请记住,在运行脚本时始终保持谨慎,并仅在必要时更改执行策略。

PowerShell 技能连载 - 获取法国假期

我看到了这篇博客文章,决定为法国发布这个。下面是一个获取所有法国假日的 PowerShell 函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function Get-FrenchHoliday
{
param
(
[int]
$Year = (Get-Date).Year,

[ValidateSet("alsace-moselle", "guadeloupe", "guyane", "la-reunion", "martinique", "mayotte", "metropole", "nouvelle-caledonie", "polynesie-francaise", "saint-barthelemy", "saint-martin", "saint-pierre-et-miquelon", "wallis-et-futuna")]
[string]
$Area = 'metropole',

[switch]
$NextOnly
)

$url = "https://calendrier.api.gouv.fr/jours-feries/$Area/$Year.json"

$holidays = Invoke-RestMethod -Uri $url -UseBasicParsing

foreach ($obj in $holidays.PSObject.Properties) {
if (-Not ($NextOnly.IsPresent) -or (((([DateTime]$obj.Name).Ticks) - (Get-Date).Ticks) -gt 0)) {
Write-Host "$($obj.Value) : $($obj.Name)"
}
}
}

运行上面的函数,然后运行这个命令:

1
Get-FrenchHoliday

或者,提交额外的参数以获取特定地区的特定假日:

1
Get-FrenchHoliday -NextOnly -Area guyane
1
Get-FrenchHoliday -Area "alsace-moselle" -Year 2024

PowerShell 技能连载 - 理解PowerShell中的错误处理

在编写代码时,错误管理是必须的。预期行为经常可以进行检查和验证。当发生意外情况时,我们使用异常处理。您可以轻松处理其他人代码抛出的异常,或者创建自己的异常供他人处理。

PowerShell 中的异常是什么?

异常是一种事件类型,在标准错误处理无法解决问题时会被触发。尝试将一个数字除以零或耗尽内存都属于异常情况。当特定问题出现时,您正在使用其代码的创建者可能会创建异常。

PowerShell 中的 Throw、Try 和 Catch

当发生异常时,我们称之为抛出了一个异常。您必须捕获抛出的异常才能对其进行管理。如果未通过任何方式捕获引发了一个未被捕获的异常,则脚本将停止运行。

同样地,我们有 Try 可以放置任何逻辑并使用 try 来捕获该异常。以下分别是 throw、try 和 catch 的一些示例。

我们使用 throw 关键字来生成自己的例外事件。

1
2
3
4
5
function hi
function hi
{
throw "hi all"
}

这会抛出一个运行时异常,这是一个致命错误。调用函数中的catch语句处理它,或者脚本以类似这样的通知离开。

1
2
3
4
5
6
7
8
hi

hi all
At line:3 char:1
+ throw "hi all"
+ ~~~~~~~~~~~~~~
+ CategoryInfo : OperationStopped: (hi all:String) [], RuntimeException
+ FullyQualifiedErrorId : hi all

在PowerShell(以及许多其他语言中),异常处理的工作方式是首先尝试一部分代码,然后在它抛出错误时捕获它。这里有一个示例来说明我的意思。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function hi
{
throw "hi all"

}
try hi
{

catch
{
Write-Output "Something threw an exception"
}

##Output:

Something threw an exception

PowerShell 中的 finally 块

在 PowerShell 中的最终块

您并不总是需要处理错误,但无论是否发生异常,都需要一些代码来运行。这正是 finally 块所做的。finally 中的代码最终会被执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function hi
{
throw "hi all"

}

try
{
hi
}

catch
{
Write-Output "Something threw an exception"
}

Finally

{
"PowershellGuru"
}

## Output ##

Something threw an exception
PowershellGuru

Cmdlet -ErrorAction

当您在任何高级函数或 cmdlet 中使用 -ErrorAction Stop 选项时,它会将所有 Write-Error 语句转换为终止错误,从而停止执行或可以被捕获。

类似地,我们有 -ErrorAction SilentlyContinue 选项,如果出现错误,则不显示错误并继续执行而不中断。

让我向您展示如何在脚本中使用这些。

1
2
3
4
5
6
7
$ErrorActionPreference = "Stop"

script-start
'
'
'
script-end

我们可以使用“SilentlyContinue”来代替“Stop”。这样做的好处是我们不必在每一行都提到它所需的地方。

结论

在本文中,我们已经介绍了异常、try/catch/throw/finally以及示例。此外,我们还看到了-ErrorAction cmdlets 以及如何实际使用它们。现在应该知道Powershell中异常处理的重要性了。让我们在下一篇文章中见面。

PowerShell 技能连载 - Windows 系统的温度控制

Windows 笔记本电脑(以及服务器)可能会变得很热,尤其是在夏天。令人惊讶的是,在 Windows 中没有简单的内置方法来监控温度传感器。了解机器有多热实际上非常重要,可以改善操作条件等方面带来巨大好处。例如,将笔记本电脑抬起并允许足够的空气进入通风口对它们非常有益。

这里有一个 PowerShell 模块,使温度监控变得非常简单:

1
PS> Install-Module -Name PSTemperatureMonitor

要从PowerShell Gallery安装此模块,您需要本地管理员权限,这是有道理的,因为无论如何您都需要本地管理员权限来读取硬件状态。

安装完模块后,请使用管理员权限启动PowerShell,然后启动温度监控,即每5秒刷新一次。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
PS> Start-MonitorTemperature -Interval 5 | Format-Table -Wrap
WARNING: HardwareMonitor opened.

Time CPU Core #1 CPU Core #2 CPU Core #3 CPU Core #4 CPU Package HDD Temperature Average
---- ----------- ----------- ----------- ----------- ----------- --------------- -------
12:17:31 65 69 66 65 69 53 64
12:17:36 63 62 63 59 62 53 60
12:17:41 62 59 59 59 62 53 59
12:17:46 61 62 62 58 62 53 60
12:17:51 70 68 63 63 70 53 64
12:17:56 59 60 55 56 61 53 57
12:18:02 60 60 57 61 61 53 59
12:18:07 65 68 61 62 68 53 63
WARNING: HardwareMonitor closed.

按下 CTRL+C 中止监控。更多详细信息请访问此处:https://github.com/TobiasPSP/PSTemperatureMonitor