避免在Windows批处理文件中的for循环中打印

时间:2014-01-25 12:04:38

标签: windows node.js batch-file browserify

自从我上次使用Windows以来,已经有很多年了,所以我需要一些帮助,我正在尝试创建一个简单的脚本。简而言之,我想生成一个脚本,根据文件列表创建一些文件。令我恼火的是,在执行for循环期间,在处理完第二个元素之后,我开始在代码实际执行之前在输出上看到循环代码。此外,我最后一次更改目录的命令永远不会执行,我认为原因是我拥有的goto:eof语句。有人可以帮我正确编辑脚本吗?

这是脚本:

@echo off
set "myroot=%cd%"
set "scriptsroot=%myroot%\public\javascripts"
set "cdstr=Changing directory"
echo.%cdstr%
cd %scriptsroot%
set "mainmsg=Generating bundles"
echo.%mainmsg%
set "corefiles="definitions resources representation something""
call:myConverter %corefiles%
set "cdstr=Changing directory"
echo.%cdstr%
cd %myroot%

:myConverter
set list=%~1
(for %%f in (%list%) do (
    echo.- Bundle for %%f
    browserify %%f.js -o %%fBundle.js
))
goto:eof

2 个答案:

答案 0 :(得分:2)

问题的最可能来源是browserify是另一个批处理脚本。因为您没有调用脚本,批处理上下文在完成后立即结束,并且ECHO状态将恢复到执行主脚本之前的状态。即使批处理上下文结束,FOR循环仍继续执行完成,ECHO状态现在为ON。由于批处理上下文已结束,因此在FOR循环结束后不会执行其余的脚本。

您需要使用call browserify,并且在exit /b标签之前还需要goto :eof:myConverter

但是你的脚本似乎过于复杂,设置似乎没有任何用途的变量,将当前位置保存在变量中而不是使用PUSHD / POPD,以及不必要的子程序。

我会按如下方式编写脚本代码:

@echo off
echo Changing directory
pushd public\javascripts
echo Generating bundles
for %%F in (definitions resources representation something) do (
  echo - Bundle for %%F
  call browserify %%F.js -o %%FBundle.js
)
echo Returning to original directory
popd

如果要在更大的脚本中在多个位置进行转换,那么请使用子程序。但是没有必要创建list变量。只需在FOR循环中直接使用%~1

:myConverter
for %%F in (%~1) do (
  echo - Bundle for %%F
  call browserify %%F.js -o %%FBundle.js
)
exit /b

答案 1 :(得分:1)

这不会解决您的问题,但我在您的脚本中发现了一个逻辑错误:

在标签exit /b

之前添加:myConverter

当你想到,你的脚本已经完成了“最后一行”cd %myroot%,它实际上继续你的“子程序”,但%~1现在是空的,所以它试图执行

(for %%f in () do (