使用循环将文件名写入字符串

问题描述 投票:0回答:1

对于一个项目,我必须有一个负责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是必须的,但仍然不起作用。 我尝试将目录内容写入临时文件,但没有成功..

batch-file
1个回答
0
投票

基本上,您的问题与转义重定向器有关。

我还推测,您想要的文件列表应该是被复制的文件列表,但您的代码似乎是针对报告复制的文件。

尽管如此,我建议您将问题部分替换为〜

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"
,则引号将成为分配值的一部分。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.