嵌套在Windows批处理(* .bat)文件中

我需要实现脚本,在循环执行命令和内联迭代varible那里在2位数字格式。 我无法理解如何正确使用batch file中的variables。 我做错了什么?

for /l %%h in (0,1,23) do ( SET padded_h1=0%%h SET padded_h=%padded_h1:~-2% for /l %%m in (0,1,59) do ( SET padded_min1=0%m% SET padded_min=%padded_min1:~-2% C:\android-sdk-windows\platform-tools\adb -e shell date -s 20131202.%padded_h%%padded_min%00 ping 127.0.0.1 -n 2 > nul ) 

Solutions Collecting From Web of "嵌套在Windows批处理(* .bat)文件中"

在批处理文件中包含变量的基本规则是:除非明确要求延迟替换,否则每个行或每个块(如果有的话)都被解析并且变量被替换为值。

这意味着,一个内部具有变量的块(命令的%%变量除外)在到达时将所有变量替换为值,并且在每个循环中都没有变量,只是它的值。

除非启用延迟扩展,并且变量被引用为!var! 而不是%var%

所以,当块被读取时,用变量替换它的值,你的代码就会被cmd执行,因为它已被写入

 for /l %%h in (0,1,23) do ( SET padded_h1=0%%h SET padded_h= for /l %%m in (0,1,59) do ( SET padded_min1=0%m% SET padded_min= C:\android-sdk-windows\platform-tools\adb -e shell date -s 20131202.00 ping 127.0.0.1 -n 2 > nul ) ) 

由于变量没有初始值,因此当读取块(从开始到结束括号)时,读取变量并用它们的值替换变量时,就会得到这个结果。

所以,你的代码应该看起来像

 rem Enable delayed expansion setlocal enableextensions enabledelayedexpansion for /l %%h in (0,1,23) do ( rem %%h is a for variable, no problems with it SET padded_h1=0%%h rem padded_h1 has changed its value inside de for, so rem we need to get the changed value not the initial value rem the variable had when the block was readed SET padded_h=!padded_h1:~-2! rem and the same with the inner loop for /l %%m in (0,1,59) do ( SET padded_min1=0%%m SET padded_min=!padded_min1:~-2! C:\android-sdk-windows\platform-tools\adb -e shell date -s 20131202.!padded_h!!padded_min!00 ping 127.0.0.1 -n 2 > nul ) ) 

不能使用DelayedExpansion循环内的for循环中设置的变量。

将其更改为:

 setlocal enabledelayedexpansion for /l %%h in (0,1,23) do ( SET padded_h1=0%%h SET padded_h=!padded_h1:~-2! for /l %%m in (0,1,59) do ( SET padded_min1=0%m% SET padded_min=!padded_min1:~-2! C:\android-sdk-windows\platform-tools\adb -e shell date -s 20131202.!padded_h!!padded_min!00 ping 127.0.0.1 -n 2 > nul ) )