作者x2006 (小帅 ^^)
看板Programming
标题Re: [问题] Dos AutoBatch
时间Sat Feb 2 02:25:48 2008
rem 下面这程式要四个参数:来源目录,档案筛选文字,目的目录,移档一批数量.
rem %4
set max=10
rem %1
set source=D:\test1
rem %3
set destin=C:\test2
rem %2
set filetype=*.txt
setlocal enabledelayedexpansion
set sum=0
for /f %%i in ('dir %source%\%filetype% /od /b') do (
move %source%\%%i %destin%
set /a sum = !sum! + 1
if !sum! equ %max% exit
)
endlocal
LPH66的意思是这样, 对吗?
真奇怪for里面使用pause, 然後echo !sum!或%!sum!%, 竟然当成字串, 不是变数.
怎麽看出 !sum! 的变化呢?
: MOONRAKER:累死了,我宁愿装个bash来用
还好吧!
第一个版本用call,花不到几分钟就写好了!
第二个版本用!sum!,看过LPH66的说明後,也花不到几分钟就写好了!
换你来表演Bash好了!
※ 引述《LPH66 (IWH68S0XZ8M89)》之铭言:
: 直接贴上set /?里面的范例好了:
: ---
: 延迟环境变数展开功能可用来避开展开功能限制。这项限制是发生在命令列
: 读取过程,不是发生在执行过程。下面的范例说明了立即展开变数时会发生
: 的问题:
: set VAR=before
: if "%VAR%" == "before" (
: set VAR=after;
: if "%VAR%" == "after" @echo If you see this, it worked
: )
: 这个例子永远无法显示 echo 讯息,因为在两个 IF 叙述中的 %VAR% 会
: 在第一个 IF 叙述被读入时便被展开。这是因为它是逻辑上包含了 IF 的内
: 部,而内部又是一个复合叙述。 所以在复合叙述内的 IF 实际上是用
: "before" 和 "after" 来比较,而这永远不会为真。同样的,下面的例子也
: 不会作用:
: set LIST=
: for %i in (*) do set LIST=%LIST% %i
: echo %LIST%
: 这个例子中并不会建立目前目录中所有档案的清单,相反的只会将 LIST 变
: 数设为最後一个找到的档案。同样地,这是因为 %LIST% 只有在 FOR 叙述
: 第一次被读入时才展开,此时 LIST 变数是空的。所以我们实际执行的 FO
: 回圈是:
: for %i in (*) do set LIST= %i
: 这只是重复的将 LIST 设为最後找到的档案。
: 延迟环境变数展开让您可以用一个不同的字元 (惊叹号) 在执行时展开
: 环境变数。如果启用了延迟环境变数展开,上面的例子可以被改写如下
: 而正常作用:
: set VAR=before
: if "%VAR%" == "before" (
: set VAR=after
: if "!VAR!" == "after" @echo If you see this, it worked
: )
: set LIST=
: for %i in (*) do set LIST=!LIST! %i
: echo %LIST%
: ---
: 简单说 你在一个指令里用这种变数时
: 所有该展开的%...%是会一次展开的
: 那如果要让它能够在用到时才展开
: 那就用!...!来取用
: 你的for是一整条指令 所以在其中就需要用!...!来展开
: 就变成 set /a sum = !sum! + 1
: 不过这得要有启用"延迟环境变数展开"功能才行
: 这可以用setlocal enabledelayedexpansion来设定
: (详见setlocal /?)
: 记得最後要endlocal还原
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.224.64.210
※ 编辑: x2006 来自: 61.224.64.210 (02/02 02:26)