各位達人大家好:
以下是小弟不才的語法,該程式的目的是:
「偵測內部網路主機中的資料,其路徑(資料夾)是否有檔案,若有檔案則壓縮該資料中的所有檔案為zip檔,並將壓縮檔以Email附件的方式寄出。」
註:
以下程式碼,皆是以「工作排程」來執行,時間一到就自動執行該程式。
但是,目前偶爾會發生的問題如下:
而且當上述問題發生時,我手動執行該工作排程,其結果就正常;我平常是使用 「Windows 的工作排程」來執行的,時間到就自動執行該程式碼。
按照程式的邏輯來說,應該是沒錯才對!還是有我沒有看到、想到的地方,導致以上的問題發生,故請有經驗的達人能幫忙查看一下,是否哪裏有問題;
謝謝!!
==========================以下為程式內容==========================
#Email收件、寄件者資訊
$EmailTo = "收件人群組"
$EmailFrom = "寄件人信箱"
#Email主旨
$Subject1 = "$((get-date).ToString('yyMMdd')) Exact Taipei Scan Docs."
$Subject2 = "$((get-date).ToString('yyMMdd')) ""No"" Exact Taipei Scan Docs."
#Email本文內容
$Body1 = "Today's Scan Documents From Exact Taipei."
$Body2 = "Today ""No"" Scan Documents From Exact Taipei."
#Email寄送主機
$SMTPServer = "ms.mailcloud.com.tw"
#If判斷目的資料夾中是否存有任何檔案
$condtion = Test-Path "\\192.168.10.210\Exact Commerce Taipei\00.共用資料\00.共享資料\DailyScan\Outfax\$((get-date).tostring('yyyy'))\$((get-date).tostring('MM'))\$((get-date).tostring('dd'))\*.*"
if ($condtion)
{
# If判斷若為True,則執行以下程式碼
#壓縮附件
Compress-Archive -Path "\\192.168.10.210\Exact Commerce Taipei\00.共用資料\00.共享資料\DailyScan\Outfax\$((get-date).tostring('yyyy'))\$((get-date).tostring('MM'))\$((get-date).tostring('dd'))" -Force -Destinationpath "\\192.168.10.210\Exact Commerce Taipei\00.共用資料\00.共享資料\DailyScan\Outfax\$((get-date).tostring('yyyy'))\$((get-date).tostring('MM'))\$((get-date).tostring('dd'))\$((get-date).tostring('yyMMdd')).zip"
$filenameAndPath = "\\192.168.10.210\Exact Commerce Taipei\00.共用資料\00.共享資料\DailyScan\Outfax\$((get-date).tostring('yyyy'))\$((get-date).tostring('MM'))\$((get-date).tostring('dd'))\$((get-date).tostring('yyMMdd')).zip"
$SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$EmailTo,$Subject1,$Body1)
$attachment = New-Object System.Net.Mail.Attachment($filenameAndPath)
$SMTPMessage.Attachments.Add($attachment)
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 25)
}
else
{
#If判斷若為False,則執行以下程式碼
$SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$EmailTo,$Subject2,$Body2)
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 25)
}
#執行寄送Email動作
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("xxxxxxxxxx", "xxxxxxxxx");
$SMTPClient.Send($SMTPMessage)
===================以下為04/14修改後的程式內容===================
#Email收件、寄件者資訊
$EmailTo = "收件人群組"
$EmailFrom = "寄件人信箱"
#Email主旨
$Subject1 = "$((get-date).ToString('yyMMdd')) Exact Taipei Scan Docs."
$Subject2 = "$((get-date).ToString('yyMMdd')) ""No"" Exact Taipei Scan Docs."
#Email本文內容
$Body1 = "Today's Scan Documents From Exact Taipei."
$Body2 = "Today ""No"" Scan Documents From Exact Taipei."
#Email寄送主機
$SMTPServer = "ms.mailcloud.com.tw"
#If判斷目的資料夾中是否存有任何檔案
$condtion = Test-Path "\\192.168.10.210\Exact Commerce Taipei\00.共用資料\00.共享資料\DailyScan\Outfax\$((get-date).tostring('yyyy'))\$((get-date).tostring('MM'))\$((get-date).tostring('dd'))\*.*"
if ($condtion)
{
# If判斷若為True,則執行以下程式碼
#壓縮附件
Compress-Archive -Path "\\192.168.10.210\Exact Commerce Taipei\00.共用資料\00.共享資料\DailyScan\Outfax\$((get-date).tostring('yyyy'))\$((get-date).tostring('MM'))\$((get-date).tostring('dd'))" -Force -Destinationpath "\\192.168.10.210\Exact Commerce Taipei\00.共用資料\00.共享資料\DailyScan\Outfax\$((get-date).tostring('yyyy'))\$((get-date).tostring('MM'))\$((get-date).tostring('dd'))\$((get-date).tostring('yyMMdd')).zip"
start-sleep -s 5
$filenameAndPath = "\\192.168.10.210\Exact Commerce Taipei\00.共用資料\00.共享資料\DailyScan\Outfax\$((get-date).tostring('yyyy'))\$((get-date).tostring('MM'))\$((get-date).tostring('dd'))\$((get-date).tostring('yyMMdd')).zip"
$SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$EmailTo,$Subject1,$Body1)
$attachment = New-Object System.Net.Mail.Attachment($filenameAndPath)
$SMTPMessage.Attachments.Add($attachment)
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 25)
}
else
{
#If判斷若為False,則執行以下程式碼
$SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$EmailTo,$Subject2,$Body2)
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 25)
}
#執行寄送Email動作
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("xxxxxxxxxx", "xxxxxxxxx");
$SMTPClient.Send($SMTPMessage)
建議你分段測試,先確定手動執行是OK的;另外偶爾會發生"明明該資料夾(路徑)有檔案,程式卻判斷該資料夾沒有檔案(即沒有壓縮該資料夾),寄出沒有附件的Email主旨與本文",可能為壓縮檔還未完成,就開始跑寄件了
打雜工,您好:
首先很感謝您的回覆;您建議分段測試,先確定手動執行是否正常;
當初在測試程式的時候,就是一段程式一段程式測試的,就是壓縮附件
的語法是否正常?偵測路徑資料夾中是否有檔案?寄件語法是否能將
Email寄出…?都正常無誤後,最後程式再整個合起來後,測試程式語法
的效果,也就是當初在撰寫、測試程式時,其結果都是正常的,最後程式
內容就決定是這樣子;還有您提到可能壓縮檔還未完成,就開始跑寄件
了,這個我還真的沒有想到,不過,一般程式在執行的時候,不是應該
要等該段程式碼執行完後,再執行下一段程式碼嗎?如果有可能是這種情
況的話,程式要怎麼改比較好?要怎麼知道或是讓檔案已經壓縮完成後,
再將Email寄出?而且也曾經有發生過,目的路徑中的資料夾有檔案,但是
,程式卻誤判沒有檔案,當然就沒有壓縮檔案,所以,寄出的Email就是沒
有附件的主旨與內文,這個情況就是我上述原文提到發生的問題第2點;
這個就不太可能跟壓縮檔案的程式有關,因為連壓縮檔案的動作都沒有;
目前我的做法是跟程式語法無關;先將該部電腦的"防毒軟體
(Symantec Endpoint Protection)"移除;再將Windows 內建的防火
牆關閉,雖然感覺不是這個原因,不過還是試試看這樣子問題會不會不再發生;謝謝!!
我早期寫vbs及後來寫PowerShell時有遇過類似時好時壞的經驗,其中的經驗就是程式上一段結果尚未產生,就跑到下一段了;後來我索性讓它停個幾秒的時間(sleep),就解決了。當然可能還有其它的情況,因您給的線索會讓我先想到這個經驗,所以先提供您參考
打雜工您好:
謝謝您的回覆,昨天在看完您的建議後,我想了一下,於是在程式「壓縮」語法後的位置加上「start-sleep -s 5」的程式碼;也就是在壓縮完資料夾後,讓程式停個5秒左右(壓縮Excel檔案),再執行下一段程式,如下所示,這樣子應該就可以避免在還沒有壓縮完檔案,就直接進行下一段程式;不過,加完這個程式碼後,在測試的時候是正常的,也就是:
1、判斷路徑資料夾有檔案;
2、壓縮檔案成附件,並將Email寄出。
但是,工作排程時間一到執行全部的程式碼,竟然出現我原文所述的第二個問題,也就是程式誤判資料夾中沒有檔案,所以,就沒有壓縮檔案成附件,導致Email以"沒有"附件的主旨與內文,將Email寄出;而當此狀況發生時,我馬上在「工作排程」中再執行一次,此次又正常執行,也就是判斷路徑資料夾有檔案,並且壓縮該資料夾檔案成附件,且寄出該封Email(搭配有附件的主旨與內文);所以…;真的很奇怪;不知道問題是
出在哪裏?
謝謝!
程式碼如下:
略....
Compress-Archive -Path "\\192.168.10.210\Exact Commerce Taipei\00.共用資料\00.共享資料\DailyScan\Outfax\$((get-date).tostring('yyyy'))\$((get-date).tostring('MM'))\$((get-date).tostring('dd'))" -Force -Destinationpath "\\192.168.10.210\Exact Commerce Taipei\00.共用資料\00.共享資料\DailyScan\Outfax\$((get-date).tostring('yyyy'))\$((get-date).tostring('MM'))\$((get-date).tostring('dd'))\$((get-date).tostring('yyMMdd')).zip"
start-sleep -s 5
$filenameAndPath = "\\192.168.10.210\Exact Commerce Taipei\00.共用資料\00.共享資料\DailyScan\Outfax\$((get-date).tostring('yyyy'))\$((get-date).tostring('MM'))\$((get-date).tostring('dd'))\$((get-date).tostring('yyMMdd')).zip"
$SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$EmailTo,$Subject1,$Body1)
....略
抱歉,你的程式碼我就先不看了,以我的經驗,如果你手動執行每次都OK,排程執行確找不到檔案,請您先確定檔案是否有產生,如果檔案有產生,那可能就是你PowerShell與排程內"動作"內"開始位置"的路徑有關,您再參考看看。
的確對於這種手動執行都ok,但自動排程進行就"偶爾"出問題的情況較難排查問題.有以下建議供參考.
1.把UNC網路連接方式改為掛載為網路磁碟,先掛載好再判斷檔案是否存在,處理完畢時卸載網路磁碟.也許你會覺得都嘛沒差,都是透過網路,但換個方式處理,也是提供一個排查問題的有利面向.
2.視需要在重要階段的處理結果都刻意輸出存成文字檔,以利除錯.例如判斷掛載網路磁碟是否成功外也要輸入磁碟代號,判斷檔案是否存在外也要輸出檔案名稱等等.
目的就是為抓出那"偶爾"出錯的部份會是在發生在哪個階段,以及錯在哪裡,希望以上建議有所幫助.