参考:http://blogs.technet.com/b/deploymentguys/archive/2010/07/07/using-command-shell-scripts-with-mdt.aspx

OK… I’ll admit it, I like to write Command Shell (CMD) scripts when I can.  For me it’s like putting on an old broken-in pair of sneakers… so comfortable and familiar.  Unfortunately, using them in MDT task sequences can be challenging.  I this post I’ll demonstrate some techniques and helper scripts that can bring Command Shell scripts into the MDT era.  There are four main tasks that I’ll address today: calling other scripts and executables, getting Task Sequence Variables, setting Task Sequence Variables, and logging.

CALLING SCRIPTS AND EXECUTABLES

A big issue with running scripts and executables from CMD scripts in MDT is calling them from the correct path.  The command shell does not support a UNC path as the current directory and defaults to %SystemRoot%\System32 when running a CMD script in this way.  In order to call scripts and executables in the same folder as the CMD script itself you should always use the full path to the scripts and executables.  To prevent having to hard code these paths, I use the following code to set the folder where the CMD script resides as an environment variable:

set SCRIPTDIR=%~dp0
set SCRIPTDIR=%SCRIPTDIR:~0,-1%

This allows you “variablize” the paths to scripts and executables in the same folder (or subfolders) as the CMD script.  For example, to run foo.exe in the same folder as the CMD script you would now use this syntax:

“%SCRIPTDIR%\foo.exe”

GETTING TASK SEQUENCE VARIABLES

It would obviously be very convenient if you could access Task Sequence Variables as environment variables.  To that end I created a script, EchoTSVariables.wsf, that will echo variable=value lines for all Task Sequence Variables (plus the current MDT log path) to the console.  This can then be called from a FOR statement to set these as environment variables:

for /F “tokens=1,2* delims==” %%i in (‘cscript //nologo “%SCRIPTDIR%\EchoTSVariables.wsf”‘) do set %%i=%%j>nul

SETTING TASK SEQUENCE VARIABLES

Setting Task Sequence Variables from a CMD script requires a similar helper script.  Fortunately, MDT includes just such a script.  ZTISetVariable.wsf can be called directly from a CMD script:

cscript //nologo “%SCRIPTDIR%\ZTISetVariable.wsf” /VariableName:Foo /VariableValue:Bar

This will set a Task Sequence Variable named Foo to a value of Bar.  For this new variable to be available in the CMD script environment, you would have to rerun the FOR statement withEchoTSVariables.wsf again.

LOGGING

For logging the output of executables and for logging messages directly, I have used native CMD script code plus a small helper script, EchoDateTimeVars.vbs.  This script simply echoes date and time variables in a locale-independent format.  I then created CMD functions like the one below:

:LOGINFO

set INPUTTEXT=%*
    echo %INPUTTEXT%
    for /F “tokens=*” %%i in (‘cscript //nologo “%SCRIPTDIR%\EchoDateTimeVars.vbs”‘) do set %%i>nul
    echo ^<^^![LOG[%INPUTTEXT%]LOG]^^!^>^<time=”%HOUR%:%MINUTE%:%SECOND%.000+000″ date=”%MONTH%-%DAY%-%YEAR%” component=”%COMPONENT%” context=”" type=”1″ thread=”" file=”%COMPONENT%”^>>>”%LOGFILE%”

goto :EOF

This logs an information message in a log with the same base name as the CMD script.  This function depends on having first run EchoTSVariables.wsf and then the following commands near the beginning of the script to set the COMPONENT and LOGFILE variables:

set LOGFILE=%LOGPATH%\%~n0.log
set MASTERLOG=%LOGPATH%\BDD.log
set COMPONENT=%~n0

There are also LOGWARNING and LOGERROR functions as well.  These are all called using this syntax:

call :LOGINFO Info text I want to log in SMS log format right now please
call :LOGWARNING Warning text I want to log in SMS log format right now please
call :LOGERROR Error text I want to log in SMS log format right now please

I created two functions for running executables, logging the output and checking the return code. The first, RUNANDLOG, will run the executable, log the output to a single log entry, and set the environment variable RETURNCODE based on the errorlevel after the command is executed.  The second, RUNANDLOGLINEBYLINE, log the output line by line.  This is useful when the output of a command is Unicode (like wmic) but needs to be logged as ANSI in the MDT logs.  Unfortunately, RUNANDLOGLINEBYLINE does not allow the capture of the return code of the command.

Finally, the log file created by this script is appended to the master MDT log, BDD.log, using the following command

if exist “%MASTERLOG%” copy “%MASTERLOG%” + “%LOGFILE%” “%MASTERLOG%” /y

SUMMARY

I have provided a sample script, MDTCmdScript.cmd, in the attachment to this post.  It demonstrates all of these techniques mentioned above.  When using this you should place the script commands you want to run between the Begin main script and Finish main scriptcomments.  I have also included all the scripts needed to make this work (except forZTISetVariable.wsf and ZTIUtility.vbs which come with MDT).  All the scripts should be in the same folder.

For some additional tips on using CMD script with MDT, see Michael Niehaus’ blog post here:http://blogs.technet.com/b/mniehaus/archive/2007/03/07/adding-custom-tasks-to-bdd-2007-task-sequences.aspx.

Disclaimer: The information on this site is provided “AS IS” with no warranties, confers no rights, and is not supported by the authors or Microsoft Corporation. Use of included script samples are subject to the terms specified in the Terms of Use.

This post was contributed by Michael Murgolo, a Senior Consultant with Microsoft Services – U.S. East Region.

MDT部署中命令行脚本的使用。的更多相关文章

  1. 【转】如何在命令行脚本中启动带参数的Windows服务

    我们有一个自己编写的Windows服务,我们希望该服务在启动时可以根据用户输入的参数实现不同的功能. 要实现这样的需求并不是很难,下面这个例子我用来示范如何编写该服务 using System; us ...

  2. 探索Windows命令行系列(3):命令行脚本基础

    1.实用功能 1.1.为脚本添加注释 1.2.控制命令的回显 1.3.使用数学表达式 1.4.向脚本传递参数 2.使用变量 2.1.变量的命名及定义 2.2.调用变量 2.3.变量的作用域 3.结构语 ...

  3. .NET Core部署中你不了解的框架依赖与独立部署

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9703460.html NET Core项目发布的时候你有没有注意到这两个选项呢?有没有纠结过框架依赖与独 ...

  4. Redmine部署中遇到的问题

    Redmine部署文章: 第一篇:Redmine部署 第二篇:Redmine部署中遇到的问题 上一篇文章我写了Redmine怎样部署(点这里直达上一篇文章),这一篇就写一下在Redmine部署中遇到过 ...

  5. SQL Server Reporting Services:无法检索应用程序文件。部署中的文件已损坏

    如果在客户端计算机上启动Microsoft SQL Server 2012的 ClickOnce 版本的 Microsoft SQL Server 报表生成器时出现"无法检索应用程序文件.部 ...

  6. 如何将cmd中命令输出保存为TXT文本文件

    在使用Windows 中的cmd.exe工具时,有时候我们想要把我们的输入命令及结果保存起来, 但是用复制的方法过于麻烦:有时输出数据条数过大,会造成内容自动滚出屏幕,无法阅读,我们可将命令运行的结果 ...

  7. c#中命令copy已退出,返回值为1

    c#中命令copy已退出,返回值为1 本正经的道:董姐刚才你说的修心养性其中的'修心'我 有孕在身刚好由戴梦瑶顶替了她的位置按照的指示 ╋旆呆 湎术葶页 邾箕砜笳 烦璜卿廑 奶奶个腿儿的等下次非让你 ...

  8. 使用Tomcat-redis-session-manager来实现Tomcat集群部署中的Session共享

    一.工作中因为要使用到Tomcat集群部署,此时就涉及到了Session共享问题,主要有三种解决方案: 1.使用数据库来存储Session 2.使用Cookie来存储Session 3.使用Redis ...

  9. 在微服务系统开发部署中使用Azure RBAC自定义角色

    Azure的官方文档介绍了如何创建用于Azure基于角色的访问控制的自定义角色(RBAC Role). 我们也可以根据同样的原理把RBAC细粒度资源管理运用于微服务产品的开发部署中.(https:// ...

随机推荐

  1. picurl

    from lxml import etreeimport requestsdef getHtml(html): novelcontent = requests.get(html).content re ...

  2. 20145225《Java程序设计》 第4周学习总结

    20145225<Java程序设计> 第4周学习总结 教材学习内容总结 第六章 继承与多态 6.1继承 继承共同行为:存在着重复,可把相同的程序代码提升(pull up)为父类.exten ...

  3. HTML5的touch事件

    HTML5中新添加了很多事件,但是由于他们的兼容问题不是很理想,应用实战性不是太强,所以在这里基本省略,咱们只分享应用广泛兼容不错的事件,日后随着兼容情况提升以后再陆续添加分享.今天为大家介绍的事件主 ...

  4. BestCoder Round #87 1001

    GCD is Funny Accepts: 524 Submissions: 1147 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 655 ...

  5. Android性能优化方法(七)

    Java从JDK1.2版本开始,就把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用. 这里重点介绍一下软引用和弱引用. 如果 ...

  6. Titanium系列--Titanium的简介、Titanium Studio安装和配置(一)

    1. 是什么?--是一个可以通过javascript,html,css等web技术开发移动App的的开发框架,媲美原生App体验和性能,目前支持IOS和Android平台. 2. 为什么能做这个? - ...

  7. 3.3 SQLite数据库

    1.使用嵌入式关系型SQLite数据库存储数据 轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能.SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用 ...

  8. FileOutputStream保存文件

    //保存文件,根据传入的路径,存放在SD卡目录下public boolean saveToPath(String title, String pageName) { Bitmap b = getCha ...

  9. Xamarin开发Android笔记:图片切换ImageSwitcher

    在移动应用开发过程中经常会使用到图片展示场景,例如利用多张图片说明一个产品的特点,此处就会使用到ImageSwithcher,当然也可以使用ViewFliper来实现,但使用ViewFliper的时候 ...

  10. Xamarin开发Android笔记:背景操作

    使用Xamarin开发Android UI的时可能会遇到一些场景背景的问题,虽然可以利用多层或直接使用图片背景来完成,但这样会增加不少的资源消耗,最终导致内存溢出的情况.最好的方法还是利用内部方法或代 ...