Batch file 可以附加编号递增的文件的批处理文件

Batch file 可以附加编号递增的文件的批处理文件,batch-file,timestamp,email-attachments,datestamp,Batch File,Timestamp,Email Attachments,Datestamp,我正在尝试编写一个批处理文件,它将从目录中提取一个文件并通过电子邮件发送给它。这很简单,我遇到的问题是,需要通过电子邮件发送的文件要么数量不断增加,要么带有时间/日期戳。显然,由于时间-日期问题的不一致性,我可以将文件名更改为增加的数字。我的问题是如何指定目录中最新的文件或文件名中数字最大的文件。我已经搜索了一段时间,没有找到任何有用的东西 @echo off setlocal set Port=465 set SSL=True set From="email@blah.com" set To

我正在尝试编写一个批处理文件,它将从目录中提取一个文件并通过电子邮件发送给它。这很简单,我遇到的问题是,需要通过电子邮件发送的文件要么数量不断增加,要么带有时间/日期戳。显然,由于时间-日期问题的不一致性,我可以将文件名更改为增加的数字。我的问题是如何指定目录中最新的文件或文件名中数字最大的文件。我已经搜索了一段时间,没有找到任何有用的东西

@echo off
setlocal

set Port=465
set SSL=True
set From="email@blah.com"
set To="email@blah.com"
set Subject="Subject"
set Body="Body"
set SMTPServer="smtp.gmail.com"
set User="username"
set Pass="password"
set fileattach="\\networklocation\filename.jpg"

if "%~7" NEQ "" (
set From="%~1"
set To="%~2"
set Subject="%~3"
set Body="%~4"
set SMTPServer="%~5"
set User="%~6"
set Pass="%~7"
set fileattach="%~8"
)

set "vbsfile=%temp%\email-bat.vbs"
del "%vbsfile%" 2>nul
set cdoSchema=http://schemas.microsoft.com/cdo/configuration
echo >>"%vbsfile%" Set objArgs       = WScript.Arguments
echo >>"%vbsfile%" Set objEmail      = CreateObject("CDO.Message")
echo >>"%vbsfile%" objEmail.From     = %From%
echo >>"%vbsfile%" objEmail.To       = %To%
echo >>"%vbsfile%" objEmail.Subject  = %Subject%
echo >>"%vbsfile%" objEmail.Textbody = %body%
if exist %fileattach% echo >>"%vbsfile%" objEmail.AddAttachment %fileattach%
echo >>"%vbsfile%" with objEmail.Configuration.Fields
echo >>"%vbsfile%"  .Item ("%cdoSchema%/sendusing")        = 2 ' not local, smtp
echo >>"%vbsfile%"  .Item ("%cdoSchema%/smtpserver")       = %SMTPServer%
echo >>"%vbsfile%"  .Item ("%cdoSchema%/smtpserverport")   = %port%
echo >>"%vbsfile%"  .Item ("%cdoSchema%/smtpauthenticate") = 1 ' cdobasic
echo >>"%vbsfile%"  .Item ("%cdoSchema%/sendusername")     = %user%
echo >>"%vbsfile%"  .Item ("%cdoSchema%/sendpassword")     = %pass%
echo >>"%vbsfile%"  .Item ("%cdoSchema%/smtpusessl")       = %SSL%
echo >>"%vbsfile%"  .Item ("%cdoSchema%/smtpconnectiontimeout") = 30
echo >>"%vbsfile%"  .Update
echo >>"%vbsfile%" end with
echo >>"%vbsfile%" objEmail.Send

cscript.exe /nologo "%vbsfile%"

echo email sent (if variables were correct)

这些年来,这个网站给了我很多帮助,我只想对社区说声谢谢。

这是我写的一个函数。它与David的代码类似,但使用/o-d获取找到的第一个文件,然后退出循环。如果目录中有很多文件,这将加快速度。它还允许您轻松指定是否要创建、访问或写入最新版本

Call :getlatestfile "C:\files" "w" latest
echo %latest%
exit /b         


:getlatestfile <path> <c/a/w> <return>
setlocal
for /f %%b in ('dir "%~1" /b /o-d /t%~2') do (
set "latest=%%b" & goto :out)
:out
endlocal & set "%~3=%latest%"

使用下面的行代替set fileattach=\\networklocation\filename.jpg

如果文件夹中有数千个.jpg文件,它将选择最新的文件,然后等待短暂的延迟,或者请求方法B:


在两个位置更改\\networklocation。

您可以使用dir命令的/o选项按最新日期或最早日期对文件进行排序。然后只使用列出的第一个或最后一个文件。示例:对于/f delims=%%A,在“dir/A-d/b/od”中,do set latest=%%~fAThank you David。我想我并没有想象中那么聪明。我可以看到/o选项如何排列文件。我只是不知道如何将其合并到代码中以使其功能化。再次感谢你提供的帮助。谢谢马特,我似乎很难将这些融入到已经存在的东西中。我猜那个将是要搜索的文件的文件夹位置,对吗?我不确定要插入什么作为。请原谅我的无知。什么都可以。在本例中,我使用latest作为返回变量。即使文件夹中有大约20个文件,也会有执行延迟。我对此没有问题,因为我不希望经常这样称呼。我非常感谢你的帮助,感谢你的时间和贡献。谢谢。只是澄清一下,批处理文件本身确实需要很短的时间。如果有很多文件,那么它可能需要额外的几秒钟,因为循环依次获取每个文件名,并记住最新的文件名。我很高兴它有帮助。我今天做了一些进一步的挖掘,发现它实际上并没有做到它应该做的。我不知道为什么,但出于某种原因,它只是一次又一次地发送相同的图像,尽管有一个更新的图像要发送。我找到了解决方案,即批处理文件在写入文件之前被执行。我必须添加一个TIMEOUT/t30/nobreak,以便添加足够的睡眠时间,以允许写入和搜索文件。在概述这条信息之前,有了这一点,我就能够让它发挥作用。再次感谢你的帮助
for /f "delims=" %%a in ('dir "\\networklocation\*.jpg" /b /od') do set fileattach="\\networklocation\%%a"