none
タスクスケジューラー実行時のGet-ChildItemへの引数について RRS feed

  • 質問

  • お忙しい所恐れ入ります。
    過去ログは検索したつもりですが、既に既出であれば該当記事を教えて頂ければ幸いです。

    [やりたい事]
    所定のフォルダ内に吐き出されたファイルがある場合、指定のメールアドレスにファイルを添付送信したい。

    [試した事]
    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による変化は無し

    このような状況なのですが、意図したファイル操作を行う為に何が足りないのか、ご教授頂ければ幸いです。

    2018年4月24日 3:39

回答

  • タスク実行時に、T:ドライブが存在していない可能性はないでしょうか。

    ネットワークドライブは、ユーザーがログオンしたときに作成(再接続)されますので…。

    UNCパスを指定してみてはいかがでしょうか。

    2018年4月24日 4:16
    モデレータ

すべての返信

  • イベントログに何か出ていませんかね。

    というか、引数のps1の指定が相対パスになっていますが、どこからの相対になるのか把握されています?

    2018年4月24日 3:46
  • タスク実行時に、T:ドライブが存在していない可能性はないでしょうか。

    ネットワークドライブは、ユーザーがログオンしたときに作成(再接続)されますので…。

    UNCパスを指定してみてはいかがでしょうか。

    2018年4月24日 4:16
    モデレータ
  • 返信遅くなりまして申し訳ございません。

    イベントログを見る限りは、IDが319→100→200→129→201→102となり、何かが出来なかったような表記は見つかりません。

    引数のスクリプトファイルの相対パスですが、開始で指定したフォルダ内の中にある認識であの記述にしたのですが、そもそもそこが間違っているのでしょうか。

    過去の試行錯誤の際にフルパスでも記述はしたのですが、状況が変わらなかったのであの記述となっております。

    C:\toolsフォルダ内にて./get-filelist.ps1を実行する(Linuxで該当フォルダ内の実行可能スクリプトを起動する)イメージかな、とか思ってました。

    スクリプトの開始場所に問題があるのかと思い、引数はフルパス、開始を該当のデータフォルダ(T:\CSVDATA)にした際にはエラーが出て「起動に失敗しました」というログが記録されました。

    2018年4月24日 13:04
  • 返信遅くなりまして申し訳ございません。

    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様、牟田口大介様、本当に有難う御座いました!

    2018年4月24日 13:33