当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 什么是 PowerShell 以及为什么使用它?

作者:精品下载站 日期:2024-12-14 13:07:10 浏览:13 分类:玩电脑

什么是 PowerShell 以及为什么使用它?


许多技术专业人员忍受重复性任务,并通过点击方法来管理事物,而通过自动化可以节省大量时间。 PowerShell(Microsoft 的 shell 和脚本语言)可以提供帮助。 PowerShell 到底是什么?

最简单的形式是,PowerShell 是一种跨平台 shell 和脚本语言,允许人们从命令行管理任务并自动执行数千项活动。它是一种基于 Microsoft .NET Framework 构建的语言,使我们的生活变得更加轻松。

在本文中,您将了解 PowerShell、它的来源、PowerShell 基础知识,并帮助您了解为什么 PowerShell 可能是合适的工具。

我们有数百篇有关 PowerShell 的博客文章。如果您不熟悉这种语言,请查看我们在这里发布的所有其他帖子。

什么是 PowerShell?

PowerShell 是一种基于 Microsoft .NET 技术构建的开源 shell 和脚本语言。它旨在帮助非软件开发人员的技术专业人员构建高效的脚本和工具,以帮助他们更好地完成工作。

PowerShell 从 VBScript 和批处理文件等语言发展而来,旨在提供易于理解和使用的一流命令行界面和脚本语言。

PowerShell 是面向对象的,并且严重依赖于类似于面向对象编程 (OOP) 的对象。 PowerShell 中的几乎所有内容都是对象,您很快就会了解更多。

PowerShell 是两件事;它是一个命令行 shell,允许用户在类似于旧命令提示符 (cmd.exe) 的命令行中运行命令。它也是一种强大的脚本语言,可以构建工具并自动化您能想到的任何东西。

PowerShell 可以交互运行或在脚本中运行,它提供了许多称为 cmdlet 和函数的命令。这些命令要么是编译的二进制文件,要么是用户编写的自定义代码,用于封装特定任务,例如读取文件、ping 远程计算机等。

PowerShell 的演变

2002 年,微软的 Jeffrey Snover 意识到 Windows 不像其竞争对手 Linux 那样具有良好的命令行界面和脚本编写能力。为了改变这一点,Snover 发布了 Monad 宣言,该文件概述了他对最终的 PowerShell 的计划。

从 2002 年到 2005 年,PowerShell 被称为 Monad,仍处于早期开发阶段。 2006年,随着PowerShell 1.0的发布,“PowerShell”这个词首次亮相。从那时起,Microsoft 的 PowerShell 团队就以该宣言为指导,不断向 PowerShell 添加新功能。

PowerShell 最初仅作为 Windows 管理框架的一部分提供,在 Windows XP 和 Windows Server 2012 之前,PowerShell 是单独安装的。但从 Windows 7 和 Windows Server 2012 R2 开始,PowerShell 已默认安装在所有 Windows 操作系统上。

转向跨平台

从 2006 年到 2016 年,PowerShell 仅在 Windows 上可用,称为 Windows PowerShell,最高版本为 5.1。 PowerShell 构建于 .NET Framework 之上,该框架仅在 Windows 中可用。 2016 年,微软决定采取大胆举措,在 GitHub 上开源 PowerShell,在第六版中放弃了“Windows”而只使用“PowerShell”。

从那时起,PowerShell 不仅可以在 Windows 上使用,还可以在 macOS、Linux 和其他使用 .NET Core 的 *nix 操作系统上使用。

PowerShell/PowerShell Core 向后兼容 Windows PowerShell。两个版本都可以并排安装。

PowerShell 的未来

截至 2021 年,PowerShell 已经取得了最大的发展成果。为了实现 Monad 宣言的目标,Microsoft 的 PowerShell 团队负责管理该产品。尽管大多数(如果不是全部)突破性功能已经发布,但微软和开源社区仍在积极维护它。

命令

与 cmd.exe、Bash 等其他 shell 非常相似,PowerShell 具有执行某些操作的二进制命令。例如,您可以运行命令来读取文件、ping 计算机、删除注册表项等等。

PowerShell 7 是最新版本,它附带了 1500 多个称为 cmdlet 的已编译二进制文件。 PowerShell cmdlet 无处不在,构成了可用于构建复杂脚本的工具。

与软件开发人员使用 C# 等其他语言构建的 cmdlet 不同,普通人可以创建自己的命令。内置 PowerShell 语言的函数允许那些了解 PowerShell 的人创建类似于 cmdlet 的命令。

开发人员使用这些 cmdlet 和函数构建简单到复杂的解决方案,以自动化您能想到的任何事情。

使用 Get-Command cmdlet 来发现系统上的所有可用命令。

命令语法

PowerShell 的独特部分之一是语法。 PowerShell 的语法可供 IT 专业人员执行时读取。

与其他 shell 不同,这些命令遵循标准命名约定,准确指示命令的用途。

命令名称以动词-名词语法命名,始终以动词开头,后跟破折号和名词。

尽管 PowerShell 不要求您对自定义函数使用动词-名词语法,但 Microsoft 强烈鼓励这样做。

动词

cmdlet 名称中最重要的部分是动词。此部分应准确描述 cmdlet 执行的操作。例如,Get-Content 从文件中获取文本,而Copy-Item 则复制文件。您甚至可以通过在 PowerShell 控制台中运行 Get-Verb 命令来查找所有“已批准”的动词,如下所示。

[玩转系统] 什么是 PowerShell 以及为什么使用它?

名词

与动词不同,PowerShell 没有任何“批准”的名词。对其执行操作的对象可能有很大差异。但是,PowerShell 确实将引擎内部的动词与名词分开。您可以通过使用 Noun 参数运行 Get-Command 命令来查看此示例。

通过指定 Noun 参数并提供值 A*。 PowerShell 会将其所有可用命令“拆分”为动词和名词,并且仅显示带有以 A 开头的名词的命令。

[玩转系统] 什么是 PowerShell 以及为什么使用它?

模块

在上一节中,您看到了 Get-Command 命令的输出。在该输出中,您可以看到名为 Source 的列。为了划分命令,PowerShell 要求所有 cmdlet 都成为“存储桶”或模块的一部分。

模块是基于公共功能组合的命令组。例如,许多核心 PowerShell cmdlet 位于名为 Microsoft.PowerShell.Management 的模块中,而诸如 Write-HostWrite-Debug 之类的 cmdlet 则位于名为 Microsoft.PowerShell.Management 的模块中。 Microsoft.PowerShell.Utility 模块。

PowerShell 预装了几十个模块,但您也可以根据任务或产品下载数千个其他模块。您可以找到用于管理其他供应商产品的模块,甚至可以创建自己的产品。

您可以通过运行Get-Module -ListAvailable来查找计算机上安装的所有模块。 Get-Module 命令查找所有已加载(导入到当前会话中)的模块。 ListAvailable 参数告诉 Get-Module 还搜索安装在文件系统上但未导入的模块。

[玩转系统] 什么是 PowerShell 以及为什么使用它?

使用 Find-Module 命令搜索 PowerShell 库以发现数千个其他模块。

对象

一旦您熟悉了 PowerShell,您需要学习的最重要的方面之一就是对象。 PowerShell 中的所有内容都是具有属性和方法的对象。

要了解 PowerShell,您必须首先了解对象的工作原理。

现实世界的物体

想象一个现实世界的“对象”。让我们和猫一起工作吧。猫是一种具有各种属性(属性)的物体,如颜色、大小、年龄等,这些属性定义了猫的特征。

每只猫都是一个具有描述它的某些属性的对象。这些属性就是属性。

[玩转系统] 什么是 PowerShell 以及为什么使用它?

现在,猫不再是某种不可移动的物体。它会做一些事情,比如跑、跳、眨眼睛或发出咕噜声。猫(物体)执行某些动作。在 PowerShell 中,cat 对象具有各种方法,可以采取行动某事。

对象类型

使用上面的猫例子,每只猫都是猫。但狗也是一个物体。我们现在有两种类型的对象。在编程中,这些不同的对象称为类型类型是一种具有一组通用属性和方法的特定对象。

猫是一种类型,狗是一种类型,汽车也是一种类型。每个对象都有一组特定的属性和它可以执行的操作。

对象属性和方法

如果可以将猫视为具有属性和方法的对象,那么如何在代码中表示它?为了解释这一点,我们首先从一种常见的对象类型——字符串开始。

如果您在控制台中输入以下文本并按 Enter 键,它会将值返回给您,但更多操作会在后台发生。

"This is a Plain Text, and its an object"

当您按键盘上的 Enter 时,PowerShell 会创建一个对象,特别是类型为 System.String 的对象。该字符串对象具有各种“成员”,这是 PowerShell 对所有属性和方法的术语。

您可以通过将字符串的输出通过管道(稍后会详细介绍)到 Get-Member cmdlet 来查看分配给该字符串对象的所有成员。 Get-Member cmdlet 是一个检查 PowerShell 对象的便捷命令。

[玩转系统] 什么是 PowerShell 以及为什么使用它?

Length 是字符串的一个属性,指示字符串的长度。您可以使用点表示法引用属性的值,如下所示。

"This is a Plain Text, and its an object".Length

可以看到PowerShell返回的值为39,说明这个脚本存在39字符问题。

[玩转系统] 什么是 PowerShell 以及为什么使用它?

您可以以类似的方式引用对象上的方法。但是,方法要求您使用括号,而不仅仅是一组字母数字字符。

有些方法有参数。要将这些参数传递给方法,您可以将它们包含在括号中。

字符串对象有一个名为 Upper() 的方法,该方法将字符串中的所有字符大写,如下所示。

"This is a Plain Text, and its an object".ToUpper()

[玩转系统] 什么是 PowerShell 以及为什么使用它?

在 Microsoft.com 网站上了解有关 Get-Member、属性和方法的更多信息

PS驱动器

该外壳的一个独特功能是 PSDrive 的概念。 PowerShell 驱动器或 PSDrive 是您通常使用的“驱动器”,例如 C:\,但有所不同。典型的 C:\ 是一个文件系统驱动器,由其中包含文件的文件夹组成。 PSDrive 可以是这样的,但也可以是注册表配置单元、Active Directory 或证书容器。

PSDrive 提供了对实际数据源的抽象,并允许您分层导航多种类型的数据。使用 Get-PSDrive cmdlet 查找计算机上的所有可用驱动器。

[玩转系统] 什么是 PowerShell 以及为什么使用它?

PowerShell 有一组带有名词 ItemChildItemItemProperty 的 cmdlet。这些 cmdlet 均适用于任何 PSDrive。

[玩转系统] 什么是 PowerShell 以及为什么使用它?

例如,要读取注册表配置单元,您可以运行 Get-ChildItem -Path HKLM:\ 或者您可能想查找文件的属性。为此,您可以使用 Get-ItemProperty -Path C:\file.txt

错误处理

与所有其他编程语言一样,PowerShell 也支持错误处理或异常处理。使用 .NET 错误处理(例如 trycatch 和旧版 trap 命令),您可以捕获脚本中发生的异常。

不过,与其他语言不同的是,PowerShell 有软终止错误的概念。硬终止错误被认为比软终止错误“更糟糕”。根据开发人员创建 cmdlet 的方式,cmdlet 可能会根据各种情况返回软终止错误或硬终止错误。

例如,也许您需要读取 C:\NonExistingFile.txt 中的文本文件内容,但该文件不存在。默认情况下,如果文件不存在,Get-Content 将返回软终止错误。软终止错误不会向 catch抛出异常。

软终止错误只是将错误返回到控制台并退出,如下所示。

Try{
    Get-Content -Path "C:\NonExistingFile.txt"
} Catch{
    Write-Host "I Found An Error And Caught It.. " -ForegroundColor Yellow
}

[玩转系统] 什么是 PowerShell 以及为什么使用它?

所有 PowerShell cmdlet 都带有一个名为 ErrorAction 的参数,用于覆盖默认 cmdlet 行为。也许我希望 PowerShell 在找不到文件时进入我的 catch 块。为此,Get-Content 需要返回异常或硬终止错误。

要将 cmdlet 引用的软终止错误“转换”为硬终止错误,请将 Stop 值与 ErrorAction 参数结合使用,如下所示。

Try{
    Get-Content -Path "C:\NonExistingFile.txt" -ErrorAction Stop
} Catch{
    Write-Host "I Found An Error And Caught It.. " -ForegroundColor Yellow
}

[玩转系统] 什么是 PowerShell 以及为什么使用它?

管道

当您在任何 shell 中运行命令时,该命令可以选择返回输出。在 Bash 和其他 shell 脚本语言中,该输出是一个简单的字符串。与 PowerShell 不同,该字符串不是一个不包含任何其他属性的对象。

由于 PowerShell 仅返回对象,因此它有一个管道来支持它们。管道的概念并不独特,但通过它传递对象却是独特的。

例如,也许您正在运行 Mozilla Firefox 浏览器,该浏览器在名为 firefox 的进程下运行。 PowerShell 有一个名为 Get-Process 的内置 cmdlet,用于发现正在运行的进程。

Get-Process firefox

PowerShell 还有一个名为 Stop-Process 的 cmdlet,用于停止正在运行的进程。在传统的 shell 中,您必须执行类似的操作,占用两行代码并增加额外的复杂性。

$process = Get-Process firefox
Stop-Process $process

但是,由于 Stop-Process cmdlet 通过管道接受输入,因此它具有了解该进程适用于 Firefox 的逻辑,并且可以停止该进程,如下所示。

# Find a process named Firefox and pass it to the Stop-Process command, which ends it
Get-Process firefox | Stop-Process

[玩转系统] 什么是 PowerShell 以及为什么使用它?

管道允许您将任意数量的命令串在一起,只要命令接受管道输入即可。

远程通讯

PowerShell 不仅仅局限于安装它的计算机。它可以轻松地在远程计算机上运行命令。为此,它使用 PowerShell 远程处理 (PSRemoting)。 PSRemoting 是一种连接到远程计算机并像本地计算机一样执行命令的功能。

例如,也许您想停止本地计算机上的 Windows 更新服务。您可以使用 Stop-Service -Name wuauserv 来做到这一点。

要在远程计算机上运行相同的命令,请将该命令“包装”在脚本块中,并将该脚本块传递给 Invoke-Command 命令。

Invoke-Command -ComputerName SRV -Scriptblock { Stop-Service -Name wuauserv }

PowerShell 还具有其他相关的远程通信命令,例如 Test-ConnectionTest-NetConnection,用于在远程计算机上执行 ping 操作、发现端口状态以及运行跟踪路由。

Test-NetConnection -ComputerName www.google.com -Port 80                           

[玩转系统] 什么是 PowerShell 以及为什么使用它?

结论

PowerShell 是一款出色的工具,可以帮助 IT 专业人员、系统管理员、开发人员或任何其他管理计算机系统的人。它是一个应该成为每个人的工具带的工具,通过其基本命令与社区模块以及创建自己的脚本的能力相结合。

要了解更多信息,请在此处查看其他人在 PowerShell 上的所有帖子并开始自动化!

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯