PowerShell 技术互动社区发展状况(2023 年 3 月)
至 2024 年 3 月,“PowerShell 技术互动”社区人数已达到 1976 人,十分接近社区最大容量(2000 人),保持 PowerShell 最大中文社区的位置。根据腾讯社交平台的策略,社区人数的上限为 2000 人,我们会尽可能保留机会给活跃用户。
如您遇到 PowerShell 方面的技术问题,或有好的资源希望分享,请加入我们。QQ 群号:271143343。
或者用手机 QQ 扫描二维码:
至 2024 年 3 月,“PowerShell 技术互动”社区人数已达到 1976 人,十分接近社区最大容量(2000 人),保持 PowerShell 最大中文社区的位置。根据腾讯社交平台的策略,社区人数的上限为 2000 人,我们会尽可能保留机会给活跃用户。
如您遇到 PowerShell 方面的技术问题,或有好的资源希望分享,请加入我们。QQ 群号:271143343。
或者用手机 QQ 扫描二维码:
为了在多个脚本中重复使用相同的代码,我们使用PowerShell函数。
PowerShell函数是一组已经被命名的PowerShell语句。每当我们想要运行一个函数时,我们需要输入它的名称。
函数可以像cmdlet一样具有参数。可以通过管道或命令行访问函数参数。
它们返回一个值,该值可以赋给变量或作为命令行参数或函数参数传递。为了指定返回值,我们可以使用关键字return
以下是用于Function的语法。
1 | function [<scope:>]<name> [([type]$parameter1[,[type]$parameter2])] |
以上语法中包括以下术语:
函数示例:
1 | function Operation{ |
结果:
1 | Multiply : 16 |
高级功能是可以执行类似于 cmdlet 执行的操作的功能。当用户想要编写一个不必编写已编译 cmdlet 的函数时,他们可以使用这些功能。
使用已编译 cmdlet 和高级功能之间主要区别是已编译 cmdlet 是.NET Framework 类,必须用.NET Framework 语言编写。此外,高级功能是用 PowerShell 脚本语言编写的。
以下示例展示了如何使用 PowerShell 的高级功能:
1 | function show-Message |
结果:
1 | cmdlet show-Message at command pipeline position 1 |
我们在每种语言中都使用函数,通常会减少代码的行数。如果您的代码有1000行,那么借助函数的帮助,您可以将计数降至500。希望您喜欢这篇文章,我们下一篇文章再见。
PowerShell 是一种强大的脚本语言,允许用户轻松自动化任务和管理系统。PowerShell 的一个关键特性是 ErrorAction 参数,它允许用户控制脚本或命令中如何处理错误。
ErrorAction 是一个参数,可用于任何 PowerShell 命令或脚本块,用于指定如何处理错误。可以为 ErrorAction 参数分配几个值,例如 Continue、SilentlyContinue、Stop 和 Inquire。
在 PowerShell 中,-ErrorAction 参数允许您指定如何处理特定命令或脚本的错误。您可以使用此参数与多个可能值,包括 Continue
、SilentlyContinue
、Stop
和 Inquire
。以下是如何使用这些值的示例:
1 | Get-ChildItem -Path “C:\\NonexistentFolder” -ErrorAction Continue** |
1 | Get-Item -Path “C:\\NonexistentFile” -ErrorAction SilentlyContinue** |
1 | Remove-Item -Path “C:\\ImportantFile” -ErrorAction Stop** |
try
和catch
块一起用于交互式错误处理。请注意,这些错误操作的实际行为可能会因您使用的特定 cmdlet 或脚本而异,因为并非所有 cmdlet 都支持所有错误操作首选项。但根据您的需求,在 PowerShell 中处理错误的常见方法如下。
在使用 ErrorAction 参数时,请记住以下一些最佳实践:
ErrorAction 参数是 PowerShell 中一个强大的工具,允许用户控制如何处理错误。通过了解如何使用此参数并遵循最佳实践,您可以编写更健壮和可靠的脚本。所以,在下次在 PowerShell 脚本中遇到错误时,请记得利用 ErrorAction 参数来优雅地处理它!
PowerShell 是一种强大的脚本语言和自动化框架,被广泛应用于IT专业人员和系统管理员。PowerShell 的一个重要方面是 PowerShell 执行策略,它确定了在系统上运行脚本的安全级别。
如果您是 PowerShell 新手,可能已经遇到过像“set-executionpolicy”和“get-executionpolicy”这样的术语。在本博客文章中,我们将探讨这些命令的作用以及它们为何重要。
执行策略是 PowerShell 中的一个安全功能,确定是否可以在系统上运行脚本。它有助于防止恶意脚本在用户不知情或未经同意的情况下被执行。
有不同级别的执行策略:
要设置执行策略,您可以使用‘set-executionpolicy’命令后跟所需的策略级别。例如,要将执行策略设置为‘RemoteSigned’,您可以运行:
1 | set-executionpolicy RemoteSigned |
请注意,在更改执行策略时需要具备管理权限。
要检查当前执行策略,请使用‘get-executionpolicy’命令。这将显示当前策略等级。
1 | get-executionpolicy |
执行策略对于维护系统安全至关重要。默认情况下,PowerShell具有受限的执行策略,这意味着无法运行任何脚本。这有助于防止意外运行恶意脚本。
然而,在某些情况下,您可能需要在系统上运行脚本。在这种情况下,您可以将执行策略更改为更宽松的级别,例如“RemoteSigned”或“Unrestricted”。
值得注意的是,将执行策略更改为更宽松的级别可能会增加运行恶意脚本的风险。因此,建议仅在必要时更改执行策略,并在从不受信任的来源运行脚本时保持谨慎。
了解PowerShell执行策略对于任何IT专业人员或系统管理员都是至关重要的。它有助于维护系统安全性同时允许您在需要时运行脚本。
在这篇博客文章中,我们介绍了执行策略的基础知识、如何设置以及如何检查当前政策水平。请记住,在运行脚本时始终保持谨慎,并仅在必要时更改执行策略。
我看到了这篇博客文章,决定为法国发布这个。下面是一个获取所有法国假日的 PowerShell 函数:
1 | function Get-FrenchHoliday |
运行上面的函数,然后运行这个命令:
1 | Get-FrenchHoliday |
或者,提交额外的参数以获取特定地区的特定假日:
1 | Get-FrenchHoliday -NextOnly -Area guyane |
1 | Get-FrenchHoliday -Area "alsace-moselle" -Year 2024 |
在编写代码时,错误管理是必须的。预期行为经常可以进行检查和验证。当发生意外情况时,我们使用异常处理。您可以轻松处理其他人代码抛出的异常,或者创建自己的异常供他人处理。
异常是一种事件类型,在标准错误处理无法解决问题时会被触发。尝试将一个数字除以零或耗尽内存都属于异常情况。当特定问题出现时,您正在使用其代码的创建者可能会创建异常。
当发生异常时,我们称之为抛出了一个异常。您必须捕获抛出的异常才能对其进行管理。如果未通过任何方式捕获引发了一个未被捕获的异常,则脚本将停止运行。
同样地,我们有 Try 可以放置任何逻辑并使用 try 来捕获该异常。以下分别是 throw、try 和 catch 的一些示例。
我们使用 throw 关键字来生成自己的例外事件。
1 | function hi |
这会抛出一个运行时异常,这是一个致命错误。调用函数中的catch语句处理它,或者脚本以类似这样的通知离开。
1 | hi |
在PowerShell(以及许多其他语言中),异常处理的工作方式是首先尝试一部分代码,然后在它抛出错误时捕获它。这里有一个示例来说明我的意思。
1 | function hi |
在 PowerShell 中的最终块
您并不总是需要处理错误,但无论是否发生异常,都需要一些代码来运行。这正是 finally 块所做的。finally 中的代码最终会被执行。
1 | function hi |
当您在任何高级函数或 cmdlet 中使用 -ErrorAction Stop 选项时,它会将所有 Write-Error 语句转换为终止错误,从而停止执行或可以被捕获。
类似地,我们有 -ErrorAction SilentlyContinue 选项,如果出现错误,则不显示错误并继续执行而不中断。
让我向您展示如何在脚本中使用这些。
1 | $ErrorActionPreference = "Stop" |
我们可以使用“SilentlyContinue”来代替“Stop”。这样做的好处是我们不必在每一行都提到它所需的地方。
在本文中,我们已经介绍了异常、try/catch/throw/finally以及示例。此外,我们还看到了-ErrorAction cmdlets 以及如何实际使用它们。现在应该知道Powershell中异常处理的重要性了。让我们在下一篇文章中见面。
Windows 笔记本电脑(以及服务器)可能会变得很热,尤其是在夏天。令人惊讶的是,在 Windows 中没有简单的内置方法来监控温度传感器。了解机器有多热实际上非常重要,可以改善操作条件等方面带来巨大好处。例如,将笔记本电脑抬起并允许足够的空气进入通风口对它们非常有益。
这里有一个 PowerShell 模块,使温度监控变得非常简单:
1 | PS> Install-Module -Name PSTemperatureMonitor |
要从PowerShell Gallery安装此模块,您需要本地管理员权限,这是有道理的,因为无论如何您都需要本地管理员权限来读取硬件状态。
安装完模块后,请使用管理员权限启动PowerShell,然后启动温度监控,即每5秒刷新一次。
1 | PS> Start-MonitorTemperature -Interval 5 | Format-Table -Wrap |
按下 CTRL+C 中止监控。更多详细信息请访问此处:https://github.com/TobiasPSP/PSTemperatureMonitor
这是一个PowerShell函数,可以获取所有德国的假日,无论是全国范围还是只针对你所在的州。
1 | function Get-GermanHoliday |
运行上面的函数,然后直接运行原样的命令:
1 | PS> Get-GermanHoliday |
或者,提交额外的参数以获取给定州的特定假日:
1 | PS> Get-GermanHoliday -State ni -Year 2023 |
假设您想知道德国节日 “Christi Himmelfahrt” 的日期。以下是获取该信息的方法:
1 | # specify the name of the holiday to look up |
许多开发人员喜爱PowerShell,而且理由充分:它增强了Windows命令提示符,在那里我们中的许多人花费大量时间。然而,它确实有一个学习曲线,但一旦掌握了基本指令,对你来说将是生产力的绝佳工具。
Cmdlets 是 PowerShell 功能能力背后的驱动力。开发人员应该知道数十个关键命令,这些命令涵盖从改进通用 Windows 体验到对开发工作有用的指令。此列表编制为刚开始使用者提供便于参考的工具。
对于任何使用 PowerShell 的人来说,Get-Help 命令至关重要,因为它提供即时访问所需信息以运行和操作所有可用命令。
以下是示例。
1 | Get-Help [[-Name] <String>] [-Path <String>] [-Category <String[]>] [-Component <String[]>] |
Get-Command 是一个方便的参考 cmdlet,它显示当前会话中可访问的所有命令。
1 | get-command |
输出内容类似这样:
1 | CommandType Name Definition |
为防止恶意脚本在PowerShell环境中运行,微软默认禁用了脚本。然而,开发人员希望能够构建和运行脚本,因此Set-ExecutionPolicy命令允许您调整PowerShell脚本的安全级别。您可以选择四种不同的安全级别:
Restricted: 这是默认的安全级别,阻止执行PowerShell脚本。在这个安全级别下只能交互式输入命令。
All Signed: 只有由可靠发布者签名的脚本才能运行在这个安全级别。
Remote Signed: 任何在本地生成的PowerShell脚本都可以在这个安全级别下运行。远程开发的脚本只有经过认可发布者签名后才被允许运行。
Unrestricted: 如其名称所示,无限制的安全级别从执行策略中移除所有限制,允许所有脚本运行。
类似地,在陌生环境工作时,该命令可以快速显示当前执行策略:
了解系统上已安装哪些服务也是很有益处的。通过以下命令,您可以快速获取这些数据:
1 | Get-Service |
输出结果可能类似如下:
1 | Status Name DisplayName |
如果您需要知道某个特定服务是否已安装,请在命令中添加“-Name”开关和服务的名称,Windows 将显示该服务的状态。还可以使用过滤功能返回当前安装的服务的指定子集。
PowerShell 中的 Get-EventLog 命令可真正解析计算机事件日志。有许多可用选项。要阅读特定日志,请使用“-Log”开关后跟日志文件名。例如,要查看应用程序日志,请执行以下命令:
1 | Get-EventLog -Log "Application" |
Get-Eventlog 的其他参数是:
通常很方便能够快速获得当前正在运行的所有进程的列表,就像获取可用服务列表一样。
这些信息可以通过 Get-Process
命令获得。
1 | Get-Process |
输出类似这样:
1 | Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName |
Stop-Process 可用于终止已冻结或不再响应的进程。如果不确定是什么导致了延迟,可以使用 Get-Process 快速发现问题进程。在获得名称或进程 ID 后,可以使用 Stop-Process 停止一个进程。以下是相同操作的示例:
1 | Stop-Process -processname armsvc |
如果您希望删除所有命令历史记录条目怎么办?使用 Clear-History cmdlet 很简单。它也可以用来仅删除特定的命令。例如,以下命令将删除以“help”开头或以“command”结尾的命令:
1 | Clear-History -Command *help*, *command |
如果您需要提取数据以供报告或分发给他人,ConvertTo-HTML 是一种快速简便的方法。要使用它,请将另一个命令的输出传递给 ConvertTo-HTML 命令,并使用 -Property 开关指定您希望在 HTML 文件中包含哪些输出属性。您还需要为文件命名。
例如,以下代码创建了一个列出当前控制台中 PowerShell 命令的 HTML 页面:
1 | get-commad | convertto-html > command.htm |
以下 cmdlet 是我在日常工作中经常使用的一些特别提及,也被许多 PowerShell 开发人员广泛使用。请在评论部分告诉我这篇文章中遗漏了什么,以便我们可以在接下来的文章中涵盖它。
具有管理员权限的Windows系统可以访问在启动过程中收集到的诊断数据。Windows会记录每个服务和子系统的启动时间和降级时间(以毫秒为单位)。通过这些数据,您可以识别出需要花费过多时间来启动的服务可能存在的问题。
以下是一个脚本,它读取相应的日志文件条目并返回测量得到的启动时间:
1 | #requires -RunAsAdmin |