它的语法功能很冗长,但对用户来说很直观。本文介绍如何在主机上以及Podman或其他容器内安装PowerShell。为什么使用PowerShellPowerShell就像它的名字一样,是一个强大的工具。它的语法冗长,但语义清晰。对于不想写长命令的开发者来说,PowerShell的大部分命令都有别名。您可以使用Get-Alias或单击此处了解如何使用别名。PowerShell与传统shell的最大区别在于它的输出管道。普通shell输出字符串或字符流,而PowerShell输出对象。这对命令管道的工作方式具有深远的影响,并且具有许多优点。示范范例以下范例冗长而清晰。以#开头的行是注释行。PS>开头的行是命令行,PS>是提示符:#返回当前目录下所有大于50MB的文件。##最长形式PS>Get-Childitem|Where-ObjectLength-gt50MB##最短形式(使用别名)PS>gci|?Length-gt40MB##输出看起来像这样----20/08/202013:55200068300840MB-file.img#按顺序:获取虚拟机、获取快照,仅选择最后3个并删除所选列表:PS>Get-VMVM-1|获取快照|选择对象-最后3|Remove-Snapshot上面的例子说明:Bash脚本经常需要使用cut,sed,awk等来格式化输入/输出,而使用PowerShell时通常不需要。这是因为PowerShell的工作机制与传统的POSIXshell(如Bash、Zsh、Fish等)有着根本的区别。传统shell的命令输出形式是字符串,而在PowerShell中,命令输出形式是对象。Bashvs.PowerShell以下示例说明了PowerShell的对象输出模式与Bash中的字符串输出模式相比的优势。假设您需要编写一个脚本来显示总共占用200MB内存空间的所有进程。如果使用Bash,大致如下:$ps-eOrss|awk-F''\'{if($2>=(1024*200)){\printf("%s\t%s\t%s\n",$1,$2,$6);}\}'PIDRSSCOMMANDABC[...]第一个明显的区别是可读性,或者更确切地说是语义清晰度。ps和awk都不是自描述的。ps命令的作用是显示进程状态;awk是一种文本处理工具和语言,这个词汇表的每个字母都是前任开发者的名字(Aho、Weinberger、Kernighan(见维基百科)。不过,在将它与PowerShell进行比较之前,先看看这个脚本:ps-e输出所有正在运行的进程;-Orss输出ps的默认输出,加上RSS字段-每个进程使用的千字节数(以KB为单位);输出类似于:PIDRSSSTTYTIMECOMMAND113776S?00:00:01/usr/lib/systemd/systemd|管道运算符将左侧命令的输出作为右侧命令的输入。awk-F''定义“空格”作为输入字段分隔符。上例中,PID为第一个字段,RSS为第二个,依此类推。'{if($2>=(1024*200)){是where真正的AWK代码开始。它检查第二个字段(RSS)是否包含大于或等于1024*200的数字;printf("%s\t%s\t%s\n",$1,$2,$6);}脚本继续。如果前面的条件为真,输出第一个t、第二和第六字段(分别为PID、RSS和COMMAND字段)。考虑到这一点,让我们退后一步,编写这个脚本使其工作:我们要过滤的字段必须包含在输入命令ps的输出中。这在默认情况下不可用,需要我们使用-O标志和rss字段作为参数。我们需要将ps的输出视为一组输入字段,因此我们还应该知道它们的顺序和结构。也就是说,我们至少需要将RSS标识为第二个字段。这也意味着我们需要提前知道ps的输出信息的大概情况。然后我们需要知道过滤后的数据是什么单位,以及关联工具的单位是什么。也就是我们需要知道RSS和awk字段使用的是kb。否则我们将无法写出像($2>=1024*200)这样的表达式。现在,让我们将前面的命令与PoserShell中的等效命令进行比较:#LongestformPS>Get-Process|Where-ObjectWorkingSet-ge200MB#最短形式(使用别名)PS>gps|?ws-ge200MBNPM(K)PM(M)WS(M)CPU(s)IdSIProcessName-------------------------------------ABCDEFG[...]首先应该注意语义非常清楚。这些命令是自描述的,清楚地描述了它们的作用。此外,无需重新格式化输入输出,也无需关心输入命令使用的单位。这是因为PowerShell输出的是对象,而不是字符串。这些可以通过考虑以下情况来理解。在Bash中,命令的输出就是终端显示的内容。在PowerShell中,终端显示的信息不等于实际可用的信息。这是因为PowerShell中的输出打印系统也使用对象。因此,PowerShell中的每个命令都将输出对象的某些属性标记为可打印,将某些属性标记为不可打印。但是,它始终包含所有属性,而Bash仅包含它实际打印的内容。我们可以将其视为一个JSON对象。Bash中的输出位置分为“字段”,用空格或制表符标记,而在PowerShell中它是一个易于寻址的对象属性,只需要知道它的名称即可使用。就像上面例子中的WorkingSet一样。为了查看命令输出对象的所有属性及其类型,您可以执行以下操作:PS>Get-Process|Get-MemberInstallPowerShellPowerShell安装包有多种形式,包括FedoraLinux中使用的RPM安装包。本文介绍了如何使用各种方法在FedoraLinux中安装PowerShell。我建议使用本机安装方法。但我还将介绍如何在容器中安装。我将演示使用官方MicrosoftPowerShell容器和FedoraLinux30的工具箱容器。使用容器的好处是所有的依赖都被捆绑在内部并与主机隔离,所以它必须是可用的。不管怎样,虽然官方文档只明确表示支持28-30版本的FedoraLinux发行版,但我还是推荐使用native方式安装。注意:官方支持意味着它必须有效。但其他版本不一定不兼容。也就是说,高于30的分布也应该有效。经过测试,确实如此。在容器中设置和运行PowerShell比直接在主机上运行更困难,安装需要更多时间,而且不能直接从主机运行命令。使用包管理器在宿主机上安装PowerShell方法一:使用微软仓库的安装过程很简单,和通过第三方仓库安装其他软件没有区别。通俗地说,安装过程分为四步:添加新仓库的GPG密码,在DNF仓库列表中添加对应的仓库,刷新DNF缓存,在新仓库中包含相关包,安装新的打包然后使用命令pwsh启动PowerShell。$sudorpm--importhttps://packages.microsoft.com/keys/microsoft.asc$curlhttps://packages.microsoft.com/config/rhel/7/prod.repo|sudotee/etc/yum.repos.d/microsoft.repo$sudodnfmakecache$sudodnfinstallpowershell$pwsh要删除存储库和包,请运行以下命令:$sudorm/etc/yum.repos.d/microsoft.repo$sudodnfremovepowershell方法2:使用PRM文件这种方法与第一种方法没有太大区别。实际上,在安装RPM文件时,会隐式添加GPG密码和存储库。这是因为RPM文件包含存储在其元数据中的两者之间的关系。首先,从PowerShellGitHub存储库获取相应版本的.rpm文件。然后查看readme.md文件中的“获取PowerShell”部分。第二步,输入如下命令:$sudodnfinstallpowershell-
