我正在尝试在命令提示符(批处理)脚本中查找要针对其运行命令的文件。到目前为止,一切都很好:
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /R %%I IN ("*.Marker.txt") DO (
SET MARKER=%%I
SET LOG= ???
ECHO MARKER IS !MARKER! AND LOG IS !LOG!
)
基本上,我想遍历一对文件并在它们上执行命令(目前仅echo
)。我的问题是日志文件可以位于*.Marker.txt
文件所在的任何目录中。我不能只是说100.Marker.log
,因为那只是文件名,而不是完整路径。一些例子:
C:\ Temp \ Samples \ 3A5 \ 100.Marker.txt C:\ Temp \ Samples \ 3A5 \ 9 \ 1 \ 100.Marker.log C:\ Temp \ Samples \ 39B \ 122.Marker.txt C:\ Temp \ Samples \ 39B \ 2 \ 5 \ 122.Marker.log
所以,我不确定在这里做什么。
答案 0 :(得分:0)
您可以在脚本和内部循环过程中使用PUSHD
/ POPD
来推送/弹出工作目录。
FOR /R %%I IN ("*.Marker.txt") DO (
SET DIRECTORY=%%~DPI
SET FILENAME=%%~NI
SET MARKER=%%I
PUSHD !DIRECTORY!
FOR /R %%J IN ("!FILENAME!.log") DO (
SET LOGFILE=%%J
ECHO !MARKER!
ECHO !LOGFILE!
)
POPD
)
不确定如何找到单个值,FOR
从技术上讲将在所有匹配项上运行,但是如果您说只应有一个值,则内部循环将在每个标记文件中仅运行一次。也许有一种更有效的方法可以在不使用FOR
的情况下搜索单个文件?
答案 1 :(得分:0)
如果所有文件都具有相同的格式(text.Marker.ext
),则可以使用:
@echo off
setlocal EnableDelayedExpansion
for /R %%A IN ("*.Marker.*") DO (
set MARKER=%%A
for /F "tokens=1 delims=." %%B IN ("%%A") do (
set LOG=%%B
)
echo MARKER IS !MARKER! AND LOG IS !LOG!
)
请注意,我通常不建议在批处理文件中使用大写字母。
for /R
),试图查找包含.Marker.
(IN ("*.Marker.*")
)的文件。MARKER
)。delims
到.
。这意味着:token1.token2.token3
。 .
不会被解析为令牌。答案 2 :(得分:0)
@echo off
setlocal enabledelayedexpansion
REM following lines to create test environment
md C:\Temp\Samples\3A5\9\1 2>nul
md C:\Temp\Samples\39B\2\5 2>nul
break>C:\Temp\Samples\3A5\100.Marker.txt
break>C:\Temp\Samples\3A5\9\1\100.Marker.log
break>C:\Temp\Samples\39B\122.Marker.txt
break>C:\Temp\Samples\39B\2\5\122.Marker.log
REM end creating test environment
for /R "C:\Temp\Samples\" %%a in ("*.marker.txt") do (
for /f %%b in ('dir /s/b "%%~dpa\%%~na.log"') do (
ECHO Textfile: %%a Logfile: %%b
)
)
for /R
递归查找所有匹配文件(*.marker.txt
和子文件夹中的C:\Temp\Samples\
。
for /f
在marker.txt
所在的文件夹下寻找匹配的日志文件。
输出:
Textfile: C:\Temp\Samples\39B\122.Marker.txt Logfile: C:\temp\Samples\39B\2\5\122.Marker.log
Textfile: C:\Temp\Samples\3A5\100.Marker.txt Logfile: C:\temp\Samples\3A5\9\1\100.Marker.log
注意:这假设每个.log
仅存在一个匹配的.txt
,并且位于.txt
下的树中