批处理Bat 中一些重要的知识点

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/guyan1101/article/details/86507984

1.

call socflash.bat option=lr flashtype=2 if=C:\Users\Administrator\Desktop\C1041.BC.0309\C1041.BC.0309.bin

call命令调用另一个批处理程序,并且不终止父批处理程序(如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令)

call 命令接受用作跳转目标的标签。如果在脚本或批处理文件外使用call,它将不会在命令行起作用

start命令与call命令的区别

call的时候,他们拥有同一个壳cmd.exe,在同一个进程当中,所以他们的变量是互通的。

start的时候,他们拥有两个壳cmd.exe,但child.bat可以看成是main.bat的子进程,子进程可以读取父进程中的变量。

对于start,概况二句话:“不同进程不能传值”,“相同进程单向传值,老子传儿子,非儿子传老子”。

对于call,“同一进程,变量互通”。

一是调用范围不同:call主要用来进行批处理的内部调用,如call :pend 和一些dos命令的调用如call set test=2,但也可以调用其他可执行文件,而start则不能进行内部调用,但其可以执行基本上所有的外部程序,还可以执行shell,如打开文件夹start "" "%WINDIR%",安装网络打印机start "" "\\IP\Printer"等等。

二是调用方式不同:call是严格意义上而言的调用,在call另一个批处理时是在同一窗体进程里执行,而start则是执行,所以在执行另外一个批处理时是在不同的窗体进程里进行,也就是说在新开启的进程里执行,虽然start可以加入b参数,但其结果却完全不同。如我们使用call set test=2 和 start /b set test=2 看似执行的结果相同,但是我们发现后者有两个进程,而且在窗体里要执行两次exit才能退出,所以当我们使用start来执行一个批处理后最好在被调用的批处理中也加一个exit,否则无法退出被调用的批处理的dos窗体,但是使用call调用时如果在被调用的批处理中存在exit则会直接结束原始和被调用的批处理程序,这是一个非常严重的问题。建议在被调用的批处理中使用goto :eof来取代exit。

三是调用结果不同:call调用不仅可以把参数或变量传给被调用的批处理,而且被调用的批处理也可以设置参数或变量以便回传,而start只能把参数或变量传给被调用的批处理,却不能回传参数或变量,这一点实际上是第二点的延伸。另外,我们还必须注意一点:使用call调用其他批处理时,在被调用的批处理中若我们使用goto命令的时候,建议要使用与原批处理中不同的标签名来跳转,否则可能会跳转到原批处理中而不能保证完整的执行被调用批处理中的所有语句。

2.

start /b Wcs_Get_Fan.bat #### /b 启动应用程序时不必打开新的“命令提示符”窗口。除非应用程序启用 CTRL+C,否则将忽略 CTRL+C 操作。使用 CTRL+BREAK 中断应用程序。

if %errorlevel%==0 (

call %PostInfoPath% /p "Execute %path%\Wcs_Get_Fun.bat" /log %logpath%

) else (

call %PostInfoPath% /p "An unexpected error occured executing the %path%\Wcs_Get_Fun.bat" /log %logpath%

goto end

)

3.

if "%3"=="/log" (

if defined logfile (             ###判断变量是否被定义

if not exist %4 (

if not exist %~dp4 mkdir %~dp4 ###d-disk p-path

echo Start log > %LOGFILE%

)

echo %date% %time% :%POSTINFO% >> %LOGFILE%

) else (

echo Please enter the full path of log file

goto end

)

4.

for /F "skip=1 tokens=1,2 delims= " %%a In (%IPLIST%) Do (

set bladeNUM=%%a

mkdir %1\!bladeNUM!

)

for /f  语句是以行为单位处理文本文件的

切分字符串的利器:delims=

定点提取:tokens=

tokens=  后面一般跟的是数字,如  tokens=2,也可以跟多个,但是每个数字

之间用逗号分隔,如  tokens=3,5,8,它们的含义分别是:提取第2 节字符串、提

取第3、第5 和第8 节字符串。注意,这里所说的“节”,是由  delims=  这一开

关划分的,它的内容并不是一成不变的。 

tokens=1,2,3,4,5  可以简写为  tokens=1-5 

tokens=后面所接的星号具备这样的功能:字符串从左往右被切分成紧跟在*

之前的数值所表示的节数之后,字符串的其余部分保持不变,整体被*所表示的

一个变量接收。

跳过无关内容,直奔主题:skip=n 

直接从第N+1 行开始处理,这个时候,就需要使用参数  skip=n,

其中,n 是一个正整数,表示要跳过的行数

5.

tree %pan%%LOG:~,-1% > %pan%%LOG%StandardLogPath.txt

type %pan%%LOG%StandardLogPath.txt

tree显示所有文件夹,tree /F显示所有文件和文件夹

echo 头5个字符为:%str:~0,5%

echo 去掉最后一个字符后的字符串为:%str:~0,-1%

6.

net use \\%serverip%\ipc$ ljj-1120 /user:administrator

REM PTU Logs

xcopy C:\log\PTU\*.* \\%serverip%\%serverpath_PTU% /d /e /y /h /k

net use \\%serverip%\ipc$ /delete

映射默认共享: 

net use z: \\IP\c$ "密码" /user:"用户名" (即可将对方的c盘映射为自己的z盘,其他盘类推) 

如果已经和目标建立了ipc$,则可以直接用IP+盘符+$访问,具体命令 net use z: \\IP\c$ 

删除一个ipc$连接 

net use \\IP\ipc$ /del 

7.

setlocal Enabledelayedexpansion ##设置变量延迟

dir /o:-d %1 > %2Auto_script\Config\SPECpowerdir.txt

REM ping 127.0.0.1 -n 5

if not exist %2Auto_script\Config\SPECpowerdir.txt echo File "%2Auto_script\Config\SPECpowerdir.txt" not exist! & exit /B 53

call :G_getrowstr 6 %2Auto_script\Config\SPECpowerdir.txt SSJNAME

:G_getrowstr

set %3=

set /A G_skiprows=%1-1

if "%G_skiprows%"=="0" goto :G_getrowstrz

for /f "skip=%G_skiprows% delims=" %%i in ('findstr /n .* %2') do (

for /f "tokens=1,2,3* delims=:" %%a in ("%%i") do set %3=%%b%%c

::if "%%i"=="%1:" set %3=空白行

goto :eof

)

:G_getrowstrz

for /f "delims=" %%i in ('findstr /n .* %2') do (

for /f "tokens=2* delims=:" %%a in ("%%i") do set %3=%%a

goto :eof

)

8.

start /wait %Applaction% -c -log %LogPath%PTU\ -t %TestTime% ##/wait 启动应用程序,并等待其结束

call FPGA.bat

9.

if %errorlevel%==0 (

TEST_RESULT="PASS"

) else (

TEST_RESULT="FAIL"

)

10.

call psexec64.exe \\%ip% /u %user% /p %password% /c %PrePath%

11.

choice /c BH /m "Please choice the type [Balance,HighPerformance]"

echo errorlevel:%errorlevel%

if errorlevel 2 goto HighPerformance

if errorlevel 1 goto Balance

12.

for /F "skip=1 tokens=1,2 delims=:" %%a In (%iplist:~-10,10%) Do (

set ipaddress=%%b

ping !ipaddress! -n 3

if errorlevel 1 echo ping !ipaddress! fail!!! & goto fail

REM pause

call %autoscript% !ipaddress!

)

猜你喜欢

转载自blog.csdn.net/guyan1101/article/details/86507984