WindowsPowerShell2.0背景作业与管道操作全解析
立即解锁
发布时间: 2025-08-19 01:07:19 阅读量: 1 订阅数: 3 


PowerShell 2.0编程入门与实践
### Windows PowerShell 2.0 背景作业与管道操作全解析
#### 1. 背景作业基础
Windows PowerShell 2.0 引入了将 cmdlet、函数和脚本作为背景作业(PSJob)执行的功能。背景作业在后台运行,无需与控制台交互。启动后,Windows PowerShell 会立即返回命令提示符,让你在作业运行时继续工作。
背景作业可以在本地计算机或具有安全访问权限的网络计算机上执行,非常适合运行可能需要一段时间才能完成的脚本和 cmdlet。默认情况下,Windows PowerShell 会立即返回命令执行结果并显示在控制台窗口中,但背景作业会返回一个代表作业对象的编号,你可以使用该对象来确定作业状态、控制执行并检索输出。
Windows PowerShell 提供了一些 cmdlet 用于从网络计算机检索信息,如 Get-Process、Get-Service、Get-EventLog 和 Get-WMIObject,这些命令通过调用 .NET 方法来检索对象数据,不依赖于 Windows PowerShell 的远程处理基础结构。
背景作业在自己的“运行空间”中运行,与当前控制台窗口中 Windows PowerShell 使用的执行环境分开。运行空间可以是临时的或持久的,临时运行空间在执行完命令或脚本后会立即删除,而持久运行空间会一直存在,直到你显式删除它,持久运行空间允许变量在不同脚本执行之间保持持久。
Windows PowerShell 2.0 提供了七个用于处理背景作业的 cmdlet:
| Cmdlet | 描述 |
| ---- | ---- |
| About-PSJob | 提供如何处理背景作业的高级概述 |
| Start-PSJob | 创建并执行新的本地或远程背景作业 |
| Receive-PSJob | 检索背景作业生成的输出 |
| Wait-PSJob | 指示 Windows PowerShell 等待背景作业完成 |
| Stop-PSJob | 停止背景作业的执行 |
| Get-PSJob | 检索背景作业的状态信息 |
| Remove-PSJob | 删除背景作业对象(包括其所有输出) |
此外,Windows PowerShell 2.0 还有一个 New-Runspace cmdlet,可用于设置一个持久运行空间来执行远程作业。
#### 2. 创建和执行背景作业
##### 2.1 在本地临时运行空间中创建和执行背景作业
要在本地计算机的临时运行空间中创建和执行背景作业,需要使用 Start-PSJob cmdlet,示例如下:
```powershell
PS C:\> Start-PSJob -command "Get-Service"
SessionId Name State HasMoreData Command
--------- ---- ----- ----------- -------
7 Running True Get-Service
PS C:\>
```
在这个例子中,Get-Service cmdlet 作为背景作业在本地计算机上运行。执行 Get-Service cmdlet 时不会显示输出,而是在表格中显示有关背景作业的一些状态信息,其中包括 SessionId 属性,你可以使用该属性在作业执行时与作业进行通信和控制。其他数据包括状态信息(显示作业是正在运行、失败、未启动还是已完成)和 HasMoreData(如果背景作业有可检索的输出数据,则值为 true)。
##### 2.2 远程执行背景作业
要在具有适当安全访问权限的网络计算机上远程执行背景作业,只需在语句末尾添加 -computername 参数,后跟网络计算机的主机名、UNC 名称或 IP 地址,示例如下:
```powershell
PS C:\> Start-PSJob -command "Get-Service" -computername FileSVR\
SessionId Name State HasMoreData Command
--------- ---- ----- ----------- -------
9 Running True Get-Service
PS C:\>
```
你还可以通过提供以逗号分隔的计算机列表,同时在多个网络计算机上运行背景作业,示例如下:
```powershell
PS C:\> Start-PSJob -command "Get-Service" -computername FileSVR,PrintSVR
```
##### 2.3 在持久运行空间中运行背景作业
如果你想在持久运行空间中运行背景作业,首先需要执行 New-Runspace cmdlet,然后使用 Start-PSJob cmdlet(使用其 runspace 参数),示例如下:
```powershell
PS C:\> $RunSP = New-Runspace -computername FileSVR
PS C:\> Start-PSJob -command "Get-Service" -runspace $RunSP
SessionId Name State HasMoreData Command
--------- ---- ----- ----------- -------
11 Running True Get-Service
PS C:\>
```
在这个例子中,创建了一个新的运行空间并将其分配给变量 $RunSP,然后使用 Start-PSJob cmdlet 在 $RunSP 运行空间中运行 Get-Service cmdlet。
#### 3. 检索背景作业信息和输出
##### 3.1 检索背景作业信息
当接收背景作业的输出时,前台运行空间会根据 SessionId 与后台会话进行通信。例如,使用 Get-PSJob cmdlet 和背景作业的 SessionId 可以检索其当前状态,示例如下:
```powershell
PS C:\> Get-PSJob 11
SessionId Name State HasMoreData Command
--------- ---- ----- ----------- -------
11 Completed True Get-Service
PS C:\>
```
在这个例子中,Get-Service cmdlet 作为背景作业运行,分配的会话 ID 为 11,作业已完成。并且,根据 HasMoreData 字段,背景作业有尚未接收的输出数据。除了检索特定背景作业的数据,你还可以通过执行不带任何参数的 Get-PSJob cmdlet 来检索当前工作会话中所有背景作业的信息,示例如下:
```powershell
PS C:\> Get-PSJob
SessionId Name State HasMoreData Command
--------- ---- ----- ----------- -------
1 Completed False start-sleep 30
3 Completed True get-process
5 Completed False get-process
7 Completed True Get-Service
9 Failed False Get-Service
11 Completed True Get-Service
PS C:\>
```
##### 3.2 检索背景作业输出
执行背景作业时,作业完成后不会自动返回输出,你需要使用 Receive-PSJob cmdlet 来检索背景作业的输出,示例如下:
```powershell
PS C:\> $MyJob = Start-PSJob "Get-Process"
PS C:\> Receive-PSJob $MyJob
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 5 1036 3208 31 0.03 1664 alg
428 6 2596 5020 28 97.31 464 csrss
410 15 9860 17588 68 4.80 1908 explorer
0 0 0 28 0 0 Idle
724 15 42156 14424 142 24.27 1740 iexplore
420 10 3796 2196 40 0.80 544 lsass
163 4 1268 1856 37 0.08 196 msmsgs
72 3 1852 5140 33 2.50 1232 notepad
270 9 20052 26036 129 2.44 872 powershell
329 11 30740 26888 142 2.19 1752 powershell
1853 19 33184 41096 160 5.69 1784 powershell
278 7 1960 3920 33 1.20 532 services
21 1 168 372 4 0.02 408 smss
104 4 2844 4096 39 0.09 1068 spoolsv
93 4 1440 3084 35 0.03 660 svchost
193 5 2856 4388 58 0.20 700 svchost
293 13 1684 3940 33 0.42 768 svchost
285 13 11460 12680 58 0.09 808 svchost
```
0
0
复制全文
相关推荐









