概述

  相信大家对后台任务处理不陌生,比如.Net的后台线程处理,Java的线程处理等等。

而当我们用PowerShell这个强大的工具时怎么样开启后台任务呢,以及怎样处理这些任务呢,本篇将会告诉你PowerShell后台任务处理。

1.什么时候会用到后台任务

当本地机器需要执行一个动作,此动作需要耗费很长时间,而机器在这段时间内只能等待,而我们希望在机器等待的这段时间内,我们还可以做其他事情。

这样我们就可以用后台任务来解决上面遇到的问题。

2.后台任务主要用在哪些场景

(1)将文件拷贝到多台远程机器,可以开启多个任务进行并行拷贝

(2)多台远程机器同时安装文件,可以开启多个任务进行并行安装

等等

3.PowerShell里面怎么开启后台任务  

(1)Start-Job

 $StartJob = Start-Job -ScriptBlock {Get-Process}
$StartJob

Id     Name     PSJobTypeName       State          HasMoreData     Location         Command       
--     ----             -------------           -----             -----------         --------             -------       
7      Job7         BackgroundJob      Running          True            localhost         Get-Process

我们能够从上面看到
$StartJob名字叫做Job7,Job的类型为后台Job,状态为Running,Command表示执行的命令式Get-Process 

(2)Invoke-Command -AsJob

 $InvokeCommandJob  = Invoke-Command -ComputerName LocalHost -ScriptBlock {Get-Process} -AsJob
$InvokeCommandJob

Id     Name      PSJobTypeName   State         HasMoreData   Location        Command                  
--     ----            -------------     -----         -----------       --------             -------                  
15     Job15       RemoteJob        Running       True              LocalHost       Get-Process

我们能够从上面看到
$InvokeCommandJob的类型为后台RemoteJob,表示远程执行的Job,这里我用到的远程机器为LocalHost本地机器作为测试机器,
大家可以用远程机器名替换这个地方的LocalHost

开启了一个任务后,我们总不能不管它吧,现在来说下怎么处理这些Job

4.处理Job

(1)Wait-Job

 #创建一个等待1s的后台任务
$WaitJob1 = Start-Job -ScriptBlock {Sleep -Seconds 10}
#创建一个等待5s的后台任务
$WaitJob2 = Start-Job -ScriptBlock {Sleep -Seconds 15}
#等待两个Job完成
Wait-Job -Job $WaitJob1,$WaitJob2 -Timeout 2
Id     Name       PSJobTypeName   State         HasMoreData     Location    Command                  
--     ----            -------------       -----         -----------     --------             -------                  
31     Job31      BackgroundJob   Completed     False           localhost       Sleep -Seconds 1         
33     Job33     BackgroundJob     Running       True            localhost       Sleep -Seconds 5 
从上面的执行结果可以看到$WaitJob2的状态为Running,因为等待的时间不够长,如果将等待的超时时间改长一点就可以了,代码如下:
 Wait-Job -Job $WaitJob1,$WaitJob2 -Timeout 10

还有一些等待Job完成的命令

 Wait-Job -Id $WaitJob1.Id,$WaitJob2.Id -Timeout 10
Wait-Job -Name $WaitJob1.Name,$WaitJob2.Name -Timeout 10
Wait-Job -InstanceId $WaitJob1.InstanceId,$WaitJob2.InstanceId -Timeout 10
Wait-Job -State Running -Timeout 10
通过上面的例子我们可以通过设定Timeout的时间来监控Job的状态

(2)Remove-Job

 Remove-Job -Id $WaitJob1.Id,$WaitJob2.Id
Remove-Job -Name $WaitJob1.Name,$WaitJob2.Name
Remove-Job -InstanceId $WaitJob1.InstanceId,$WaitJob2.InstanceId
Remove-Job -State Completed
Remove Job的时候一定要注意,如果该Job得状态不是完成的或者是停止的,就会抛出异常:
Remove-Job : The command cannot remove the job with the job ID 67 because the job is not finished. To remove the job, first
 stop the job, or use the Force parameter.
Parameter name: Job

如果要强制Remove Job,可以在后面添加一个参数-Force
 Remove-Job -Job $WaitJob1,$WaitJob2 -Force

下面我来讲一个非常有趣的问题

5.Start-Job传参                                                

比如我们现在要开启一个Job,计算$c=$a+$b,然后将计算结果写入到D:\a.txt文本文件中
 $a = 1
$b = 2
$c = 0
$Job = Start-Job -ScriptBlock {
$c = $a + $b
$c > "D:\a.txt"
}
OK,代码写好了,运行之后,我们期望得到的结果是D:\a.txt文本文件中的内容为3
但是事实上文本文件中的内容为空,这是为什么呢?因为我们忽略了一个问题:
ScriptBlock里面的参数都是需要参数传递进去的。
修改上面的代码:
 $a = 1
$b = 2
$c = 0
$Job = Start-Job -ArgumentList $a,$b -ScriptBlock {
param($a,$b)
$c = $a + $b
$c > "d:\a.txt"
}

运行上面的代码,可以看到文本文件中的内容为3。

6.引用&扩展阅读

以下链接为微软提供的技术资料:

http://technet.microsoft.com/library/2bc04935-0deb-4ec0-b856-d7290cca6442(v=wps.630).aspx

玩转PowerShell第一节——【后台任务处理】-技术&分享的更多相关文章

  1. 辛星跟您玩转vim第一节之vim的下载与三种模式

    首先值得一提的是,我的vim教程pdf版本号已经写完了,大家能够去下载,这里是csdn的下载地址:点此下载 ,假设左边的下载地址挂掉了,也能够自行在浏览器以下输入例如以下地址进行下载:http://d ...

  2. 玩转PowerShell第二节——【利用PsExec进行远程调用】-技术&分享

    概述 PowerShell用的最多的地方就是远程调用,在远程机器上执行脚本,监控远程机器的状态,如NLB状态,EventLog,SqlServer DataBase状态等. 本篇将讲到用PsExec. ...

  3. ASP.NET MVC深入浅出(被替换) 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery ) 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性) 第十节: EF的三种追踪

    ASP.NET MVC深入浅出(被替换)   一. 谈情怀-ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态 ...

  4. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

  5. 第四章 跨平台图像显示库——SDL 第一节 与SDL第一次亲密接触

    http://blog.csdn.net/visioncat/article/details/1596576 GCC for Win32 开发环境介绍(5) 第四章 跨平台图像显示库——SDL 第一节 ...

  6. VUE2.0实现购物车和地址选配功能学习第一节(来源--慕课网河畔一角)

    第一节  vue知识 vue-resource:和后台交互的一个插件,实现get.post和jsonp等功能.(替代jQuery) vue特点: 1.易用:通过创建vue实例,{{}}绑定数据十分方便 ...

  7. 第一节:.Net版基于WebSocket的聊天室样例

    一. 说在前面的话 该篇文章为实时通讯系列的第一节,基于WebSocket编写了一个简易版聊天样例,主要作用是为引出后面SignalR系列的用法及其强大方便之处,通过这个样例与后续的SignalR对比 ...

  8. 第一节:ASP.NET开发环境配置

    第一节:ASP.NET开发环境配置 什么是ASP.NET,学这个可以做什么,学习这些有什么内容? ASP.NET是微软公司推出的WEB开发技术. 2002年,推出第一个版本,先后推出ASP.NET2. ...

  9. Android精通教程-第一节Android入门简介

    前言 大家好,给大家带来Android精通教程-第一节Android入门简介的概述,希望你们喜欢 每日一句 If life were predictable it would cease to be ...

随机推荐

  1. Null Object模式

    去除代码中的if(obj==null),或者try/catch语句.维持Code的一致性. Null对象,代表"什么也不做"的一个对象. 使Null对象称为一个匿名内部类确保了该类 ...

  2. Spring之事件发布系统

    springboot应用,启动spring容器大致有如下几个过程: 容器开始启动 初始化环境变量 初始化上下文 加载上下文 完成 对应的Spring应用的启动器的监听器可以监听以上的过程,接口如下: ...

  3. bzoj 1207: [HNOI2004]打鼹鼠

    1207: [HNOI2004]打鼹鼠 Time Limit: 10 Sec  Memory Limit: 162 MB Description 鼹鼠是一种很喜欢挖洞的动物,但每过一定的时间,它还是喜 ...

  4. springJDBC学习笔记和实例

    前言:相对于Mybatis(ibatis),个人感觉springJDBC更灵活,主要实现类JdbcTemplate:它替我们完成了资源的创建以及释放工作,从而简化了我们对JDBC的使用.它还可以帮助我 ...

  5. 爬虫神器xpath的用法(三)

    xpath的多线程爬虫 #encoding=utf-8 ''' pool = Pool(4) cpu的核数为4核 results = pool.map(爬取函数,网址列表) ''' from mult ...

  6. android: SharedPreferences实现记住密码功能

    既然是实现记住密码的功能,那么我们就不需要从头去写了,因为在上一章中的最佳实 践部分已经编写过一个登录界面了,有可以重用的代码为什么不用呢?那就首先打开 BroadcastBestPractice 项 ...

  7. 转:Media Player Classic - HC 源代码分析

    VC2010 编译 Media Player Classic - Home Cinema (mpc-hc) Media Player Classic - Home Cinema (mpc-hc)播放器 ...

  8. mac上安装homebrew

    1:关于homebrew下载地址 homebrew下载地址网上版本很多:我用了几个都是显示 404 bad request 如图:均无法现在 有一个网址会给出最新的 安装地址: the URL is: ...

  9. KVM 基础使用(一)

    Host OS:CentOS release 6.3 (Final) x64 安装时选择Virtual Host 1.测试KVM有没有启动 运行 lsmod | grep kvm 和 stat /de ...

  10. 画之国 Le tableau (2011)

    在佛斯特的肚子里,靠近幽门的地方,两只阿米巴原虫快乐地生活着.他们的日子过得很舒服,从来没饿过肚子,而且根本用不着干活:因为他们就是所谓的寄生虫.这两个好朋友相处得很愉快,但时不时也会争论不休,因为他 ...