高级批处理文件:使用set / p和重定向动态设置变量

时间:2010-12-15 06:24:02

标签: batch-file redirect

嘿那里。
基本上,我有一个批处理文件,遍历所有模型和纹理文件,保存他们的绝对路径,然后将收集的pathes传递给我的converter.exe。 目前我这样做是通过将每个输入文件的路径附加到set /p变量,并将该变量的输出重定向到params.txt。

for /f "tokens=*" %%a in ('dir "%MODEL_SRC%" /a:d-h /b') do (
 set /p=-o="%MODEL_DST%\%%a.res" >cvtr_params.txt<nul
 for /f %%b in ('dir "%MODEL_SRC%\%%a\*.obj" /a:-d-h /b') do (
  <nul (set/p=""%MODEL_SRC%\%%a\%%b" ") >>cvtr_params.txt
 )
 for /f "tokens=*" %%c in ('dir "%TEX_SRC%\%%a\*.png" /a:-d-h /b') do (
  <nul (set/p=""%TEX_SRC%\%%a\%%c" ") >>cvtr_params.txt
 )
 start /b /wait "" bin\converter.exe @cvtr_params.txt >nul
)
del cvtr_params.txt

params.txt看起来像这样:
-o="ConvertedPath\Ingame.res" "ModelPath\Model1.obj" "ModelPath\Model2.obj" "TexPath\Tex1.png" "TexPath\Tex2.png"
等等等等。 是的,代码对于实际附加到行的末尾而不是新行很复杂。

现在我想,cvtr_params.txt是不必要的,并采用这种方法,几乎​​相同,只是不将set /p变量的“问题”重定向到params.txt但实际上只是分配set /p params set /p z的“问题”setlocal EnableDelayedExpansion for /f "tokens=*" %%a in ('dir "%MODEL_SRC%" /a:d-h /b') do ( set /p params=<nul set /p z=-o="%MODEL_DST%\%%a.res" <nul for /f %%b in ('dir "%MODEL_SRC%\%%a\*.obj" /a:-d-h /b') do ( <nul (set/p=""%MODEL_SRC%\%%a\%%b" ") ) for /f "tokens=*" %%c in ('dir "%TEX_SRC%\%%a\*.png" /a:-d-h /b') do ( <nul (set/p=""%TEX_SRC%\%%a\%%c" ") ) start /b /wait "" bin\converter.exe !params! ) endlocal

!params!

但不知何故,"ECHO is set to <OFF>变量显示为空。 (回声传递{{1}}“) 现在我已经结束了我的智慧,我刚开始认真使用3天前的批处理文件,所以如果有人有个好主意,让我听听吧! :)

格尔茨

1 个答案:

答案 0 :(得分:2)

在您的代码中,params在开头设置为空,之后从未更改,所以您期望什么?

如果你想在params中连接元素,你应该尝试一下

set params=!params! ""%TEX_SRC%\%%a\%%c" "

但要注意,自WinXP或更高版本以来,环境变量都有maximum length of 8191 characters(较早的系统较少)。