我正在使用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