Powershell后台作业、异步操作实例

Powershell是单线程程序且一次只能做一件事情。后台作业能额外增加Powershell进程在后台处理作业。当需要程序同时运行且数据量不是很大时它能很好的解决问题。但从Powershell后台回传数据是一个非常麻烦的工作,它将浪费很多时间。将会导致脚本更慢。

这里有3个并发执行任务:


代码如下:

$start = Get-Date

# get all hotfixes
$task1 = { Get-Hotfix }

# get all scripts in your profile
$task2 = { Get-Service | Where-Object Status -eq Running }

# parse log file
$task3 = { Get-Content -Path $env:windir\windowsupdate.log | Where-Object { $_ -like '*successfully installed*' } }

# run 2 tasks in the background, and 1 in the foreground task
$job1 =  Start-Job -ScriptBlock $task1
$job2 =  Start-Job -ScriptBlock $task2
$result3 = Invoke-Command -ScriptBlock $task3

# wait for the remaining tasks to complete (if not done yet)
$null = Wait-Job -Job $job1, $job2

# now they are done, get the results
$result1 = Receive-Job -Job $job1
$result2 = Receive-Job -Job $job2

# discard the jobs
Remove-Job -Job $job1, $job2

$end = Get-Date
Write-Host -ForegroundColor Red ($end - $start).TotalSeconds

上面执行全部的任务消耗了5.9秒。三个任务的结果将分别存入$result1, $result2, 和 $result3.
让我们再继续查看相继在前台执行完命令需要多长时间:

代码如下:

$start = Get-Date

# get all hotfixes
$task1 = { Get-Hotfix }

# get all scripts in your profile
$task2 = { Get-Service | Where-Object Status -eq Running }

# parse log file
$task3 = { Get-Content -Path $env:windir\windowsupdate.log | Where-Object { $_ -like '*successfully installed*' } }

# run them all in the foreground:
$result1 = Invoke-Command -ScriptBlock $task1
$result2 = Invoke-Command -ScriptBlock $task2
$result3 = Invoke-Command -ScriptBlock $task3

$end = Get-Date
Write-Host -ForegroundColor Red ($end - $start).TotalSeconds

结果,这次只花费了5.05秒。与后台作业几乎同时完成,所以后台作业更适合解决长时间执行的任务。从三个任务返回的数据观察,好处是这种按顺数在前台获得数据能减少了执行过程的开销。

时间: 2014-04-15

PowerShell快速创建一个指定大小文件的实例分享

有时做性能测试时,需要准备几个大文件,内容不限制.我以前比较傻,是这样做,拼命地往一个文本文件中写字符串,要写2G,也得花很长时间.今天发现使用FileStream可以秒杀. 复制代码 代码如下: $tempFile="pstips.net"$fs=New-Object System.IO.FileStream($tempFile,[System.IO.FileMode]::OpenOrCreate)$fs.Seek(2GB,[System.IO.SeekOrigin]::Begin)

PowerShell 获取系统信息的函数

复制代码 代码如下: function Get-SystemInfo{  param($ComputerName = $env:COMPUTERNAME) $header = 'Hostname','OSName','OSVersion','OSManufacturer','OSConfiguration','OS Build Type','RegisteredOwner','RegisteredOrganization','Product ID','Original Install Date'

C++如何获取系统信息 C++获取IP地址、硬件信息等

本文实例为大家分享了C++获取系统信息的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<winsock2.h> //该头文件需在windows.h之前 #include<windows.h> #include<string> #include<iostream> #pragma comment(lib,"ws2_32.lib") using namespace std; void ge

PowerShell获取当前进程PID的小技巧

本文介绍如何在PowerShell中获取当前PowerShell进程的PID,然后用它来做一些有趣的事情. 有没有试过在powershell命令行窗口中输入"$pid"?试试看. 复制代码 代码如下: PS C:\Users\zhanghong> $pid 4404 对于PID,我们貌似不陌生.是的,它就是一个进程的进程ID.那这里的"$pid"是谁的进程ID呢?是当前powershell这个命令行窗口的powershell进程的进程ID.注意,小编在先打开一

JS封装通过className获取元素的函数示例

本文实例讲述了JS封装通过className获取元素的函数.分享给大家供大家参考,具体如下: <div id="box"> <div class="star"></div> <div class="star"></div> <div class="app"></div> <p class="star"></

Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析

本文实例讲述了Yii2中设置与获取别名的函数(setAlias和getAlias)用法.分享给大家供大家参考,具体如下: 首先说说什么是别名. 在Yii中有很多的路径,在开发的过程当前我们也会使用一些路径.一般来说都需要使用绝对路径,但绝对路径都很长. 所以,为了方便的使用路径,可以在Yi中i给每个路径起个名称,这个名称就是别名. 别名的格式: 别名必须以"@"字符开头,别名中还可以包含"/".如("@www"为根别名,"@www/te

PowerShell获取系统环境变量的方法

本文介绍在PowerShell中,如何获取环境变量的值.可以列出所有的环境变量,也可以指定通过变量名称来获取环境变量的值. 在开发过程中,经常需要用到环境变量(比如当前计算机名.登录的用户名.Path环境变量等),那么在PowerShell中如何知道有哪些环境变量呢?又该如何获取指定环境变量的值呢? PowerShell通过环境变量提供者(Environment Provider)让我们可以访问环境变量.默认情况下,PowerShell创建了一个驱动器(名称为env)来与Environment

远程或本地获取系统信息的脚本RGIS.vbs

******************************************************************************* RGIS v1.03 Remote Get Infomation Script, by zzzEVAzzz Welcome to visite www.isgrey.com & www.h4h4.com Usage: cscript rgis.vbs [/r targetIP username password] [/o filename

python获取当前运行函数名称的方法实例代码

python获取当前运行函数名称的方法实例代码 摘要: c/c++中获取函数所在源码名,函数名和行号的方法很简单 __FILE__,__FUNCTION__和__LINE__ python没有这种语法,但也可以通过某种方法得到,这里给出例子,使用异常信息得到[可能会损失性能] 直接贴代码[可参考python核心编程4.4] #获取调用该函数所在(被调用)的函数名 #author:peterguo@vip.qq.com def get_func_name(): import sys try: ra

PowerShell获取Windows用户列表、用户信息的方法

WMI是Windows管理规范的缩写,其中包含很多系统的软硬件信息.而Windows用户信息也可以通过WMI对象来获取.PowerShell提供了对WMI的访问功能,十分方便且强大--这就是Get-WmiObject这个cmdlet. 获取所有的Windows用户列表: Get-WmiObject -Class Win32_UserAccount 或者 Get-WmiObject 复制代码 代码如下: Win32_UserAccount 如果是想知道查看当前登录的用户的信息,可以用如下语句: 复

Powershell小技巧之使用Jint引擎在PowerShell中执行Javascript函数

这里演示如何利用PowerShell将一段Javascript函数字符串交给Jint引擎去执行. 执行Javascript函数 .Net版的Javascript解释器 可以从Git上获取Jint的代码,也可以从nuget上下载Jint的程序集. Jint是一个面向.Net的Javascript解释器.Jint不会把Javascript编译成.Net字节码,所以它非常适用于脚本小且运行起来速度快的工程,或者运行在不同平台上的脚本. PowerShell调用 拿到Dll根据-Path参数直接使用Ad