在命令提示符下的for循环中查找文件

时间:2018-12-28 18:33:35

标签: batch-file for-loop

我正在尝试在命令提示符(批处理)脚本中查找要针对其运行命令的文件。到目前为止,一切都很好:

@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

所以,我不确定在这里做什么。

3 个答案:

答案 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 /fmarker.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下的树中