关于编译
脚本.bat文件
之前对脚本文件接触较少,以下面的小段代码,以小窥大,开始对脚本的初步学习
----------------------------------------------------------------------------------------------- @echo off echo 现在的 %%cd%% 和 %%~dp0 没啥区别... echo %%cd%% --- %cd% echo %%~dp0 --- %~dp0 echo 请在按下任意键后,将跳转到D盘的111\222目录去... pause > nul cd /d D:\111\222 echo 现在再来看看它们的区别... echo %%cd%% --- %cd% echo %%~dp0 --- %~dp0 pause ------------------------------------------------------------------------------------------------
(1)命令行文件夹
cd /d D:\111\222:表示直接切换到后面的文件夹。若不加参数 /d,达到同样的效果需要2步走
cd D:\111\222 D:
或者更麻烦的方法,按路径从左至右依次进入
D: cd 111 cd 222
(2)pause .VS. pause > nul
关于编译pause:暂停命令,执行时会在命令行窗口显示“请按任意键继续. . .”,并等待你按键
pause > nul:作用相同,区别是不显示“请按任意键继续. . .”这些字,nul 把文字隐藏了
nul 是空设备/空文件,可以理解成批处理的“黑洞”(什么东西都可以吞下,并使之永远消失)
(3)@ .VS. echo off
echo off:关闭下面命令的回显
@:关闭当前命令回显,值影响当前行,但是,@并不受echo状态的影响
@echo off:关闭所有命令行的回显
(4)%cd% .VS. %~dp0
- %cd%:当前目录工作路径,%~dp0:脚本所在路径
- %cd% 得到的最后不带\,%~dp0后面会带\
在当前目录没有变化的情况下,两者确实没啥不同,但当脚本在运行中切换了目录,那么就有区别。
- a)%cd% 可以用在批处理文件中,也可以用在命令行中,展开后是驱动器盘符:+当前目录。如在dos窗口中进入c:\dir目录下面, 输入:echo %cd% ,则显示为:c:\dir。 %cd%的内容是可以被改变的,其内容为命令的执行路径或批处理文件的执行路径。
- b)%~dp0 只可以用在批处理文件中,它是由它所在的批处理文件的目录位置决定的,是批处理文件所在的盘符:+路径。在执行这个批处理文件的过程中,它展开后的内容是不可以改变的。
(5)其他常用命令
\..:回溯至上一层目录 call:调用另一个批处理文件 call build_ex.bat @if not exist %OUTROOT% @md %OUTROOT%:目录|文件不存在则创建 @rem:用于注释 @ren:文件重命名 @del:删除文件 %date% %time%:当前日期时间 Copy "%OUTROOT%\xxx.txt" "%OUTPUT%":文件拷贝
(6)文件操作
//脚本启动.exe程序 pushd 绝对路径(最后不带\) start exeName.exe exit
Debug .VS. Release
1. Debug:调试模式,包含调试信息,生成的二进制命令没有经过编译器的优化。
2. Release:发布模式,编译器优化,不能对源代码进行调试,代码文件小,执行速度优。
Debug和Release模式均会生成.exe或.dll文件。但是Debug模式还会生成.pdb文件,包含代码断点、单步执行等调试信息。
注意,代码中包含预编译指令时,务必谨慎;
在实际生产上部署,应该使用Release版本。
关于obj文件
用于存放编译过程中生成的中间临时文件。obj目录中包含Debug和Release两个子文件夹,是项目生成的.dll的源目录,然后将生成好的.dll复制到bin目录下。在.Net中,
- 编译是分模块进行的,每个模块的编译结果都保存在obj目录下,最后会合并为一个.exe或.dll文件保存到bin目录下;
- 编译是增量编译,只重新编译改变了的模块;
obj目录保存了这些小块的编译结果,可以加快编译速度。
疑难杂题
1. ConfigurationManager.GetSection Error
//问题 创建 xxx 的配置节处理程序时出错: 未能加载文件或程序集“exeName”或它的某一个依赖项。系统找不到指定的文件。 (exeName_Test.exe.Config line 4); //解决 右键项目,修改程序集名称,然后重新生成
注意,程序集名称、生成的exeName、配置文件名,以及配置文件中的
<configSections> <section name="nodeName" type="XXX.AppName.Config.className, 程序集name "/> </configSections>
要保持一致。其中,className 程序中定义形式如下
namespace XXX.AppName.Config { public class className: ConfigurationSection { [ConfigurationProperty("configName", IsRequired = true)] public ServerCollection ConfigName { get { return this["configName"] as ServerCollection; } } } }