Пакетный файл, который может прикрепить файл с возрастающим номером

Я пытаюсь написать командный файл, который извлечет файл из каталога и отправит его по электронной почте. Это легко, проблема, которую я имею, состоит в том, что файл, который должен быть отправлен по электронной почте, имеет или увеличивающееся число или отметку времени / даты. Очевидно, что из-за несоответствия времени и даты выпуска я могу изменить имена файлов на числа, которые увеличиваются. Моя проблема заключается в том, как определить файл, который является самым новым в каталоге, или файл с наибольшим номером в имени файла. Я долго искал и не нашел ничего, что помогло.

@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)

На протяжении многих лет этот сайт очень помог мне, и я просто хотел сказать спасибо сообществу.

2 ответа

Решение

Используйте строку ниже вместо set fileattach="\\networklocation\filename.jpg"

for /f "delims=" %%a in ('dir "\\networklocation\*.jpg" /b /od') do set fileattach="\\networklocation\%%a"

Он выбирает самый новый файл (если в папке тысячи файлов.jpg, ожидайте небольшую задержку или запросите метод B:))

+ Изменить \\networklocation в двух местах.

Вот функция, которую я написал, чтобы сделать это. Это похоже на код Дэвида, но использует / od, чтобы взять первый найденный файл и выйти из цикла. Это ускорит работу, если в каталоге много файлов. Это также позволяет вам легко указать, хотите ли вы последнее, созданное, доступное или написанное.

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%"
Другие вопросы по тегам