2011-12-06 68 views
2

我有循环,我将把所有* .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和\ B \ 001_sth.xml到\ B \ big.xml 等

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

为什么不枚举一个文件,然后在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都有着特殊的意义的方式)

+0

什么是'%% x'?你的意思是'%%我'? –

+0

啊,我现在看到,它在那里,因为你用OP的例子作为出发点。对于问愚蠢的问题感到抱歉。 –

+0

这就是我需要的:〜n。谢谢!还要感谢关于%% x的好建议。 – Borgo

2

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

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

另外,你的问题暗示的源文本文件可以有超过3个字符的名称,即使你的例子恰好有3我假设你想支持超过3

如果我没有理解你正确,我认为这将工作(未经测试)编辑 - 所做的更改响应安德烈·M评论关于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 
) 

内的延迟扩展的触发初始SETLOCAL和避免自我复制循环仅在!出现在任何页面中时才需要ATHS。由于这种情况不太可能发生,因此您可以先启用延迟扩展并放弃切换。

+1

值得注意的是'big.txt'作为'%% F'的值来防止自我复制的尝试。 –

+0

我有一个问题:'setlocal'(没有参数)意味着'setlocal DisableDelayedExpansion'? –

+0

对于大多数环境,没有arg的SETLOCAL将等同于SETLOCAL DisableDelayedExpansion,但最好是明确的。我编辑了答案。该解决方案永远不会尝试自我复制big.txt,因为它在启动循环之前被删除。 IN()子句在执行DO块之前完全评估。 – dbenham

相关问题