设为首页 收藏本站
查看: 1212|回复: 0

PowerShell基础教程(18)——使用 Windows PowerShell 执行管理任务

[复制链接]

尚未签到

发表于 2017-5-20 06:19:19 | 显示全部楼层 |阅读模式
PowerShell基础教程(18)——使用 Windows PowerShell 执行管理任务             <o:p></o:p>

Windows PowerShell 的基本目标是使您能够以交互方式或通过脚本更好、更容易地对系统进行管理控制。本章综述了在用 Windows PowerShell 管理 Windows 系统时出现的很多特定问题的解决方案。尽管我们尚未在“Windows PowerShell 入门”中介绍脚本或函数,但随后可以在脚本中或作为函数使用这些解决方案。在提供的示例中,函数将作为解决问题的解决方案的一部分。
在整个解决方案说明中,您将看到使用特定 cmdlet 的解决方案、常规 Get-WmiObject cmdlet、甚至还有作为 Windows 和 .NET 基础结构组成部分的外部工具等诸多方案的混合体。使用外部工具是 Windows PowerShell 的长期设计意图的一部分。甚至随着系统不断发展,用户将继续遇到可用工具集无法完成所有任务的情况。Windows PowerShell 不鼓励仅仅依赖 cmdlet 实现,而是尝试支持将来自所有可能的替代方案的解决方案集成在一起。
管理本地进程             <o:p></o:p>

核心进程 cmdlet 只有两个:Get-ProcessStop-Process。由于有可能使用参数或对象 cmdlet 来检查和筛选进程,因此可以只使用这两个 cmdlet 来执行一些复杂的任务。
列出进程 (Get-Process)<o:p></o:p>
通过无参数运行 Get-Process,可以获得正在本地系统中运行的所有进程的列表。
通过使用 ID 参数指定 ProcessId,还可以返回单个进程。以下示例将返回系统空闲进程:
PS> Get-Process -Id 0<o:p></o:p>
Handles  NPM(K)    PM(K)        WS(K) VM(M)   CPU(s)     Id ProcessName<o:p></o:p>
-------  ------      -----      ----- -----   ------       -- -----------<o:p></o:p>
0       0        0         16     0               0 Idle<o:p></o:p>
<o:p> </o:p>
尽管在某些情况下 cmdlet 不返回任何数据是正常的,但按其 ProcessId 指定进程时,如果 Get-Process 找不到匹配项,它将生成错误,因为它的常见用途是检索已知的正在运行的进程。如果不存在具有该 ID 的进程,则很可能是 ID 不正确,或者感兴趣的进程已经退出:
PS> Get-Process -Id 99<o:p></o:p>
Get-Process :找不到   ID 为 99 的进程。<o:p></o:p>
所在行:1 字符:12 <o:p></o:p>
+ Get-Process    <<<< -Id 99<o:p></o:p>
<o:p> </o:p>
Name 参数可以用来基于进程名称指定进程的子集。因为进程可以有相同名称,所以输出可能包括多个进程。如果不存在具有该名称的进程,则 Get-Process 将像指定 ProcessId 时一样返回错误。例如,如果指定进程名称 explore 而不是 explorer
PS> Get-Process -Name explore<o:p></o:p>
Get-Process :找不到名称为“explore”的进程。<o:p></o:p>
所在行:1 字符:12 <o:p></o:p>
+ Get-Process    <<<< -Name explore<o:p></o:p>
<o:p> </o:p>
Name 参数支持使用通配符,因此可以键入名称的前几个字符并且后跟星号来获得列表:
PS> Get-Process -Name ex*<o:p></o:p>
Handles  NPM(K)    PM(K)        WS(K) VM(M)   CPU(s)     Id ProcessName<o:p></o:p>
-------  ------      -----      ----- -----   ------       -- -----------<o:p></o:p>
234       7     5572        12484   134     2.98     1684 EXCEL<o:p></o:p>
555      15    34500        12384   134   105.25      728 explorer<o:p></o:p>
<o:p> </o:p>
<!----><!----><!---->请注意: <o:p></o:p>
因为 .NET System.Diagnostics.Process 类是 Windows PowerShell 进程的基础,因此它遵从 System.Diagnostics.Process 所使用的某些约定。这些约定之一是,可执行文件的进程名称永远不包括可执行文件名末尾的“.exe”。<o:p></o:p>
<o:p> </o:p>
Get-Process 还将接受 Name 参数的多个值。像指定单个名称一样,如果无法匹配名称,则尽管仍会获得匹配进程的正常输出,但将显示错误:
PS> Get-Process -Name exp*,power*,NotAProcess<o:p></o:p>
Get-Process :找不到名称为“NotAProcess”的进程。<o:p></o:p>
所在行:1 字符:12 <o:p></o:p>
+ Get-Process    <<<< -Name exp*,power*,svchost,NotAProcess<o:p></o:p>
Handles  NPM(K)    PM(K)        WS(K) VM(M)   CPU(s)     Id ProcessName<o:p></o:p>
-------  ------      -----      ----- -----   ------       -- -----------<o:p></o:p>
540      15    35172        48148   141    88.44      408 explorer<o:p></o:p>
605       9    30668        29800   155     7.11     3052 powershell<o:p></o:p>
<o:p> </o:p>
停止进程 (Stop-Process)<o:p></o:p>
Windows PowerShell 可让您灵活地列出进程,但如何停止进程呢?
Stop-Process cmdlet 采用 Name 或 ID 来指定希望停止的进程。是否能够停止进程取决于您的权限。某些进程不能停止。例如,如果试图停止空闲进程,则将获得错误:
PS> Stop-Process -Name Idle<o:p></o:p>
Stop-Process :由于以下错误无法停止进程“Idle   (0)”:<o:p></o:p>
访问被拒绝<o:p></o:p>
所在行:1 字符:13 <o:p></o:p>
+ Stop-Process    <<<< -Name Idle<o:p></o:p>
<o:p> </o:p>
还可以用 Confirm 参数强制进行提示。如果指定进程名称时使用通配符,则此参数特别有用,因为您可能意外匹配一些不想停止的进程:
PS> Stop-Process -Name t*,e* -Confirm<o:p></o:p>
确认<o:p></o:p>
是否确实要执行此操作?<o:p></o:p>
对目标“explorer (408)”执行操作“Stop-Process”。<o:p></o:p>
[Y]   是  [A] 全是  [N] 否  [L] 全否  [S] 挂起  [?] 帮助<o:p></o:p>
(默认值为“Y”):n<o:p></o:p>
确认<o:p></o:p>
是否确实要执行此操作?<o:p></o:p>
对目标“taskmgr (4072)”执行操作“Stop-Process”。<o:p></o:p>
[Y]   是  [A] 全是  [N] 否  [L] 全否  [S] 挂起  [?] 帮助<o:p></o:p>
(默认值为“Y”):n<o:p></o:p>
<o:p> </o:p>
通过使用某些对象筛选 cmdlet,可以进行复杂的进程操作。由于进程对象有 Responding 属性,当进程不再响应时该属性将为 True,因此可以用以下命令停止所有无响应的应用程序:
Get-Process | Where-Object -FilterScript {$_.Responding   -eq $false} | Stop-Process<o:p></o:p>
<o:p> </o:p>
您可以在其他情况下使用相同的方法。例如,假设用户启动一个应用程序时另一个辅助的系统任务栏应用程序自动运行。您可能发现这在终端服务会话中无法正确工作,但仍然需要使它在物理计算机控制台上的会话中持续运行。连接到物理计算机桌面的会话的会话 ID 始终是 0,因此通过使用 Where-Object 和进程的 SessionId,可以停止在其他会话中的所有进程实例:
Get-Process -Name BadApp | Where-Object -FilterScript   {$_.SessionId -neq 0} | Stop-Process<o:p></o:p>
<o:p> </o:p>
停止所有其他 Windows PowerShell 会话<o:p></o:p>
可能偶尔需要能够停止除了当前会话以外所有正在运行的 Windows PowerShell 会话。如果会话正在使用太多资源,或者不可访问(它可能正在远程运行,或者在另一个桌面会话中),则可能无法直接停止它。但是,如果试图停止所有正在运行的会话,则可能终止当前会话。
每个 Windows PowerShell 会话都有环境变量 PID,其中包含 Windows PowerShell 进程的 ID。可以对照每个会话的 ID 检查该 $PID,并只终止有不同 ID 的 Windows PowerShell 会话。以下管道命令执行此操作,并返回被终止会话的列表(由于使用了 PassThru 参数):
PS> Get-Process -Name powershell | Where-Object   -FilterScript {$_.Id -ne $PID} | Stop-Process -<o:p></o:p>
PassThru<o:p></o:p>
Handles  NPM(K)      PM(K)      WS(K) VM(M)   CPU(s)       Id ProcessName<o:p></o:p>
-------  ------      -----      ----- -----   ------       -- -----------<o:p></o:p>
334       9    23348        29136   143     1.03      388 powershell<o:p></o:p>
304       9    23152        29040   143     1.03      632 powershell<o:p></o:p>
302       9    20916        26804   143     1.03     1116 powershell<o:p></o:p>
335       9    25656        31412   143     1.09     3452 powershell<o:p></o:p>
303       9    23156        29044   143     1.05     3608 powershell<o:p></o:p>
287       9    21044        26928   143     1.02     3672 powershell<o:p></o:p>
<o:p> </o:p>
管理本地服务             <o:p></o:p>

共有八个核心服务 cmdlet,它们是为众多的服务任务设计的。我们将只介绍如何列出和更改服务的运行状态,但您可以使用 Get-Help *-Service 获得服务 cmdlet 的列表,还可以使用 Get-Help<Cmdlet 名称>(例如,Get-Help New-Service)查找有关每个服务 cmdlet 的信息。
列出服务<o:p></o:p>
通过使用 Get-Service,可以枚举计算机上的本地服务。与 Get-Process 一样,无参数使用 Get-Service 命令将返回所有服务。可以按名称筛选,甚至使用星号通配符:
PS> Get-Service -Name se*<o:p></o:p>
Status   Name               DisplayName<o:p></o:p>
------   ----               -----------<o:p></o:p>
Running    seclogon           Secondary   Logon<o:p></o:p>
Running  SENS               System Event Notification<o:p></o:p>
Stopped  ServiceLayer       ServiceLayer<o:p></o:p>
<o:p> </o:p>
由于服务的真实名称是什么并非始终是很明显的,因此您可能发现需要按显示名查找服务。可以按具体名称、使用通配符或使用显示名列表来执行该操作:
PS> Get-Service -DisplayName se*<o:p></o:p>
Status   Name               DisplayName<o:p></o:p>
------   ----               -----------<o:p></o:p>
Running    lanmanserver       Server<o:p></o:p>
Running  SamSs              Security Accounts Manager<o:p></o:p>
Running    seclogon           Secondary   Logon<o:p></o:p>
Stopped    ServiceLayer       ServiceLayer<o:p></o:p>
Running  wscsvc             <st1:place w:st="on"><st1:placename w:st="on">Security</st1:placename> <st1:placetype w:st="on">Center</st1:placetype></st1:place><o:p></o:p>
PS> Get-Service -DisplayName ServiceLayer,Server<o:p></o:p>
Status   Name               DisplayName<o:p></o:p>
------   ----               -----------<o:p></o:p>
Running    lanmanserver       Server<o:p></o:p>
Stopped    ServiceLayer       ServiceLayer<o:p></o:p>
<o:p> </o:p>
停止、启动、挂起和重新启动服务<o:p></o:p>
所有服务 cmdlet 都有相同的常规形式。可以按公用名或显示名指定服务,并且可以用列表和通配符作为值。若要停止后台打印程序,请使用:
Stop-Service -Name spooler<o:p></o:p>
<o:p> </o:p>
若要在后台打印程序停止之后启动它,请使用:
Start-Service -Name spooler<o:p></o:p>
<o:p> </o:p>
若要挂起后台打印程序,请使用:
Suspend-Service -Name spooler<o:p></o:p>
<o:p> </o:p>
Restart-Service cmdlet 的工作方式与其他服务 cmdlet 相同,但我们将介绍它的一些更复杂的示例。在最简单的使用中,可以指定服务的名称:
PS> Restart-Service -Name spooler<o:p></o:p>
警告:正在等待服务“Print   Spooler (Spooler)”完成启动...<o:p></o:p>
警告:正在等待服务“Print   Spooler (Spooler)”完成启动...<o:p></o:p>
PS><o:p></o:p>
<o:p> </o:p>
您将注意到,系统会显示有关后台打印程序正在启动的重复警告消息。在执行需要占用一定时间的服务操作时,Windows PowerShell 将通知您它仍在尝试执行该任务。
如果要重新启动多个服务,可以先获得服务列表,并对它们进行筛选,然后执行重新启动:
PS> Get-Service | Where-Object -FilterScript   {$_.CanStop} | Restart-Service<o:p></o:p>
警告:正在等待服务“Computer   Browser (Browser)”完成停止...<o:p></o:p>
警告:正在等待服务“Computer   Browser (Browser)”完成停止...<o:p></o:p>
Restart-Service :无法停止服务“Logical   Disk Manager (dmserver)”,因为具有依赖它的服务。只有在设置了 Force 标志时才能停止该服务。<o:p></o:p>
所在行:1 字符:57 <o:p></o:p>
+ Get-Service | Where-Object -FilterScript {$_.CanStop} |   Restart-Service <<<<<o:p></o:p>
警告:正在等待服务“Print   Spooler (Spooler)”完成启动...<o:p></o:p>
警告:正在等待服务“Print   Spooler (Spooler)”完成启动...<o:p></o:p>
<o:p> </o:p>
收集有关计算机的信息             <o:p></o:p>

Get-WmiObject 是用于执行常规系统管理任务的最重要 cmdlet。所有关键的子系统设置都是通过 WMI 公开的。此外,WMI 将数据视为有一个或多个项目的集合中的对象。由于 Windows PowerShell 还能处理对象,并且它的管道允许您以相同方式对待单个或多个对象,因此,通用 WMI 访问可让您用非常少的工作量执行一些高级任务。
以下示例演示如何通过对任意计算机使用 Get-WmiObject 来收集特定信息。我们用表示本地计算机的点值 (.) 指定 ComputerName 参数。您可以指定与可以通过 WMI 访问的任何计算机关联的名称或 IP 地址。若要检索有关本地计算机的信息,可以省略 -ComputerName .
列出桌面设置<o:p></o:p>
我们首先介绍用于收集本地计算机的桌面相关信息的命令。 
Get-WmiObject -Class Win32_Desktop -ComputerName .<o:p></o:p>
<o:p> </o:p>
此命令将返回所有桌面的信息,无论它们是否正在使用。
<!----><!----><!---->请注意: <o:p></o:p>
某些 WMI 类返回的信息可能非常详细,并且通常包含有关 WMI 类的元数据。由于这些元数据属性的名称大

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-379164-1-1.html 上篇帖子: PowerShell基础教程(3)——Windows PowerShell 使用初步 下篇帖子: PowerShell Popup Method
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表