PowerShell是一种通常用于自动化计算机系统管理的跨平台解决方案,但也可用于常规编码。PowerShell由命令行壳,脚本语言和配置管理框架组成。PowerShell在Windows,Linux和MacOS操作系统上运行。由于操作系统的根本差异,某些PowerShell命令(称为CMDLET)是没有意义的。例如,Powershell Get-acl CMDLET不适用于Linux系统,因为Linux文件系统不使用NTFS访问控制列表(ACLS)。要查看可用Linux PowerShell CMDLET的列表,请运行 获取命令.
在Linux中,一个命令的输出可以将其管道输送到另一个命令中。例如:
ls | sort -r | more
这反向分类当前目录的内容,并在列表中使用(如有必要)。也就是说,数据流的输出 ls 命令被管道 种类 然后将其数据流输出管道输送到 更多 命令。这样的powershell类似物如下:
Get-ChildItem | Sort-Object -Descending | Out-Host -Paging
哪个提出了一个问题,为什么要在本机版本上使用PowerShell?一个关键原因是对象(而不是简单的数据流)是在PowerShell CMDLET之间管道的。例如,无需解析文本即可从另一个输出流中提取信息。而且,由于PowerShell对象通常具有与之相关的大量属性,因此您可以相对容易地做一些相当强大的事情。例如,说您想找到Cron服务的PID。第一次尝试可能如下:
ps -aux | grep cron
这将产生类似于以下内容的输出:
root 1041 0.0 0.1 126384 1584 ? Ss 22:25 0:00 /usr/sbin/crond -n
root 3519 0.0 0.0 123360 728 ? Ss 23:01 0:00 /usr/sbin/anacron -s
root 4089 0.0 0.0 112808 976 pts/1 R+ 23:09 0:00 grep --color=auto cron
Cron PID似乎是1041,尽管很难看不见桌子标题。假设是这种情况,我们需要访问第一行中的第二列。第一步可能是减少空格过多:
ps -aux | grep cron | tr -s ' '
这产生了:
root 1041 0.0 0.1 126384 1584 ? Ss 22:25 0:00 /usr/sbin/crond -n
root 3519 0.0 0.0 123360 728 ? Ss 23:01 0:00 /usr/sbin/anacron -s
root 4167 0.0 0.0 112808 972 pts/1 R+ 23:11 0:00 grep --color=auto cron
现在我们可以将第二列与 切:
ps -aux | grep cron | tr -s ' ' | cut -d ' ' -f 2
生产:
1041
3519
4274
最后,我们可以如下获取第一行,以获得所需的结果,即1041:
ps -aux | grep cron | tr -s ' ' | cut -d ' ' -f 2 | head -1
使用PowerShell CMDLET输出对象而不是数据流的事实,以上的PowerShell版本简称:
(Get-Process -Name crond).Id
在这种情况下, get -process -name crond 返回代表Cron过程的对象。该对象具有一系列有用的属性,其中一个是过程ID(或PID)。要访问PowerShell对象的属性,您可以将其包裹在括号中,然后使用标准的”点”符号,如图所示。
要在您最喜欢的Linux风味上安装PowerShell,请参阅Microsoft的 在Linux上安装PowerShell。如果未列出Linux发行版,请考虑 在Linux上安装PowerShell的替代方法.
例如,以下四个命令在CentOS 7上安装了最新版本的PowerShell:
# Optionally update all software packages:
sudo yum -y update
# Register the Microsoft repository:
curl https://packages.microsoft.com/config/rhel/7/prod.repo | sudo tee /etc/yum.repos.d/microsoft.repo
# Install PowerShell:
sudo yum -y install powershell
# Start PowerShell:
pwsh
可以看出,安装PowerShell是简单的。
一种关键技术是确定PowerShell对象实际具有的属性。这可以通过 聚会 cmdlet。例如,要确定PowerShell进程对象的属性,您可以使用:
Get-Process | Get-Member -Force
这表明有一个 小路 流程对象的属性。因此,我们可以使用它在CPU使用方面列出前10个过程,如下所示:
Get-Process | Sort-Object -Property CPU | Select-Object -Property Name, Path, CPU -Last 10
这会产生类似于以下的输出:
Name Path CPU
---- ---- ---
xfwm4 /usr/bin/xfwm4 1.95
systemd /usr/lib/systemd/systemd 3.63
rngd /usr/sbin/rngd 7.39
xfce4-terminal /usr/bin/xfce4-terminal 9.35
xrdp /usr/sbin/xrdp 22.05
ksoftirqd/0 26.21
pwsh /opt/microsoft/powershell/7/pwsh 27.37
rcu_sched 45.44
Xvnc /usr/bin/Xvnc 59.27
NetworkManager /usr/sbin/NetworkManager 955.19
尽管有用,但我们可能想计算一个整体系统使用度量。第一个剪辑可能是简单地总结非页码内存(NPM),页面存储器(PM),工作集(WS)和CPU使用值。也就是说,我们定义了总体使用度量指标,如下所示:
总体us = npm + pm + ws + cpu。
在Powershell中,这可以如下完成:
Get-Process | Select-Object -Property @{Label = 'OverallUsage'; Expression = {$_.NPM + $_.PM + $_.WS + $_.CPU}}
这 @{} 哈希表(即键/值对)允许我们定义一个称为的属性 整体语句 其定义是上面显示的表达式。在这个表达中, $_ 代表管道对象。在这种情况下,一个单个过程对象 获取过程 返回(每个运行Linux进程一个)。然后,我们总和四个属性。这将导致以下(前几行):
OverallUsage
------------
520192
815104.03
794624
1093632
4902912.01
3330048.37
现在,我们可以将这两个概念结合在一起:
Get-Process | Select-Object -Property Name, Path, @{Label = 'OverallUsage'; Expression = {$_.NPM + $_.PM + $_.WS + $_.CPU}} | Sort-Object -Property OverallUsage -Bottom 10
这会产生前10个总使用表,类似于以下内容:
Name Path OverallUsage
---- ---- ------------
Thunar /usr/bin/thunar 14073856.2
xfce4-power-manager /usr/bin/xfce4-power-manager 15970304.3
xfce4-panel /usr/bin/xfce4-panel 16195584.9
xfdesktop /usr/bin/xfdesktop 17588224.59
tuned /usr/bin/python2.7 18898945.66
yum-cron /usr/bin/python2.7 22335488.2
xfce4-terminal /usr/bin/xfce4-terminal 23642123.4
xrdp /usr/sbin/xrdp 26570776.34
Xvnc /usr/bin/Xvnc 82710598.14
pwsh /opt/microsoft/powershell/7/pwsh 298852382.66
如果您愿意显示舍入的用法值,则可以使用:
Get-Process | Select-Object -Property Name, Path, @{Label = 'OverallUsage'; Expression = {[Math]::Round($_.NPM + $_.PM + $_.WS + $_.CPU)}} | Sort-Object -Property OverallUsage -Bottom 10
这 [MATH] :: round() 函数用于将单个总和到其最接近的整体值。
在很多情况下,标准Linux命令比PowerShell CMDLET更有意义,而在许多情况下,相反,尤其吸引人的是您可以一起使用两个范式。作为一个简单的例子,请考虑:
Get-Process | Select-Object -Property Name, Path, Responding, Id | grep cron
这会产生:
anacron /usr/sbin/anacron True 3018
crond /usr/sbin/crond True 1033
yum-cron /usr/bin/python2.7 True 4760
第三列指示该过程是否响应。
如您所见,PowerShell和PowerShell与Linux命令的组合为解决和简化各种问题和任务提供了充足的机会。