无法使用循环输出来批量设置variables

我正在使用for循环来访问一个文件文件+一堆文件,他们的目录格式如下:

//srv/something/somethingelse/movie.mpg //srv/something/somethingelse/movie2.mkv //srv/something/somethingelse/movie3.mpg //srv/something/somethingelse/movie4.mkv 

我必须使用.xmlreplace.mpg和.mkv,然后将输出写入另一个文本文件,我试图这样做:

 for /F "tokens=*" %%A in (%~dp0temporary\movies.txt) do ( set string=%%A set find=.mkv set replace=.xml set string=%%string:!find!=!replace!%% set find=.mpg set string=%%string:!find!=!replace!%% echo %string%>>%~dp0temporary\xml.txt ) 

我想要的输出是这样的:

 //srv/something/somethingelse/movie.xml //srv/something/somethingelse/movie2.xml //srv/something/somethingelse/movie3.xml //srv/something/somethingelse/movie4.xml 

但是我得到的是这样的:

 Echo is off. Echo is off. Echo is off. Echo is off. 

我一直在寻找这一个多小时,但我找不到任何工作

这里是重写的批处理代码,它从输入文件产生预期的输出。

 @echo off setlocal EnableDelayedExpansion set "vidLoc=//srv" set "resultLoc=c:" del "%~dp0temporary\xml.txt" 2>nul for /F "usebackq delims=" %%A in ("%~dp0temporary\movies.txt") do ( set "FileNameWithPath=%%A" set "FileNameWithPath=!FileNameWithPath:.mkv=.xml!" set "FileNameWithPath=!FileNameWithPath:.mpg=.xml!" set "FileNameWithPath=!FileNameWithPath:%vidLoc%=%resultLoc%!" echo !FileNameWithPath!>>"%~dp0temporary\xml.txt" ) endlocal 

用百分号括起来的所有环境变量引用在解析整个块时已经扩展了。 只是在感叹号中包含的环境变量引用在执行命令时被延迟了。 这可以在打开命令提示符窗口并从那里运行没有@echo off的批处理文件在顶部或在此行被更改为@echo on看到。

在命令提示符窗口中执行set /? 导致得到这个命令输出的帮助,在几个窗口页面的使用延迟扩展for和块如果解释一个简单的例子。

并在命令提示符窗口中运行for /? 将命令的帮助打印到输出窗口中。

只需要替换文件扩展名,你也可以使用:

 @echo off del "%~dp0temporary\xml.txt" 2>nul for /F "usebackq delims=*" %%A in ("%~dp0temporary\movies.txt") do ( echo %%~dpnA.xml>>"%~dp0temporary\xml.txt" ) 

但是这个更快的代码也会改变所有正斜杠/反斜杠\因为反斜杠字符是Windows上的目录分隔符。

Mofi是正确的:将setlocal enabledelayedexpansion移出括号中的任何代码块。
但是,使用命令行参数(参数)修改器~尝试下一个方法:

 @ECHO OFF >NUL @SETLOCAL enableextensions for /F "tokens=*" %%A in (%~dp0temporary\movies.txt) do ( rem full_path=%%~dpnA rem extension=%%~xA echo %%~dpnA.xml )>%~dp0temporary\xml.txt