我正在使用for循环来访问带有一堆文件的文本文件+他们的目录格式如下:
//srv/something/somethingelse/movie.mpg
//srv/something/somethingelse/movie2.mkv
//srv/something/somethingelse/movie3.mpg
//srv/something/somethingelse/movie4.mkv
我必须用.xml替换.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.
我一直在搜索这个超过一个小时,但我找不到任何有用的东西
答案 0 :(得分:1)
这是重写的批处理代码,它从输入文件中产生预期的输出。
@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
在解析整个 for 块时,已经扩展了以百分号括起来的所有环境变量引用。只有感叹号中包含的环境变量引用在执行命令时会延迟扩展。这可以在打开命令提示符窗口并从那里运行没有@echo off
的批处理文件或将此行更改为@echo on
时看到。
在命令提示符窗口set /?
中执行会导致在几个窗口页面上获取此命令输出的帮助,其中使用延迟扩展用于和用于块在一个简单的例子中解释。
在命令提示符窗口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上的目录分隔符。
答案 1 :(得分:0)
Mofi 是对的:将setlocal enabledelayedexpansion
的行移出(
括号)
中的任何代码块。
但是,请尝试使用Command Line arguments (Parameters)修饰符~
:
@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