Windows批处理脚本 - 从for循环中的目录移动文件的问题

时间:2017-09-17 15:07:49

标签: batch-file for-loop cmd

我遇到了一个令我困惑的奇怪问题 -

我正在运行的Windows脚本是一个包装脚本,它将遍历公共目录中的所有csv文件,并在调用其中一个子进程之前将它们移动到处理文件夹。当输入文件夹中没有剩余的csv文件时,应该终止包装脚本。但是我收到一条消息说

  

'存在重复的文件名或文件   无法找到。'

输入文件夹\ abcinc.lcl \ utility \ aaa作为空文件夹,其下没有其他文件或子文件夹。

为什么以下for循环在没有文件时没有正常终止而是失败的原因?

  

for / F %% i in(' dir / b" \ abcinc.lcl \ utility \ aaa * .csv"')do(

以下是完整的代码段以及日志的输出 -

span(@click="alert()")
  t-button.white Send // PUG template

1 个答案:

答案 0 :(得分:1)

命令 FOR 在后台命令进程中使用cmd.exe命令行执行:

dir /b "\\abcinc.lcl\utility\aaa\*.csv"

用于处理 STDOUT DIR 输出由 FOR 捕获。 DIR 在指定目录中的* .csv文件上输出的可能错误消息将重定向到运行 FOR 的命令进程控制台。

命令 FOR 在执行 DIR 完成后台命令处理后逐行处理捕获的输出。

因此,指定目录中的* .csv文件接下来会发生什么并不重要。 FOR 已经在内存中逐行处理文件名列表。

这个评论的批处理代码可能更适合您的任务:

@echo off
if not exist "\\abcinc.lcl\utility\aaa\*.csv" (
    echo Folder "\\abcinc.lcl\utility\aaa" contains no CSV files.
    goto :EOF
)

echo Folder "\\abcinc.lcl\utility\aaa" contains CSV files.
set "File=LOADIN.csv"

rem Move all CSV files from \\abcinc.lcl\utility\aaa to E:\abc\INFILES.
move /Y "\\abcinc.lcl\utility\aaa\*.csv" E:\abc\INFILES\ >nul

rem Process each CSV file in E:\abc\INFILES using subroutine ProcessFile.
for %%I in (E:\abc\INFILES\*.csv) do call :ProcessFile "%%I"

rem Exit processing of this batch file.
goto :EOF

:ProcessFile
rem Wait 4 seconds if a device with IP address 10.1.41.19 exists.
%SystemRoot%\System32\ping.exe 10.1.41.19 -n 5 >nul

rem Rename the current file temporarily.
ren %1 "%File%"

rem Call another batch file doing something.
call "E:\abc\scripts\RUNALL.BAT"

rem Wait again 4 seconds if a device with IP address 10.1.41.19 exists.
%SystemRoot%\System32\ping.exe 10.1.41.19 -n 5 >nul

rem Move the temporary file to input archive folder with
rem regional settings dependent date and time in new file name.
move "E:\abc\INFILES\%File%" "E:\abc\INFILES\ARCHIVE\LOADIN - %DATE:/=-% %TIME::=-%.CSV"

rem Wait again 2 seconds if a device with IP address 10.1.41.19 exists.
%SystemRoot%\System32\ping.exe 10.2.23.49 -n 3 >nul

rem Move output CSV file to output archive folder again with
rem regional settings dependent date and time in new file name.
move "\\abcinc.lcl\utility\aaa\OUTPUT\outfile.csv" "\\abcinc.lcl\utility\aaa\OUTPUT\ARCHIVE\outfile - %DATE:/=-% %TIME::=-%.CSV"

rem Exit the subroutine ProcessFile.
goto :EOF

使用子程序可以处理所有CSV文件而不使用延迟扩展。

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

  • call /?
  • dir /?
  • echo /?
  • for /?
  • goto /?
  • if /?
  • move /?
  • ping /?
  • set /?

另请阅读Microsoft有关Using Command Redirection Operators

的文章