3

SMTP 経由で電子メールを送信する PowerShell スクリプトがあります。スクリプトは Powershell ISE 内では正常に実行されますが、タスク スケジューラでは失敗します。私は Windows Server 2012 を使用しています。まったく同じセットアップを使用してこのサーバーで実行する他の Powershell スクリプトがありますが、それらのスクリプトは電子メールを送信しません。タスク スケジューラに表示されるリターン コードは (0xFFFD0000) で、これに関する情報が見つかりません。最高の特権で実行するようにタスクを設定し、実行ポリシーが RemoteSigned であることを確認しました。誰もこれに遭遇しましたか?

タスクのコマンドは次のとおりです。

powershell -f "c:\scripts\EmailTest.ps1"

スクリプトは次のとおりです。

$EmailFrom = "user@domain.com"
$EmailTo = "someone@somewhere.com"
$Subject = "Email Subject" 
$Body = @"
Person,

Some message here

Thanks,
User
"@

$SMTPServer = "smtp.domain.com" 
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 25) 
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("user@domain.com", "password"); 
$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)

更新: 問題を解決できました。どうやら、コメントアウトされたスクリプトに追加の行があったようです。なぜこれがエラーの原因になるのかはわかりませんが、コメントアウトされた行を削除すると、タスク スケジューラで正常に動作しました。コメントは次のようになり、上記のスクリプトの他の $EmailTo 宣言のすぐ下にありました。

#$EmailTo = "someone@somewhere.com"
4

3 に答える 3

8

同様の問題を調べているときに、別の問題の可能性を見つけました。ターゲット ユーザーとして Windows にログインし、PowerShell 内で実行するとスクリプトが正しく実行されたにもかかわらず、PowerShell スクリプトをタスク スケジューラ アクションとして実行できませんでした。

通常の PowerShell クォーティング ルールと思われるものを使用して、タスクのアクション引数でスクリプトを指定すると、タスク スケジューラは一貫して 0xFFFD0000 エラーを表示します。

-ExecutionPolicy Bypass -File 'D:\full path\to\script.ps1'

PowerShell は黙認し、タスク スケジューラは、使用した引用符を single から double に変更したときに、すぐに問題なくタスクを開始しました。

-ExecutionPolicy Bypass -File "D:\full path\to\script.ps1"

コマンドプロンプトにドロップして完全なコマンドを実行すると、すぐに問題が明らかになりました。

D:\>C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -File 'D:\full path\to\script.ps1'

Processing -File ''D:\full path\to' failed: The given path's format is not supported. Specify a valid path for the -File parameter.

パスの前に 2 つの単一引用符があり、パスの後に単一引用符が 1 つあるという奇妙な使い方に注意してください。

教訓: スクリプトのフル パスをコマンド ライン パラメーターとして PowerShell に渡すときは、二重引用符を使用してください。

于 2014-03-26T18:48:24.690 に答える