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

时间:2015-07-23 14:45:40

标签: windows batch-file command-line

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

我一直在搜索这个超过一个小时,但我找不到任何有用的东西

2 个答案:

答案 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