我有循环,我将所有* .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
答案 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)