菜鸟笔记
提升您的技术认知

bat 将指令执行结果赋给变量

linux shell脚本将指令执行结果赋值给变量很容易,比如:

#!/bin/bash

file_name=`ls  | wc -l`

echo ${file_name}

file_list=`ls -l | awk '{print $1, $NF}'`

echo ${file_list}

很容易将指令执行结果赋值给变量,然后通过变量在进行处理。

但是在批处理中,这种方法就不能使用了。如果需要把一个命令的处理结果赋值给一个变量,可以使用如下方法:

for /f "delims=" %%t in ('命令字符串') do set str=%%t
echo %str%

当命令字符串中含有%时,需要转义。使用imagemagick中的identify命令获取图片的宽和高:

identify -format %wx%h demo.jpg

直接在命令行中使用上述命令可以看到输出了图片的高和宽,但是用它放在批处理脚本中来获取命令的输出结果,则失败,原因是命令字符串中含有%符号,它在批处理有特殊含义,所有需要转义,转义的方法是使用两个%%,正确的做法是:

for /f "delims=" %%t in ('identify -format %%wx%%h demo.jpg') set str=%%t

还有一个需要注意的地方,如果中间有管道,需要使用转义符  ^

例如:判断文件个数,细细体会

这个例子是在Windows环境下,映射了linux的磁盘,从Windows目录向linux指定目录拷贝文件。

::前面的省略

Z:
cd \mnt\external\workspace\%project%_CP_IMG\

for /f "tokens=*" %%i in ('dir /b ^|find /v /c "SC00*" ') do set files_num=%%i

if %files_num%==4 (
@echo ON
echo cpoy_file successed
exit 0
)
else (
@echo ON
echo copy_file failed
exit 1
)

::后面的省略

有读者可能会问,为什么不用%errorlevel%来判断,因为在使用的过程中出现过 %errorlevel% 返回值正确,但是没有拷贝到linux指定目录里面,所以不得已必须使用判断文件个数!