2014-03-18 3 views
0

디렉토리에서 파일을 가져 와서 전자 메일로 보낼 배치 파일을 작성하려고합니다. 그게 쉽지, 내가 겪고있는 문제는 이메일을 보내야하는 파일이 증가하는 숫자 또는 시간/날짜 스탬프를 가지고 있다는 것입니다. 분명히 시간 문제의 불일치로 인해 파일 이름을 증가하는 숫자로 변경할 수 있습니다. 내 문제는 디렉토리에서 가장 최신 인 파일을 지정하는 방법이나 파일 이름에서 가장 큰 번호를 갖는 파일을 지정하는 것입니다. 나는 잠시 동안 지금을 찾고 있었고 도움이 된 것을 발견하지 못했습니다.숫자가 증가하는 파일을 첨부 할 수있는 배치 파일

@echo off 
setlocal 

set Port=465 
set SSL=True 
set From="[email protected]" 
set To="[email protected]" 
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) 

수년 동안이 사이트는 많은 도움을 주었으며 커뮤니티에 감사의 말씀을 전하고 싶습니다.

+0

'dir' 명령의'/ o' 옵션을 사용하여 파일을 최신 날짜 또는 가장 오래된 날짜 순으로 정렬 할 수 있습니다. 그런 다음 나열된 첫 번째 또는 마지막 파일을 사용하십시오. 예 :'for/f "delims ="(dir/a-d/b/od '의) %% A가 "newest = %% ~ fA"를 설정합니까 –

+0

데이비드 감사합니다. 나는 내가 생각한 것만 큼 똑똑하지는 않다./o 옵션으로 파일을 정렬하는 방법을 알 수 있습니다. 나는 그것을 코드로 통합하여 기능을 구현하는 방법에 관해서는 분실되었다. 도움을 주신 것에 대해 다시 한번 감사드립니다. – user3434325

답변

0

폴더에 .JPG 파일의 수천이있는 경우 다음 짧은 지연 될 (set fileattach="\\networklocation\filename.jpg"

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

그것은 최신 파일을 선택 대신에 아래의 라인을 사용하거나 방법 B를 요청 :)

두 위치에서 \\networklocation을 변경하십시오.

+0

폴더에 약 20 개 정도의 파일이 있더라도 실행 지연이 있습니다. 나는 이것이 자주 그렇게 부르길 기대하지 않기 때문에 나는 그것에 아무런 문제가 없다. 도와 주셔서 대단히 감사 드리며 시간과 공헌에 감사드립니다. – user3434325

+0

감사합니다. 배치 파일 자체만으로도 짧은 시간이 걸린다는 것을 분명히하기 위해서입니다. 많은 파일이있는 경우 루프가 차례대로 모든 파일 이름을 취하고 최신 파일을 기억하므로 몇 초가 걸릴 수 있습니다. 도움이 돼서 기쁩니다. – foxidrive

+0

나는 오늘 좀 더 파고 들었고 그것이 실제로하는 일을 실제로하지 않는다는 것을 발견했다. 왜 그런지 모르겠지만 몇 가지 이유로 새로운 이미지를 보내고 있음에도 불구하고 동일한 이미지를 반복해서 전송합니다. – user3434325

0

여기에 내가 작성한 기능이 있습니다. 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%" 
+0

감사합니다. Matt, 나는 거기에 이미 무엇이 들어 있는지에 문제가있는 것처럼 보입니다. 은 검색 할 파일의 폴더 위치가 맞는지 맞습니까? 삽입 할 내용을 으로 모르겠습니다. 완전한 무지로 용서해주십시오. – user3434325

+0

은 무엇이든 가능합니다. 이 예제에서는 반환 변수로 "latest"를 사용했습니다. –

관련 문제