2

我有一个批处理脚本,可以将 50 个文件从不同的来源复制到不同的目的地。现在,我有 50 行:

xcopy "source" "dest" /y /v

现在,如果一个副本失败,我希望脚本结束。问题是我不想要 100 行,例如:

xcopy "source" "dest" /y /v
if not errorlevel 0 goto ERR

批处理脚本中是否有类似“函数”的东西?

谢谢。

4

3 回答 3

2

这应该适用于文件格式

d:\source\path1\*.*|n:\target\path\
d:\source\path2\*.*|n:\target\path3\
etc

更改 xcopy 开关以适合您的应用程序。代码主要取自 npomaka。

未经测试。

@echo off
for /f "tokens=1,2 delims=|" %%D in (file.txt) do (
   xcopy "%%~D" "%%~E" s/h/e/k/f/c || goto :end_for
)
:end_for
于 2013-05-25T13:55:10.130 回答
1
for %%S in ("destination1|source1" 
           "destination2|source2"
            "and|so on") do (
  for /f "tokens=1,2 delims=|" %%D in ("%%~S") do (
       xcopy "%%~D" "%%~E" /y /v || goto :end_for
  )
)
:end_for

但是您需要首先设置FOR一个带有源目标的映射,例如“destination1|source1”

是否会寻求更好的解决方案(您已经拥有了所有的蝙蝠xopy operations?)

如果您已经.BAT拥有所有来源->目的地,您也可以尝试:

for /f usebackq^ tokens^=1^,3^ delims^=^" %%S in ("your.bat") do (

    xcopy "%%~S" "%%~T" /y /v || goto :end_for

)
:end_for

.您也可以检查robocopy/R:0我认为 robocopy 在你的情况下会更有用。

为什么你有 50 行?文件中有什么共同点可以用作掩码吗?

于 2013-05-25T13:30:23.513 回答
1

下面的批处理文件提供了这两个功能:

  • 它将文件名列表保存在同一个批处理文件中,因此不需要额外的文件。
  • 名称列表不需要任何奇怪的字符,只需与原始文件的名称相同。

.

@echo off
setlocal EnableDelayedExpansion
for /F "delims=:" %%a in ('findstr /N "^:FileList" "%~F0"') do set n=%%a
for /F "delims=" %%a in ('more +%n% "%~F0"') do (
   set source=
   for %%b in (%%a) do (
      if not defined source (set source=%%b) else set dest=%%b
   )
   xcopy !source! !dest! /y /v || goto end_for
)
:end_for
goto :EOF

:FileList
source dest
"\long\path\source number two" "\second dest folder"

如果列表中的名称包含通配符,则此解决方案不起作用。

于 2013-05-25T19:53:05.493 回答