对于一个项目,我必须有一个负责FTP文件上传的批处理脚本。 为了更轻松地调试/让我们知道问题何时发生,如果 ftp 上传不成功,我想发送一封邮件,列出未上传的文件。 这就是我被困住的地方。
setlocal enabledelayedexpansion
REM winscp script call here
set exitCode=%ERRORLEVEL%
set file_list=
set file_count=0
set export_dir=D:\data\dir1\dir2
pause
echo Checking files in %export_dir%
dir %export_dir%
pause
REM issue here, with the loop probably
for %%i in (%export_dir%\*) do (
set "filename=%%~nxi"
echo Found file: !filename!
set file_list=!file_list!!filename!<br>
set /a file_count+=1
)
echo File List: !file_list!
echo File Count: %file_count%
pause
循环出了问题,我不知道是什么。我在哪里、用什么来破坏它? 提前谢谢!
我发现enabledelayedexpansion是必须的,但仍然不起作用。 我尝试将目录内容写入临时文件,但没有成功..
基本上,您的问题与转义重定向器有关。
我还推测,您想要的文件列表应该是被未复制的文件列表,但您的代码似乎是针对报告被复制的文件。
尽管如此,我建议您将问题部分替换为〜
set /a file_count=0
:: remove variables starting file_list
FOR /F "delims==" %%e In ('set file_list 2^>Nul') DO SET "%%e="
for %%i in (file1.txt file2.ext "file3 with space.wrx") do (
echo Found file: %%~nxi
set "file_list=!file_list!:%%~nxi"
set /a file_count+=1
SET "file_list[!file_count!]=%%~nxi"
)
SET "file_list=%file_list::=^<br^>%"
ECHO File list %file_list:~6%^<br^>
FOR %%e IN (1,1,%file_count%) DO ECHO !file_list[%%e]!^<br^>
它实现了两种不同的解决问题的方法。您选择哪一个取决于您实际想要什么,但您尚未指定。
请注意,我只是向循环提供固定文件名以进行测试。当然,您可以更改
for
以提供循环所需的数据 。
方法一:如果所需的输出是
file1<br>file2<br>file3<br>
,则仅使用包含
[
的行 not。这会按照您最初的设计构建
file_list
,但在文件名的开头和文件名之间有一个冒号。冒号,因为冒号不能出现在文件名中。构建列表后,将每个冒号替换为
^<br^>
,并显示结果,全部排除前 6 个字符,并在末尾添加
^<br^>
。方法二:
如果需要的输出是
file1<br>
file2<br>
file3<br>
然后使用包含 [
的行。这会将文件名分配给
file_list[n]
,每个文件名分配一个,然后简单地列出它们并附加
^<br^>
我假设输出正在传送到文件中进行传输,因此使用 >>filename ECHO
代替
ECHO
将所需的输出附加到文件中。当然,要注意可变长度限制以及处理的文件名中的批量敏感字符(如
!%^&
)的影响。提示:使用
set "var=value"
设置字符串值 - 这可以避免尾随空格引起的问题。不要分配
"
或终端反斜杠或空格。从元素构建路径名 - 与直觉相反,它可能会使过程变得更容易。如果使用语法
set var="value"
,则引号将成为分配值的一部分。