使用batch file提取文件名的一部分

我有循环,在那里我将所有* .txt文件复制到同一目录中的big.txt。 在每个循环步骤中,我希望从第一个目录中的文件获得不同文件夹中不同文件的副本,其中文件名中的前三个字符是相同的。

例:

\A\001.txt \A\003.txt \A\005.txt \A\big.txt \B\001_sth.xml \B\002_sth.xml - don't copy! no 002 in folder A \B\003_sth.xml \B\004_sth.xml - don't copy! no 004 in folder A \B\005_sth.xml \B\big.xml 

在第1步:将\ A \ 001.txt复制到\ A \ big.txt AND \ B \ 001_sth.xml到\ B \ big.xml等

我写的batch file只复制目录A中的文件,但我不知道如何find文件目录B.

 @echo off if "%1"=="" goto error for %%x in (%1\A\*.txt) do ( copy %%x %1\A\big.txt echo %%x echo --- ) goto end :error echo give me a directory :end 

为什么不只是枚举A中的文件,然后在B中引用文件?

 for %%I in (%1\A\*.txt) do ( copy %1\B\%%~nI_sth.xml %1\B\big.xml echo %%I echo --- ) goto :EOF 

(顺便说一句,用循环变量使用小写字母x并不明智,因为%%〜sdfnx都有特殊的含义)

我不明白你的代码的目的。 每次复制到big.txt时,都会覆盖前一个副本。 我想你想要追加。

我不确定你是否想从一个空的big.txt和big.xml开始。 我假设你这样做。

此外,您的问题意味着源文本文件可能有超过3个字符的名称,即使您的示例正好3.我假设您要支持超过3。

如果我理解正确,我认为这将工作(未经测试) 编辑作出的变化,以响应Andriy M有关初始setlocal和避免big.txt的自我复制的意见

 @echo off setlocal disableDelayedExpansion if "%~1"=="" echo Give me a directory&exit /b set "root=%~1" if exist "%root%\A\big.txt" del "%root%\A\big.txt" if exist "%root%\B\big.xml" del "%root%\B\big.xml" for /f "delims=" %%F in ('dir /b "%root%\A\*.txt"') do ( type "%root%\A\%%~F" >>"%root%\A\big.txt" set "prefix=%%~nF" setlocal enableDelayedExpansion type "!root!\B\!prefix:~0,3!*.xml" >>"!root!\B\big.xml" endlocal ) 

循环内延迟扩展的切换仅在以下情况下才需要! 出现在任何路径中。 由于这不太可能,所以您可以从启用延迟扩展开始并放弃切换。