Windows 命令行:如何在循环中附加变量?

Ala*_*lan 9 windows command-line

我试图用空格分隔的文件列表填充变量,但我似乎无法理解它。

这是我到目前为止所拥有的:

set js_files=
for %%f in (js/*.js) do set js_files=%js_files% js/%%f
echo %js_files%
C:\path\to\jsminifier.exe --inputfiles %js_files%
Run Code Online (Sandbox Code Playgroud)

我本来希望这会继续js_files使用下一个文件名附加变量,但它会替换整个变量:

c:\dir>script.cmd
c:\dir>set js_files=
c:\dir>for %f in (js/*.js) do set js_files= js/%f
c:\dir>set js_files= js/one.js
c:\dir>set js_files= js/two.js
c:\dir>set js_files= js/three.js
c:\dir>echo  js/three.js
js/three.js
Run Code Online (Sandbox Code Playgroud)

我在输出的第二行中看到整for行似乎在执行之前被解析,因此(初始)空变量值用于所有迭代。

有谁知道如何正确附加到变量?

谢谢!

Ran*_*son 9

尝试将其更改为:

set js_files=
for %%f in (js/*.js) do set js_files=!js_files! js/%%f
echo %js_files%
C:\path\to\jsminifier.exe --inputfiles %js_files%
Run Code Online (Sandbox Code Playgroud)

请注意set js_files=%js_files% js/%%fto的变化set js_files=!js_files! js/%%f- 通过使用感叹号代替百分号,您指示 shell 在执行期间动态扩展环境变量。

  • @RonK:不要使用 /V:ON 开关,只需在批处理文件的开头插入这一行(两个词)(这样会容易得多):`Setlocal EnableDelayedExpansion` (4认同)
  • 添加“setlocal EnableDelayedExpansion”并更改为感叹号有效。谢谢! (2认同)