我遇到了一个令我困惑的奇怪问题 -
我正在运行的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
答案 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。
的文章