使用批处理文件提取文件名的一部分

时间:2011-12-06 13:33:45

标签: windows command-line 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 等

我写批处理文件只复制目录A中的文件,但我不知道如何查找文件目录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

3 个答案:

答案 0 :(得分:3)

为什么不在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都有特殊意义)

答案 1 :(得分:2)

我不明白你的代码的目的。每次复制到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
)

只有在!出现在任何路径中时,才需要在循环内切换延迟扩展。由于这不太可能,您可以从启用延迟扩展开始,然后放弃切换。

答案 2 :(得分:1)