这篇文章中的代码需要使用之前写的文件,如有疑问可先参考该分类下的其他文章。
bat程序的方便性是大部分人喜欢用的原因,毕竟任何一种“正经”的编程语言都能甩它好几条街。
在之前介绍过我程序的使用目的——能简单方便地维护产线中的上百台电脑。这些电脑都使用的是Windows,我只要写一个bat程序,拷贝到任何一台电脑,任何一个会使用鼠标双击的操作员都可以方便地进行维护,某台电脑出现特殊维护需求,我也可以直接对程序进行修改。
但是bat程序的调试并没有说的那么直接,如果程序参数有错,可能在显示错误的下一帧,程序的运行窗口就自己关闭了。。。
例如:main.bat
@echo off
for /l "" %%i in (1,1,10) do (
echo %%i %%j
)
pause
for
命令后的引号是随便加的,然后加了一句暂停。如果你运行这个程序,窗口会闪一下就关闭,并没有执行到pause命令(因为在for命令中语法错误,异常退出了),然而你不可能在这一瞬间看到窗口上给你的错误提示。
如果程序代码稍多,在错误之后立马退出,你是很难去发现自己的程序是哪个命令出了问题(你甚至有可能都不知道自己的程序出了问题)。
要想bat程序在出现错误之后不退出,解决的办法是在其他程序中start它。(原因是当你start一个bat程序时,实际上是开启了一个“cmd.exe”的进程,和你手动运行cmd后输入命令一样,遇到错误不会马上退出,程序运行完你还可以直接在这个窗口下继续输入命令)
例如:start.bat
start main.bat
你会看到“start.bat”的窗口在一瞬间关闭(当然你也可以加一句pause让它等待),然后在另一个窗口中“main.bat”开始运行,错误会显示出来,而且并没有退出,你可以继续输入命令。
这时我们就知道“main.bat”的问题所在了:“”was unexpected at this time.
我们的错误提示问题已经解决了,不过还没有完。如果你的程序需要给别人用,那么你需要展现在别人眼前的,应该只是一个开始按钮,防止别人在无意中从错误的文件开始运行。你可以选择把所有代码都放在一个文件夹里,然后在文件夹外去call这个文件。这样,别人在使用时就只需要运行“start.bat”文件了。
而在给别人一个入口的同时,也可以给自己弄一个方便的入口,也就是上面的“Debug.bat”。
Debug.bat
@echo off
setlocal enabledelayedexpansion
set main=".\Main\main.bat"
call ".\XZLib\FilePath.bat" "."
set CurrentPath=!AbsolutePath!
echo @echo off>".\Start.bat"
echo setlocal enabledelayedexpansion>>".\Start.bat"
echo.>>".\Start.bat"
echo cd "!CurrentPath!">>".\Start.bat"
echo call %main%>>".\Start.bat"
start "!CurrentPath!" ".\Start.bat"
你可以在最开始设置你的程序入口,然后运行这个文件,就会自动在同一目录下生成“Start.bat”文件,并start这个文件,这里的“Start.bat”,会首先修改运行路径为当前的绝对路径,然后call主程序的相对路径。这样做看似麻烦无用,但是在某些时候“Start.bat”被别的程序call时,你就理解这样设计的目的了。
生成的代码如下:Start.bat
@echo off
setlocal enabledelayedexpansion
cd "C:\Batch_For_Win7\trunk\AutoBackup"
call ".\Main\main.bat"
从“Debug.bat”运行会重新生成“Start.bat”,其中的cd
语句后的路径也会更新,同时会保留你的程序窗口,哪怕程序出现错误。
从“Start.bat”运行则是直接跳到程序的入口,如果你的程序不用pause
语句保留窗口,或者你的程序遇到错误,那么不会有任何的提示。
当你只需要运行时,你可以双击“Start.bat”;当你移动了文件夹的位置,或者你需要调试程序时,你需要双击“Debug.bat”。如果你需要别人帮忙在同时对多台电脑进行维护时,你完全可以删掉“Start.bat”让他们从“Debug.bat”运行,然后你只需要去挨个检查窗口中是否有报错。如果需要设置任务自动运行,你应该把“Start.bat”的路径设置为运行路径,因为它不会保留窗口(你可不希望程序在自动运行30次后你再去手动一个个关闭。。。)。
这篇文章中的代码需要使用之前写的文件,如有疑问可先参考该分类下的其他文章。