トップ回答者
タスクスケジューラー実行時のGet-ChildItemへの引数について

質問
-
お忙しい所恐れ入ります。
過去ログは検索したつもりですが、既に既出であれば該当記事を教えて頂ければ幸いです。
[やりたい事]
所定のフォルダ内に吐き出されたファイルがある場合、指定のメールアドレスにファイルを添付送信したい。
[試した事]
PowerShellで記述、バッチファイルで設定した結果は正常に機能したが、そのバッチファイルをタスクスケジューラに設定しても機能しない。
ファイルの取得が出来ていないのではないかと考え単純なGet-ChildItemでファイル一覧を取得しテキストファイルに吐き出すように書いた結果、中身が空のテキストファイルが出来た事から、手動ではファイル取得出来るがタスクスケジューラでは適切なフォルダが見えていないと想定。
・環境
Windows 7-64bit
CLRVersion:2.0.50727.8762
BuildVersion:6.1.7601.17514
PSVersion:2.0
WSManStackVersion:2.0
PSCompatibleVersions:{1.0, 2.0}
SerializationVersion:1.1.0.1
PSRemotingProtocolVersion:2.1
・PSスクリプトソース
Get-ChildItem T:\CSVDATA -Recurse > "C:\tools\filelist.log"
(Tドライブは、別PCのWindows共有フォルダをマウントしています)
・タスクスケジューラ設定内容
プログラム:%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe
引数の追加:-NoProfile -sta -ExecutionPolicy Unrestricted -File .\get-filelist.ps1
開始:c:\tools
[セキュリティオプション]
●ユーザーがログオンしているかどうかにかかわらず実行する
※最上位の特権で実行するのOn/Offによる変化は無し
このような状況なのですが、意図したファイル操作を行う為に何が足りないのか、ご教授頂ければ幸いです。
回答
-
タスク実行時に、T:ドライブが存在していない可能性はないでしょうか。
ネットワークドライブは、ユーザーがログオンしたときに作成(再接続)されますので…。
UNCパスを指定してみてはいかがでしょうか。
- 回答としてマーク 栗下 望Microsoft employee, Moderator 2018年4月25日 4:02
すべての返信
-
タスク実行時に、T:ドライブが存在していない可能性はないでしょうか。
ネットワークドライブは、ユーザーがログオンしたときに作成(再接続)されますので…。
UNCパスを指定してみてはいかがでしょうか。
- 回答としてマーク 栗下 望Microsoft employee, Moderator 2018年4月25日 4:02
-
返信遅くなりまして申し訳ございません。
イベントログを見る限りは、IDが319→100→200→129→201→102となり、何かが出来なかったような表記は見つかりません。
引数のスクリプトファイルの相対パスですが、開始で指定したフォルダ内の中にある認識であの記述にしたのですが、そもそもそこが間違っているのでしょうか。
過去の試行錯誤の際にフルパスでも記述はしたのですが、状況が変わらなかったのであの記述となっております。
C:\toolsフォルダ内にて./get-filelist.ps1を実行する(Linuxで該当フォルダ内の実行可能スクリプトを起動する)イメージかな、とか思ってました。
スクリプトの開始場所に問題があるのかと思い、引数はフルパス、開始を該当のデータフォルダ(T:\CSVDATA)にした際にはエラーが出て「起動に失敗しました」というログが記録されました。
-
返信遅くなりまして申し訳ございません。
UNC記述はどうか?とのご提案を頂き、Get-ChildItemの参照先を\\192.168.0.1\ro\CSVDATAという記述に変更した所、ファイルリストの書き出しは行われました。
・filelist.log
ディレクトリ: \\192.168.0.1\ro\CSVDATA
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2018/04/18 16:21 7 DUMMY1.CSV
-a--- 2018/04/18 16:21 7 DUMMY2.CSV一歩前進したカンジです!
一つ前の方のアドバイスを元にps1ファイルはフルパス記述にした事も影響したのかなと考え、元の記述にしてみました。
結果元の記述でも動いたので、タスクスケジューラへの引数記述は間違っていなかった模様です。
これを元に、変数$FileListにGet-ChildItemでデータを取得して、$FileList.countでファイル数だけルーチン回してメールにファイルを添付するか実施した所、無事に解決しました!
・実際のメール送信スクリプトファイル添付版
# 変数初期化
$FileList = $null
$body = $null
# 添付ファイル数チェック
$FileList = @(Get-ChildItem \\192.168.0.1\ro\CSVDATA)
# 操作すべきファイルの有無判定
if($FileList.length -eq 0)
{
exit
}
# ファイルが有るようなので仕事しよか
else
{
#
# メール送信セクション
#
# メール送信パラメータ固定値
$i = 0
$EmailFrom = "hoge@fuga.com"
$EmailTo = "fuga@hoge.com"
$Subject = "更新マスタファイル"
$SmtpServer = "smtp.fuga.com"
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer,587)
$SMTPClient.EnableSsl = $false
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("hoge@fuga.com","12345678");
$SMTPClient.Timeout = 100000
# メール文面作成
$body = "※このメールはスクリプトにて自動で送信されています。`n"
$MailMessage = New-Object Net.Mail.MailMessage($EmailFrom, $EmailTo, $Subject, $Body)
# ファイル添付作成
if($FileList){
for($i=0; $i -lt $FileList.Count; $i++){
$File = "\\192.168.0.1\ro\CSVDATA\"
$File += $FileList[$i].name
$Attachmentdata = New-Object Net.Mail.Attachment($File);
$MailMessage.Attachments.Add($Attachmentdata)
}
}
# メール送信実行
$SMTPClient.Send($MailMessage)
}
こんなカンジなのですが、無事にファイル添付されてメールが飛びました。
フォルダからファイルを消したら、メール送信も行われなかったので、これも想定通りの挙動になります。
諸先輩方のアドバイスのお蔭で解決出来ました。
Hongliang様、牟田口大介様、本当に有難う御座いました!