如何将n个文件一起复制到一个新文件,并将其名称作为参数传递给批处理文件?

问题描述 投票:0回答:2

我尝试将 n 文件一起复制到一个新文件,其中文件名作为参数传递给

.bat
文件。但批处理文件会覆盖结果文件,而不是在 GOTO 循环的每次迭代中连接文件内容。

批处理文件是:

:repeat
shift
If "%1" =="" goto :end
copy /y %0+%1 fisx.txt
goto :repeat
:end

例如:
如果

file1.txt
具有内容
abc
file2.txt
具有内容
def
并且
file3.txt
具有内容
ijl
,则在使用
 调用批处理文件时,输出为 
defijl
 而不是想要的 
adcdefijl
 file1.txt file2.txt file3.txt

是否需要添加任何参数才能不覆盖或者我应该如何解决这个问题?

batch-file cmd
2个回答
2
投票

复制循环无法按您的预期设计工作。假设使用参数

file1.txt file2.txt file3.txt
调用批处理文件。现在发生了什么?

用于调用批处理文件的字符串(参数 0)被替换为

file1.txt
(参数 1),另外两个参数也在参数列表中向左移动。因此
file1.txt
file2.txt
一起复制到文件
fisx.txt

在下一次循环迭代中,

file1.txt
(参数 0)被
file2.txt
替换,并且
file3.txt
成为参数 1。然后将
file2.txt
file3.txt
一起复制到文件
fisx.txt
。因此,在第二次复制操作中完全忽略
file1.txt
的内容,因为第二次复制操作中既不使用现有的
fisx.txt
也不使用
file1.txt
替换第一次复制操作中的现有文件
fisx.txt

工作代码是:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
if "%~1" == "" exit /B
copy /B /Y %1 "fisx.txt" >nul
:Repeat
shift
if "%~1" == "" exit /B
copy /B /Y "fisx.txt"+%1 "fisx.txt" >nul
goto Repeat

下面更增强的版本还支持空参数字符串和不正确引用的最后一个参数字符串。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
:FindFirst
set "NextFile=%~1"
if defined NextFile goto CopyFirst
set "NextFile=%1"
if not defined NextFile exit /B
shift
goto FindFirst
:CopyFirst
copy /B /Y "%NextFile:"=%" "fisx.txt" >nul
:Repeat
shift
set "NextFile=%~1"
if defined NextFile copy /B /Y "fisx.txt"+"%NextFile:"=%" "fisx.txt" >nul & goto Repeat
set "NextFile=%1"
if defined NextFile goto Repeat

此版本的代码还支持参数列表,例如:

"" "" file1.txt "" "file2.txt" file3.txt"

要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。

  • call /?
    ...解释引用批处理文件参数。
  • copy /?
  • echo /?
  • endlocal /?
    ...在退出批处理文件处理之前由
    cmd.exe
    隐式调用。
  • exit /?
  • goto /?
  • if /?
  • set /?
  • setlocal /?
  • shift /?

另请参阅:


1
投票

您的代码只是用参数列表中最后两个文件的串联来覆盖文件

fisx.txt
的内容。

不要复制,只需追加。

用参数列表中的第一个文件覆盖

fisx.txt
,并将每个后续文件(在参数列表中)附加到文件
fisx.txt

type %1 >fisx.txt
:repeat
shift
If "%1" == "" goto :end
type %1 >>fisx.txt
goto :repeat
:end
© www.soinside.com 2019 - 2024. All rights reserved.