Batch file 批量复制

Batch file 批量复制,batch-file,Batch File,大家好,我正在尝试合并一些文件,如果可能的话,保留文件夹和子文件夹 我用于测试的文件名为(1)Austin.txt @ECHO OFF SETLOCAL For %%G In ("%~dp0..\New Folder 1") Do Set "source=%%~fG" For %%G In ("%~dp0..\New Folder 2") Do Set "target=%%~fG" For %%G In (&qu

大家好,我正在尝试合并一些文件,如果可能的话,保留文件夹和子文件夹

我用于测试的文件名为(1)Austin.txt

@ECHO OFF
SETLOCAL 

For %%G In ("%~dp0..\New Folder 1") Do Set "source=%%~fG"
For %%G In ("%~dp0..\New Folder 2") Do Set "target=%%~fG"
For %%G In ("%~dp0..\New Folder 3") Do Set "destdir=%%~fG"

FOR /f "delims=" %%q IN ('dir /b /s /a-d "%source%\*.txt"') DO call :label "%%q"
goto :eof

:Label
set "FILE=%~1"
for /f "tokens=1 delims=[]" %%a in ('find /n "appi"^<"%~1"') do set /a start=%%a
for /f "tokens=1 delims=[]" %%a in ('find /n "opcn"^<"%~1"') do set /a end=%%a
(
for /f "tokens=1* delims=[]" %%a in ('find /n /v ""^<"%~1"') do (
 IF %%a geq %start% IF %%a leq %end% ECHO(%%b
 )
)>"%target%\%~n1A.txt"

for /f "tokens=1 delims=[]" %%a in ('find /n "paid"^<"%~1" ') do set /a start=%%a
for /f "tokens=1 delims=[]" %%a in ('find /n "whbn"^<"%~1" ') do set /a end=%%a
(
for /f "tokens=1* delims=[]" %%a in ('find /n /v ""^<"%~1" ') do (
 IF %%a geq %start% IF %%a leq %end% ECHO(%%b
 )
)>"%target%\%~n1B.txt"

If Exist "%target%\*.txt" If Exist "%destdir%\" (
        Copy /Y /B "%target%\(1) AustinA.txt" + "%target%\(1) AustinB.txt" "%destdir%\(1).txt"
    )
现在,在我的原始脚本的这一部分中,它将A.txt和B.txt合并到(1.txt)
现在我有了原始文件名,我不知道如何将目标合并到(1)Austin.txt

@ECHO OFF
SETLOCAL 

For %%G In ("%~dp0..\New Folder 1") Do Set "source=%%~fG"
For %%G In ("%~dp0..\New Folder 2") Do Set "target=%%~fG"
For %%G In ("%~dp0..\New Folder 3") Do Set "destdir=%%~fG"

FOR /f "delims=" %%q IN ('dir /b /s /a-d "%source%\*.txt"') DO call :label "%%q"
goto :eof

:Label
set "FILE=%~1"
for /f "tokens=1 delims=[]" %%a in ('find /n "appi"^<"%~1"') do set /a start=%%a
for /f "tokens=1 delims=[]" %%a in ('find /n "opcn"^<"%~1"') do set /a end=%%a
(
for /f "tokens=1* delims=[]" %%a in ('find /n /v ""^<"%~1"') do (
 IF %%a geq %start% IF %%a leq %end% ECHO(%%b
 )
)>"%target%\%~n1A.txt"

for /f "tokens=1 delims=[]" %%a in ('find /n "paid"^<"%~1" ') do set /a start=%%a
for /f "tokens=1 delims=[]" %%a in ('find /n "whbn"^<"%~1" ') do set /a end=%%a
(
for /f "tokens=1* delims=[]" %%a in ('find /n /v ""^<"%~1" ') do (
 IF %%a geq %start% IF %%a leq %end% ECHO(%%b
 )
)>"%target%\%~n1B.txt"

If Exist "%target%\*.txt" If Exist "%destdir%\" (
        Copy /Y /B "%target%\(1) AustinA.txt" + "%target%\(1) AustinB.txt" "%destdir%\(1).txt"
    )
这不再需要

If Exist "%target%\*.txt" If Exist "%destdir%\" (
    Copy /Y /B "%target%\(1) AustinA.txt" + "%target%\(1) AustinB.txt" "%destdir%\?????????"
)
我需要将A和B与文件的原始名称合并

    Source New Folder 1
        | City
            | (1) Austin.txt
    Target New Folder 2
        | City
            | (1) AustinA.txt
            | (1) AustinB.txt
    Destdir New Folder 3
       | City
           | (1) Austin.txt
@ECHO OFF
SETLOCAL 

For %%G In ("%~dp0..\New Folder 1") Do Set "source=%%~fG"
For %%G In ("%~dp0..\New Folder 2") Do Set "target=%%~fG"

FOR /f "delims=" %%q IN ('dir /b /s /a-d "%source%\*.txt"') DO call :label "%%q"
goto :eof

:Label
set "FILE=%~1"
for /f "tokens=1 delims=[]" %%a in ('find /n "CODE1"^<"%~1"') do set /a start=%%a
for /f "tokens=1 delims=[]" %%a in ('find /n "CODE2"^<"%~1"') do set /a end=%%a
(
for /f "tokens=1* delims=[]" %%a in ('find /n /v ""^<"%~1"') do (
 IF %%a geq %start% IF %%a leq %end% ECHO(%%b
 )
)>"%target%\%~n1.txt"

for /f "tokens=1 delims=[]" %%a in ('find /n "CODE3"^<"%~1" ') do set /a start=%%a
for /f "tokens=1 delims=[]" %%a in ('find /n "CODE4"^<"%~1" ') do set /a end=%%a
(
for /f "tokens=1* delims=[]" %%a in ('find /n /v ""^<"%~1" ') do (
 IF %%a geq %start% IF %%a leq %end% ECHO(%%b
 )
)>>"%target%\%~n1.txt"
下面是我现在改变的内容,我的脚本99%完美添加第二个
是我所需要做的全部,数周来我一直在寻找合并文件的方法

由此

Source New Folder 1
    | City
        | (1) Austin.txt
Target New Folder 2
    | (1) AustinA.txt
    | (1) AustinB.txt
)>"%target%\%~n1A.txt"
)>"%target%\%~n1B.txt"
)>"%target%\%~n1.txt"
)>>"%target%\%~n1.txt"
For %%G In ("%~dp0..\New Folder 3") Do Set "destdir=%%~fG"
对此

Source New Folder 1
    | City
        | (1) Austin.txt
Target New Folder 2
    | (1) AustinA.txt
    | (1) AustinB.txt
)>"%target%\%~n1A.txt"
)>"%target%\%~n1B.txt"
)>"%target%\%~n1.txt"
)>>"%target%\%~n1.txt"
For %%G In ("%~dp0..\New Folder 3") Do Set "destdir=%%~fG"
我删除了这个

Source New Folder 1
    | City
        | (1) Austin.txt
Target New Folder 2
    | (1) AustinA.txt
    | (1) AustinB.txt
)>"%target%\%~n1A.txt"
)>"%target%\%~n1B.txt"
)>"%target%\%~n1.txt"
)>>"%target%\%~n1.txt"
For %%G In ("%~dp0..\New Folder 3") Do Set "destdir=%%~fG"
此提取可以在任何可读文件的代码之间读取
如果您只需要提取两个代码之间的代码,则此提取可以减半

我的安装程序读取代码并将它们放在一个.txt文件中

    Source New Folder 1
        | City
            | (1) Austin.txt
    Target New Folder 2
        | City
            | (1) AustinA.txt
            | (1) AustinB.txt
    Destdir New Folder 3
       | City
           | (1) Austin.txt
@ECHO OFF
SETLOCAL 

For %%G In ("%~dp0..\New Folder 1") Do Set "source=%%~fG"
For %%G In ("%~dp0..\New Folder 2") Do Set "target=%%~fG"

FOR /f "delims=" %%q IN ('dir /b /s /a-d "%source%\*.txt"') DO call :label "%%q"
goto :eof

:Label
set "FILE=%~1"
for /f "tokens=1 delims=[]" %%a in ('find /n "CODE1"^<"%~1"') do set /a start=%%a
for /f "tokens=1 delims=[]" %%a in ('find /n "CODE2"^<"%~1"') do set /a end=%%a
(
for /f "tokens=1* delims=[]" %%a in ('find /n /v ""^<"%~1"') do (
 IF %%a geq %start% IF %%a leq %end% ECHO(%%b
 )
)>"%target%\%~n1.txt"

for /f "tokens=1 delims=[]" %%a in ('find /n "CODE3"^<"%~1" ') do set /a start=%%a
for /f "tokens=1 delims=[]" %%a in ('find /n "CODE4"^<"%~1" ') do set /a end=%%a
(
for /f "tokens=1* delims=[]" %%a in ('find /n /v ""^<"%~1" ') do (
 IF %%a geq %start% IF %%a leq %end% ECHO(%%b
 )
)>>"%target%\%~n1.txt"
@ECHO关闭
SETLOCAL
对于“%$dp0..\New Folder 1”中的%%G,请设置“source=%%~fG”
对于“%$dp0..\New Folder 2”中的%%G,请设置“target=%%~fG”
对于/f“delims=“%%q IN('dir/b/s/a-d”%source%\*.txt“'),请调用:label“%%q”
后藤:eof
:标签
设置“文件=%~1”
对于/f“tokens=1 delims=[]”中的%%a('find/n“CODE1”^
其中,
%~1
是完全限定的文件名(
X:\Some Folder\Folder 1\file.ext
)。输出:
“Folder 1\file.ext”
(最后一个文件夹加上文件名加上扩展名)

但是为什么要生成两个文件,只是为了连接它们?只需将两个输出放在同一个文件中:

(
for /f "tokens=1* delims=[]" %%a in ('find /n /v ""^<"%~1"') do (
 IF %%a geq %start% IF %%a leq %end% ECHO(%%b
 )
)>"%destdir%\%~nx1"
...
(
for /f "tokens=1* delims=[]" %%a in ('find /n /v ""^<"%~1" ') do (
 IF %%a geq %start% IF %%a leq %end% ECHO(%%b
 )
)>>"%destdir%\%~nx1"
(

对于/f“tokens=1*delims=[]”中的%%a('find/n/v“”^老实说,我建议您在powershell中执行此操作。@Nick.McDermaid在我的原始脚本中,在批处理中它工作得很好,但为了使其工作,我必须在批处理中输入文件名,我得到结果,它可以在10秒内编辑30个文件,我有5000多个文件,因此您可以了解我为什么要在最后几个步骤中寻求帮助,您知道如何操作吗保留文件夹,我知道
%~nx1
保留文件名和扩展名,如何保存文件夹和子文件夹Severyone有自己的首选语言。我很久以前就停止使用batch,因为Powershell从维护和调试的角度来看要优越得多。与batch一样,它是windows本机的,可以在记事本中编辑。一个d如果你愿意,你可以简单地在你的powershell中编写批处理……如果你愿意,你可以轻松地使用windows UI。也许你可以给出一个更清晰的例子,说明你在追求什么,喜欢批处理的人会帮你。@Stephen嗯,我不认为这是可能的,因为当我第一次开始时,第二部分覆盖了第一部分,这就是我喜欢批处理的原因将它分成两个文件,因为它有相同的名称,我确实知道了如何使用“%~nx1”,我用谷歌搜索了如何复制文件夹和子文件夹,但没有运气,因为
要覆盖,
>
要附加(请参见)。要复制文件夹,请使用
xcopy
robocopy
(您尝试在哪里复制文件夹?)在我的脚本中,你会看到我有一个副本“/y/B”,从未尝试过>>我也尝试过xcopy,使用不同的设置,但每个文件需要2分钟,处理5000多个文件,x2分钟后我将观看我的女婴高中毕业,@Stephan谢谢你一旦我下班回家,我将测试我正在尝试将文件夹和子文件夹发送到tran还有文件,我不确定我的脚本是否能做到这一点,因为新文件夹1城市文件夹也在新文件夹2中