【发布时间】:2017-09-17 15:07:49
【问题描述】:
我遇到了一个奇怪的问题,现在让我感到困惑 -
我正在运行的 Windows 脚本是一个包装脚本,它将遍历公共目录中的所有 csv 文件,并在我调用其中一个子进程之前将它们移动到处理文件夹。当输入文件夹中没有更多 csv 文件时,包装脚本应该终止。但是我收到一条消息说
'存在重复的文件名,或者文件 找不到。'
输入文件夹 \abcinc.lcl\utility\aaa 是一个空文件夹,其下没有其他文件或子文件夹。
以下 for 循环在没有文件时没有正常终止而是失败的任何原因?
for /F %%i in ('dir /b "\abcinc.lcl\utility\aaa*.csv"') 做 (
这里是完整的代码 sn-p 以及日志的输出 -
***************************************************************************
**** Wrapper Script ****
***************************************************************************
@echo off
Setlocal enabledelayedexpansion
for /F %%i in ('dir /b "\\abcinc.lcl\utility\aaa\*.csv"') do (
echo Folder is NON empty
move "\\abcinc.lcl\utility\aaa\*.csv" E:\abc\INFILES
For %%a in (E:\abc\INFILES\*.csv) Do (
PING 10.1.41.19 -n 5 >NUL
Set "File=LOADIN.csv"
Ren "%%a" "!File!"
CALL "E:\abc\scripts\RUNALL.BAT"
PING 10.1.41.19 -n 5 >NUL
MOVE "E:\abc\INFILES\LOADIN.CSV" "E:\abc\INFILES\ARCHIVE\LOADIN - %DATE:/=-% %TIME::=-%.CSV"
PING 10.2.23.49 -n 3 >NUL
MOVE "\\abcinc.lcl\utility\aaa\OUTPUT\outfile.csv" "\\abcinc.lcl\utility\aaa\OUTPUT\ARCHIVE\outfile - %DATE:/=-% %TIME::=-%.CSV"
)
)
EXIT
***********************************************************************
**** LOG OUTPUT ****
***********************************************************************
Folder is NON empty
\\abcinc.lcl\utility\aaa\File1.csv
\\abcinc.lcl\utility\aaa\File2.csv
2 file(s) moved.
RunAll script ran fine.
1 file(s) moved.
1 file(s) moved.
RunAll script ran fine.
1 file(s) moved.
1 file(s) moved.
Folder is NON empty
A duplicate file name exists, or the file
cannot be found.
【问题讨论】:
-
您的第一个
move命令将所有文件移动到infiles文件夹,但如果有多个文件,for /f会不断迭代初始dir命令的输出。 -
感谢@MCND,但我在括号内使用了整个 for 循环。我想知道当没有更多文件可以从输入文件夹中读取时,是否应该在结束括号之前使用显式退出以退出循环?但是如果整个 for /f 都包裹在 () 中,不明白为什么我必须通过显式退出?
-
如果你有前任。文件夹中有3个文件,
dir命令会生成三行输出。for /f遍历这三行,因此do子句中的代码将执行三次,无论您是否移动了文件并且它们不在源文件夹中。由于您没有使用%%i值,因此如果dir没有失败,您可以只用dir和&&条件执行运算符替换初始for /f,以执行其余代码。
标签: batch-file for-loop cmd