1

自从我上次使用 Windows 以来已经有很长时间了,所以我需要一些关于我正在尝试创建的简单脚本的帮助。简而言之,我想生成一个脚本,它根据文件列表创建一些文件。令我恼火的是,在 for 循环的执行过程中,在处理完第二个元素之后,我开始在输出中看到代码实际执行之前的 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
4

2 回答 2

2

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

您需要使用call browserify,并且您还需要在标签之前使用exit /bor 。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变量。只需%~1直接在您的 FOR 循环中使用。

:myConverter
for %%F in (%~1) do (
  echo - Bundle for %%F
  call browserify %%F.js -o %%FBundle.js
)
exit /b
于 2014-01-25T14:14:15.993 回答
1

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

exit /b在标签前放一个:myConverter

当您认为,您的脚本以“最后”行结束时cd %myroot%,它实际上与您的“子例程”一起继续,但%~1现在是空的,所以它尝试执行

(for %%f in () do (
于 2014-01-25T13:51:31.907 回答