﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-luqingfei@C++-随笔分类-Windows</title><link>http://www.cppblog.com/luqingfei/category/14142.html</link><description>&lt;font color='gray'&gt;为中华之崛起而崛起！&lt;/font&gt;&lt;br/&gt;
兼听则明，偏听则暗。
</description><language>zh-cn</language><lastBuildDate>Mon, 15 Jul 2013 09:52:46 GMT</lastBuildDate><pubDate>Mon, 15 Jul 2013 09:52:46 GMT</pubDate><ttl>60</ttl><item><title>使用lib.exe生成.lib文件</title><link>http://www.cppblog.com/luqingfei/archive/2013/07/15/201817.html</link><dc:creator>luqingfei</dc:creator><author>luqingfei</author><pubDate>Mon, 15 Jul 2013 07:34:00 GMT</pubDate><guid>http://www.cppblog.com/luqingfei/archive/2013/07/15/201817.html</guid><wfw:comment>http://www.cppblog.com/luqingfei/comments/201817.html</wfw:comment><comments>http://www.cppblog.com/luqingfei/archive/2013/07/15/201817.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luqingfei/comments/commentRss/201817.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luqingfei/services/trackbacks/201817.html</trackback:ping><description><![CDATA[<p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">在程序使用Dll有两个加载方式，一种是动态方式，就是LoadLibrary载入Dll,然后用GetProcAddress来加载需要使用的Dll函数。另一种就是静态连接方式，将dll生成的lib，加入到工程中，然后就可以很方便的调用。</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">我们知道很多dll在发布时不提供lib，没有lib我们就不能静态的加载，所以得想办法来生成一个lib，在vs2005中有这样的一个命令</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">不过我们还需要一个def文件，怎样来获得一个def文件哪？</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">我们知道def是一个库导出文件 简单的格式是：EXPORTS&nbsp; 和 一些导出函数</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">我们可以用vc6自带的一个depends来查看dll中有哪些导出函数，来手动做一个.def文件</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">将xxx.dll和xxx.def，放到一个文件夹中，启动&#8220;Visual Studio 2005 命令提示&#8221;</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">将工作目录切换到放有xxx.dll和xxx.def的文件夹中输入：</p><div style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">lib /def:xxx.def /MACHINE:x86</div><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">这样将会产生一个xxx.lib了，将此lib文件和dll文件拷到工程中，就可以进行静态链接了</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;"><a href="http://blog.csdn.net/twtzw/article/details/2733783" style="font-family: verdana, 'courier new'; line-height: 21px;"></a></p><img src ="http://www.cppblog.com/luqingfei/aggbug/201817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luqingfei/" target="_blank">luqingfei</a> 2013-07-15 15:34 <a href="http://www.cppblog.com/luqingfei/archive/2013/07/15/201817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何区分导入库和静态库</title><link>http://www.cppblog.com/luqingfei/archive/2013/07/15/201816.html</link><dc:creator>luqingfei</dc:creator><author>luqingfei</author><pubDate>Mon, 15 Jul 2013 07:32:00 GMT</pubDate><guid>http://www.cppblog.com/luqingfei/archive/2013/07/15/201816.html</guid><wfw:comment>http://www.cppblog.com/luqingfei/comments/201816.html</wfw:comment><comments>http://www.cppblog.com/luqingfei/archive/2013/07/15/201816.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luqingfei/comments/commentRss/201816.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luqingfei/services/trackbacks/201816.html</trackback:ping><description><![CDATA[<div>通过命令 &gt;lib /list Demo.lib</div><div></div><div>如果该 Demo.lib是静态库，输出如下：</div><div>&gt;lib /list Demo.lib</div><div>Microsoft (R) Library Manager Version 8.00.50727.42</div><div>Copyright (C) Microsoft Corporation. All rights reserved.</div><div></div><div>.\Debug\Demo.obj</div><div>.\Debug\Person.obj</div><div>.\Debug\stdafx.obj</div><div>.\Debug\Demo.res</div><div></div><div></div><div></div><div></div><div>如果该 Demo.lib是导入库，输出如下：</div><div>&gt;lib /list Demo.lib</div><div>Microsoft (R) Library Manager Version 8.00.50727.42</div><div>Copyright (C) Microsoft Corporation. &nbsp;All rights reserved.</div><div></div><div>Demo.dll</div><div>Demo.dll</div><div>Demo.dll</div><div>Demo.dll</div><div>Demo.dll</div><div>Demo.dll</div><div>Demo.dll<br /><br /><br />转：<a href="http://blog.sina.com.cn/s/blog_611b75a80100emow.html">http://blog.sina.com.cn/s/blog_611b75a80100emow.html</a></div><img src ="http://www.cppblog.com/luqingfei/aggbug/201816.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luqingfei/" target="_blank">luqingfei</a> 2013-07-15 15:32 <a href="http://www.cppblog.com/luqingfei/archive/2013/07/15/201816.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>lib文件</title><link>http://www.cppblog.com/luqingfei/archive/2013/07/15/201815.html</link><dc:creator>luqingfei</dc:creator><author>luqingfei</author><pubDate>Mon, 15 Jul 2013 07:25:00 GMT</pubDate><guid>http://www.cppblog.com/luqingfei/archive/2013/07/15/201815.html</guid><wfw:comment>http://www.cppblog.com/luqingfei/comments/201815.html</wfw:comment><comments>http://www.cppblog.com/luqingfei/archive/2013/07/15/201815.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luqingfei/comments/commentRss/201815.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luqingfei/services/trackbacks/201815.html</trackback:ping><description><![CDATA[<div>.lib是一种文件名后缀</div><div>该文件为Windows操作系统中的库文件，相当于Linux中的.a或.o、.so文件</div><div>lib有静态lib和动态lib之分。</div><div></div><div>lib文件通过编译才可以使用编译分静态与动态之分。</div><div></div><div>静态编译</div><div>静态lib将导出声明和实现都放在lib中。编译后所有代码都嵌入到宿主程序</div><div>动态编译</div><div>动态lib相当于一个h文件，是对实现部分（.dll文件）的导出部分的声明。编译后只是将导出声明部分编译到宿主程序中，运行时候需要相应的dll文件支持</div><div></div><div></div><div>一个lib文件是obj文件的集合。当然，其中还夹杂着其他一些辅助信息，目的是为了让编译器能够准确找到对应的obj文件。我们可以通过tlib.exe（在tc2.0下的根目录）来对lib文件进行操作，你可以把自己生成的obj文件通过tlib命令加入到一个lib文件中，也可以把lib文件内的obj文件进行删除操作，还可以把内部的obj文件给提取出来。明白了lib文件的大致结构以及对它的具体操作，在学习C语言的过程中，就会又多了一个切入点对C语言具体实现进行研究。</div><div></div><div></div><div>与dll区别</div><div>(1)lib是编译时需要的，dll是运行时需要的。</div><div>如果要完成源代码的编译，有lib就够了。</div><div>如果也使动态连接的程序运行起来，有dll就够了。</div><div>在开发和调试阶段，当然最好都有。</div><div></div><div></div><div>(2)一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的，而dll文件是运行期才会被调用的。如果有dll文件，那么对应的lib文件一般是一些索引信息，具体的实现在dll文件中。如果只有lib文件，那么这个lib文件是静态编译出来的，索引和实现都在其中。静态编译的lib文件有好处：给用户安装时就不需要再挂动态库了。但也有缺点，就是导致应用程序比较大，而且失去了动态库的灵活性，在版本升级时，同时要发布新的应用程序才行。</div><div></div><div>(3)在动态库的情况下，有两个文件，一个是引入库（.LIB）文件，一个是DLL文件，引入库文件包含被DLL导出的函数的名称和位置，DLL包含实际的函数和数据，应用程序使用LIB文件链接到所需要使用的DLL文件，库中的函数和数据并不复制到可执行文件中，因此在应用程序的可执行文件中，存放的不是被调用的函数代码，而是DLL中所要调用的函数的内存地址，这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来，从而节省了内存资源。从上面的说明可以看出，DLL文件必须随应用程序一起发行，否则应用程序将会产生错误。</div><div></div><img src ="http://www.cppblog.com/luqingfei/aggbug/201815.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luqingfei/" target="_blank">luqingfei</a> 2013-07-15 15:25 <a href="http://www.cppblog.com/luqingfei/archive/2013/07/15/201815.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]动态链接库、静态库、import库区别</title><link>http://www.cppblog.com/luqingfei/archive/2013/07/14/201792.html</link><dc:creator>luqingfei</dc:creator><author>luqingfei</author><pubDate>Sun, 14 Jul 2013 07:11:00 GMT</pubDate><guid>http://www.cppblog.com/luqingfei/archive/2013/07/14/201792.html</guid><wfw:comment>http://www.cppblog.com/luqingfei/comments/201792.html</wfw:comment><comments>http://www.cppblog.com/luqingfei/archive/2013/07/14/201792.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luqingfei/comments/commentRss/201792.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luqingfei/services/trackbacks/201792.html</trackback:ping><description><![CDATA[<div><strong style="font-size: 14pt;">动态链接库、静态库、import库区别</strong></div><div></div><div><strong>动态链接库(Dynamic Linked Library)：</strong></div><div>Windows为应用程序提供了丰富的函数调用，这些函数调用都包含在动态链接库中。其中有3个最重要的DLL，Kernel32.dll，它包含用于管理内存、进程和线程的各个函数；</div><div></div><div>User32.dll，它包含用于执行用户界面任务(如窗口的创建和消息的传送)的各个函数；GDI32.dll，它包含用于画图和显示文本的各个函数。</div><div></div><div><strong>静态库(Static Library)：</strong></div><div>函数和数据被编译进一个二进制文件(通常扩展名为.LIB)。在使用静态库的情况下，在编译链接可执行文件时，链接器从库中复制这些函数和数据并把它们和应用程序的其它模块</div><div></div><div>组合起来创建最终的可执行文件(.EXE文件)。</div><div></div><div><strong>导入库(Import Library)：</strong></div><div>在使用动态链接库的时候，往往提供两个文件：一个引入库和一个DLL。引入库包含被DLL导出的函数和变量的符号名，DLL包含实际的函数和数据。在编译链接可执行文件时，只需</div><div></div><div>要链接引入库，DLL中的函数代码和数据并不复制到可执行文件中，在运行的时候，再去加载DLL，访问DLL中导出的函数。</div><div></div><div>在运行Windows程序时，它通过一个被称作&#8220;动态链接&#8221;的进程与Windows相接。一个Windows的.EXE文件拥有它使用不同动态链接库的引用，所使用的函数即在那里。当Windows程</div><div></div><div>序被加载到内存中时，程序中的调用被指向DLL函数的入口，如果DLL不在内存中，系统就将其加载到内存中。</div><div></div><div>当链接Windows程序以产生一个可执行文件时，你必须链接由编程环境提供的专门的&#8220;导入库(import library)库&#8221;。这些导入库包含了动态链接库名称和所有Windows函数调用的</div><div></div><div>引用信息。链接程序使用该信息在.EXE文件中构造一个表，当加载程序时，Windows使用它将调用转换为Windows函数。<br /></div><div></div><div><strong>静态库与导入库的区别：</strong></div><div>导入库和静态库的区别很大，他们实质是不一样的东西。静态库本身就包含了实际执行代码、符号表等等，而对于导入库而言，其实际的执行代码位于动态库中，导入库只包含了</div><div></div><div>地址符号表等，确保程序找到对应函数的一些基本地址信息。<br /></div><div></div><div></div><div><strong>静态链接与动态链接：</strong></div><div></div><div>静态链接方法：#pragma comment(lib, "test.lib") ，静态链接的时候，载入代码就会把程序会用到的动态代码或动态代码的地址确定下来</div><div>静态库的链接可以使用静态链接，动态链接库也可以使用这种方法链接导入库</div><div></div><div>动态链接方法：LoadLibrary()/GetProcessAddress()和FreeLibrary()，使用这种方式的程序并不在一开始就完成动态链接，而是直到真正调用动态库代码时，载入程序才计算(被调用的那部分)动态代码的逻辑地址，然后等到某个时候，程序又需要调用另外某块动态代码时，载入程序又去计算这部分代码的逻辑地址，所以，这种方式使程序初始化时间较短，但运行期间的性能比不上静态链接的程序。</div><div></div><div>在软件开发的过程中，大家经常会或多或少的使用别人编写的或者系统提供的动态库或静态库，但是究竟是使用静态库还是动态库呢？他们的适用条件是什么呢？</div><div>&nbsp;</div><div>简单的说，静态库和应用程序编译在一起，在任何情况下都能运行，而动态库是动态链接，顾名思义就是在应用程序启动的时候才会链接，所以，当用户的系统上没有该动态库时，应用程序就会运行失败。再看它们的特点：</div><div>动态库：</div><div>1.共享：多个应用程序可以使用同一个动态库，启动多个应用程序的时候，只需要将动态库加载到内存一次即可；</div><div>2.开发模块好：要求设计者对功能划分的比较好。</div><div>&nbsp;</div><div>静态库：代码的装载速度快，执行速度也比较快，因为编译时它只会把你需要的那部分链接进去，应用程序相对比较大。但是如果多个应用程序使用的话，会被装载多次，浪费内存。</div><div>&nbsp;</div><div>总上，我个人认为，如果你的系统上有多个应用程序都使用该库的话，就把它编译成<strong>动态库</strong>，这样虽然刚启动的时候加载比较慢，但是多任务的时候会比较节省内存；如果你的系统上只有一到两个应用使用该库，并且使用的API比较少的话，就编译成静态库吧，一般的静态库还可以进行裁剪编译，这样应用程序可能会比较大，但是启动的速度会大大提高。</div><div>&nbsp;</div><div>呵呵，个人的一些心得，不足之处，欢迎指出！<br />转自：<a href="http://www.cnblogs.com/kex1n/archive/2011/09/06/2168435.html">http://www.cnblogs.com/kex1n/archive/2011/09/06/2168435.html<br /><br /></a></div><img src ="http://www.cppblog.com/luqingfei/aggbug/201792.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luqingfei/" target="_blank">luqingfei</a> 2013-07-14 15:11 <a href="http://www.cppblog.com/luqingfei/archive/2013/07/14/201792.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows环境变量设置</title><link>http://www.cppblog.com/luqingfei/archive/2010/06/27/118823.html</link><dc:creator>luqingfei</dc:creator><author>luqingfei</author><pubDate>Sun, 27 Jun 2010 07:19:00 GMT</pubDate><guid>http://www.cppblog.com/luqingfei/archive/2010/06/27/118823.html</guid><wfw:comment>http://www.cppblog.com/luqingfei/comments/118823.html</wfw:comment><comments>http://www.cppblog.com/luqingfei/archive/2010/06/27/118823.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luqingfei/comments/commentRss/118823.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luqingfei/services/trackbacks/118823.html</trackback:ping><description><![CDATA[设置环境变量有两种方式：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一种是在命令提示符运行窗口中设置；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二种是通过单击&#8220;我的电脑&#8594;属性&#8594;高级&#8221;标签的&#8220;环境变量&#8221;按钮设置。<br>需要注意的是，第一种设置环境变量的方式只对当前运行窗口有效，关闭运行窗口后，设置就不起作用了，而第二种设置环境变量的方式则是永久有效。<br>&nbsp;<br><br>&nbsp; 在&#8220;开始&#8594;运行&#8221;框中输入&#8220;cmd&#8221;后按&#8220;确定&#8221;按钮，出现命令运行窗口。<br>在命令提示符下输入&#8220;set&#8221;即可查看环境变量设置。<br>要查看具体某个环境变量的设置，比如要查看path环境变量的设置，可以输入&#8220;set path&#8221;。<br>要创建一个环境变量，比如要创建一个名为aa的，值为&#8220;c:&#8221;的环境变量，可以输入&#8220;set aa=c:&#8221;命令。<br>而要删除一个环境变量，比如要删除aa环境变量，则可输入&#8220;set aa=&#8221;命令（注意=后面不能有空格）。<br><br>如何更改一个环境变量的设置呢？更改环境变量有两种情况：<br>一是追加方式，即在不改变环境变量现有设置的情况下，增加变量的值，比如要给环境变量aa增加一个值为&#8220;D:&#8221;的设置，可以输入&#8220;set aa=%path%;D:&#8221;。<br>另一种是完全修改方式，对于这种方式，我们可以采用直接创建一个环境变量的方法来实现。
<img src ="http://www.cppblog.com/luqingfei/aggbug/118823.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luqingfei/" target="_blank">luqingfei</a> 2010-06-27 15:19 <a href="http://www.cppblog.com/luqingfei/archive/2010/06/27/118823.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Windows下set命令详解 </title><link>http://www.cppblog.com/luqingfei/archive/2010/06/27/118820.html</link><dc:creator>luqingfei</dc:creator><author>luqingfei</author><pubDate>Sun, 27 Jun 2010 05:09:00 GMT</pubDate><guid>http://www.cppblog.com/luqingfei/archive/2010/06/27/118820.html</guid><wfw:comment>http://www.cppblog.com/luqingfei/comments/118820.html</wfw:comment><comments>http://www.cppblog.com/luqingfei/archive/2010/06/27/118820.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luqingfei/comments/commentRss/118820.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luqingfei/services/trackbacks/118820.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最近想要在Windows下批量备份文件成不同的日期后缀，需要一个时间变量，于是翻阅了很多资料，发现可以用set命令很方便得在bat中实现。于是顺便也研究了一下set命令的详细使用方法。首先来看一下set命令的官方help： <br>&nbsp;<br>C:\Documents and Settings\wangxiaoqi&gt;set /?</p>
<p><span style="COLOR: #0000ff">显示、设置或删除 cmd.exe 环境变量。</span> <br>&nbsp;<br>SET [variable=[string]] <br>&nbsp;<br>&nbsp; variable&nbsp; 指定环境变量名。<br>&nbsp; string&nbsp;&nbsp;&nbsp; 指定要指派给变量的一系列字符串。 <br>&nbsp;<br><span style="COLOR: #0000ff">要显示当前环境变量，键入不带参数的 SET。</span> <br>&nbsp;<br>如果命令扩展名被启用，SET 会如下改变: <br>&nbsp;<br>可仅用一个变量激活 SET 命令，等号或值不显示所有前缀匹配SET 命令已使用的名称的所有变量的值。例如: <br>&nbsp;<br>&nbsp;&nbsp;&nbsp; SET P <br>&nbsp;<br><span style="COLOR: #0000ff">会显示所有以字母 P 打头的变量</span> <br>&nbsp;<br>如果在当前环境中找不到该变量名称，SET 命令将把 ERRORLEVEL设置成 1。 <br>&nbsp;<br><span style="COLOR: #ff0000">SET 命令不允许变量名含有等号。</span> <br>&nbsp;<br>在 SET 命令中添加了两个新命令行开关: <br>&nbsp;<br>&nbsp;&nbsp;&nbsp; SET /A expression<br>&nbsp;&nbsp;&nbsp; SET /P variable=[promptString] <br>&nbsp;<br>/A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式评估器很简单并以递减的优先权顺序支持下列操作: <br>&nbsp;<br>&nbsp;&nbsp;&nbsp; ()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 分组<br>&nbsp;&nbsp;&nbsp; ! ~ -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 一元运算符<br>&nbsp;&nbsp;&nbsp; * / %&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 算数运算符<br>&nbsp;&nbsp;&nbsp; + -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 算数运算符<br>&nbsp;&nbsp;&nbsp; &lt;&lt; &gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 逻辑移位<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 按位&#8220;与&#8221;<br>&nbsp;&nbsp;&nbsp; ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 按位&#8220;异&#8221;<br>&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 按位&#8220;或&#8221;<br>&nbsp;&nbsp;&nbsp; = *= /= %= += -=&nbsp;&nbsp;&nbsp; - 赋值<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;= ^= |= &lt;&lt;= &gt;&gt;=<br>&nbsp;&nbsp;&nbsp; ,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 表达式分隔符 <br>&nbsp;<br>如果您使用任何逻辑或取余操作符， 您需要将表达式字符串用引号扩起来。在表达式中的任何非数字字符串键作为环境变量名称，这些环境变量名称的值已在使用前转换成数字。如果指定了一个环境变量名称，但未在当前环境中定义，那么值将被定为零。这使您可以使用环境变量值做计算而不用键入那些 % 符号来得到它们的值。如果 SET /A 在命令脚本外的命令行执行的，那么它显示该表达式的最后值。该分配的操作符在分配的操作符左边需要一个环境变量名称。除十六进制有 0x 前缀， 八进制有 0 前缀的，数字值为十进位数字。因此， 0x12 与 18 和 022相同。请注意八进制公式可能很容易搞混: 08 和 09 是无效的数字，因为 8 和 9 不是有效的八进制位数。 <br>&nbsp;<br>/P 命令行开关允许将变量数值设成用户输入的一行输入。读取输入行之前，显示指定的 promptString。promptString 可以是空的。 <br>&nbsp;<br>环境变量替换已如下增强: <br>&nbsp;<br>&nbsp;&nbsp;&nbsp; %PATH:str1=str2% <br>&nbsp;<br>会扩展 PATH 环境变量，用 "str2" 代替扩展结果中的每个 "str1"。要有效地从扩展结果中删除所有的 "str1"，"str2" 可以是空的。"str1" 可以以星号打头；在这种情况下，"str1" 会从扩展结果的开始到 str1 剩余部分第一次出现的地方，都一直保持相配。 <br>&nbsp;<br>也可以为扩展名指定子字符串。 <br>&nbsp;<br>&nbsp;&nbsp;&nbsp; %PATH:~10,5% <br>&nbsp;<br>会扩展 PATH 环境变量，然后只使用在扩展结果中从第 11 个(偏移量 10)字符开始的五个字符。如果没有指定长度，则采用默认值，即变量数值的余数。如果两个数字(偏移量和长度)都是负数，使用的数字则是环境变量数值长度加上指定的偏移量或长度。 <br>&nbsp;<br>&nbsp;&nbsp;&nbsp; %PATH:~-10% <br>&nbsp;<br>会提取 PATH 变量的最后十个字符。 <br>&nbsp;<br>&nbsp;&nbsp;&nbsp; %PATH:~0,-2% <br>&nbsp;<br>会提取 PATH 变量的所有字符，除了最后两个。 <br>&nbsp;<br>终于添加了延迟环境变量扩充的支持。该支持总是按默认值被停用，但也可以通过 CMD.EXE 的 /V 命令行开关而被启用/停用。<br>请参阅 CMD /? <br>&nbsp;<br>考虑到读取一行文本时所遇到的目前扩充的限制时，延迟环境变量扩充是很有用的，而不是执行的时候。以下例子说明直接变量扩充的问题: <br>&nbsp;<br>&nbsp;&nbsp;&nbsp; set VAR=before<br>&nbsp;&nbsp;&nbsp; if "%VAR%" == "before" (<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set VAR=after<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if "%VAR%" == "after" @echo If you see this, it worked<br>&nbsp;&nbsp;&nbsp; ) <br>&nbsp;<br>不会显示消息，因为在读到第一个 IF 语句时，BOTH IF 语句中的 %VAR% 会被代替；原因是: 它包含 IF 的文体，IF 是一个复合语句。所以，复合语句中的 IF 实际上是在比较 "before" 和"after"，这两者永远不会相等。同样，以下这个例子也不会达到预期效果: <br>&nbsp;<br>&nbsp;&nbsp;&nbsp; set LIST=<br>&nbsp;&nbsp;&nbsp; for %i in (*) do set LIST=%LIST% %i<br>&nbsp;&nbsp;&nbsp; echo %LIST% <br>&nbsp;<br>原因是，它不会在目前的目录中建立一个文件列表，而只是将LIST 变量设成找到的最后一个文件。这也是因为 %LIST% 在FOR 语句被读取时，只被扩充了一次；而且，那时的 LIST 变量是空的。因此，我们真正执行的 FOR 循环是: <br>&nbsp;<br>&nbsp;&nbsp;&nbsp; for %i in (*) do set LIST= %i <br>&nbsp;<br>这个循环继续将 LIST 设成找到的最后一个文件。 <br>&nbsp;<br>延迟环境变量扩充允许您使用一个不同的字符(惊叹号)在执行时间扩充环境变量。如果延迟的变量扩充被启用，可以将上面例子写成以下所示，以达到预期效果: <br>&nbsp;<br>&nbsp;&nbsp;&nbsp; set VAR=before<br>&nbsp;&nbsp;&nbsp; if "%VAR%" == "before" (<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set VAR=after<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if "!VAR!" == "after" @echo If you see this, it worked<br>&nbsp;&nbsp;&nbsp; ) <br>&nbsp;<br>&nbsp;&nbsp;&nbsp; set LIST=<br>&nbsp;&nbsp;&nbsp; for %i in (*) do set LIST=!LIST! %i<br>&nbsp;&nbsp;&nbsp; echo %LIST% <br>&nbsp;<br>如果命令扩展名被启用，有几个动态环境变量可以被扩展，但不会出现在 SET 显示的变量列表中。每次变量数值被扩展时，这些变量数值都会被动态计算。如果用户用这些名称中任何一个定义变量，那个定义会替代下面描述的动态定义: <br>&nbsp;<br>%CD%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 扩展到当前目录字符串。 <br>%DATE%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 用跟 DATE 命令同样的格式扩展到当前日期。 <br>%TIME%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 用跟 TIME 命令同样的格式扩展到当前时间。 <br>%RANDOM%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 扩展到 0 和 32767 之间的任意十进制数字。 <br>%ERRORLEVEL%&nbsp;&nbsp;&nbsp; - 扩展到当前 ERRORLEVEL 数值。 <br>%CMDEXTVERSION% - 扩展到当前命令处理器扩展名版本号。 <br>%CMDCMDLINE%&nbsp;&nbsp;&nbsp; - 扩展到调用命令处理器的原始命令行。 <br>&nbsp;<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; 这次用到的属性可以参见红色标注段落，可以做一个实验来加深理解： <br>&nbsp;<br>C:\Documents and Settings\wangxiaoqi&gt;set a=1234567890 <br>&nbsp;<br>C:\Documents and Settings\wangxiaoqi&gt;echo %a%<br>1234567890 <br>&nbsp;<br>C:\Documents and Settings\wangxiaoqi&gt;echo %a:~3,3%<br>456 <br>&nbsp;<br>C:\Documents and Settings\wangxiaoqi&gt;echo %a:~3%<br>4567890 <br>&nbsp;<br>C:\Documents and Settings\wangxiaoqi&gt;echo %a:~-3%<br>890 <br>&nbsp;<br>C:\Documents and Settings\wangxiaoqi&gt;echo %a:~-3,-2%<br>8 <br>&nbsp;<br>C:\Documents and Settings\wangxiaoqi&gt;echo %a:~-3,-4%<br>ECHO 处于打开状态。 <br>&nbsp;<br>C:\Documents and Settings\wangxiaoqi&gt;echo %a:~,-4%<br>123456 <br>&nbsp;<br>C:\Documents and Settings\wangxiaoqi&gt;echo %a:~4,%<br>ECHO 处于打开状态。 </p>
<p>&nbsp;&nbsp;&nbsp; 总得来说，windows下面这个特性的应用跟oracle下面的substr函数还是有区别的，主要是第二位的负数处理存在差异。Oracle的第二位负数表示从右往左数，而Windows下的set命令第二位负数表示从右边开始截断多少位，只有单独使用的时候才表示从左往右数。 <br>&nbsp;<br>&nbsp;&nbsp;&nbsp; 这次需要用到的是日期变量，所以可以很容易得通过set命令来实现： <br>&nbsp;<br>C:\Documents and Settings\wangxiaoqi&gt;echo %DATE%<br>2009-04-30 星期四 <br>&nbsp;<br>C:\Documents and Settings\wangxiaoqi&gt;set b=%DATE:~0,10% <br>&nbsp;<br>C:\Documents and Settings\wangxiaoqi&gt;echo %b%<br>2009-04-30 <br>&nbsp;<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; 需要注意的是：不同的Windows版本，DATE的默认格式是不同的，有的星期放在左边，有的星期放在右边，所以最好先echo出来看一看再调整参数，当然在左边的就更方便了，直接 %DATE:~-10% 就可以了。有空的时候再研究一下别的特性。 <br><br></p>
<img src ="http://www.cppblog.com/luqingfei/aggbug/118820.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luqingfei/" target="_blank">luqingfei</a> 2010-06-27 13:09 <a href="http://www.cppblog.com/luqingfei/archive/2010/06/27/118820.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>