web-dev-qa-db-ja.com

3つの引数を持つ32ビットPowerShellスクリプトを実行するためのスケジュールされたタスク

TLDRバージョン

Windows Server 2008 R2でスケジュールされたタスクとして3つの引数を取る32ビットPowerShellスクリプトを実行する必要があります。スクリプトはFileSystemWatcherを起動するので、新しいファイルを取得し続けることができるように、スクリプトを存続させる必要があります。

スキミングしている場合は、以下の「引数」の下にあるものを確認する必要があります。

バックグラウンド

Windows Server 2008R2ボックスのx86PowerShellコンソールから正常に実行されるPowerShellスクリプトを作成しました。 FileSystemWatcherを作成し、ファイル作成イベントのアクションを登録します。監視を続けるにはFileSystemWatcherが必要なので、スクリプトが実行された直後に終了するのではなく、PowerShellを実行し続ける必要があります。

スクリプトは3つの引数を取ります。

  1. 監視するフォルダへのパス
  2. 新しい.xlsxファイルを移動し、.xlsxファイルの内容に基づいて出力テキストファイルを書き込むフォルダーへのパス。
  3. ログファイルへのパス。

ただし、スクリプトをスケジュールされたタスクとして正しく実行することはできません。問題は私が使用している引数だと思いますが、どの引数が正しいかわかりません。

セットアップ

スクリプトを32ビットPowerShellで実行する必要があるため、スケジュールされたタスクのプログラムを%SystemRoot%\ syswow64\WindowsPowerShell\v1.0\powershell.exeに設定しました。

32ビットPowerShellのローカルマシンの実行ポリシーをRemoteSignedに設定していることを確認しました。

引数

私は自分の議論のためにいくつかの異なる変種を試しました。以下はコンソールで実行されますが、 タスクスケジューラ で何らかの方法で失敗します:

タスクは実行されますが、ログファイルに書き込まれません。これは、おそらくFileSystemWatcherを起動していないことを示しています。いずれの場合も、作成時にファイルを取得しません。

powershell -Noexit -File "D:\Scripts\myScript.ps1" "\\otherServer\share\folder\subfolder\" "\\someserver.domain.edu\D$\working_directory\" "\\otherServer\share\folder\my_log.txt"

タスクはコード0xFFFD0000で終了します(Powershellスケジュールタスクの0xFFFD0000の最終結果を参照)。タスクは、引数で使用されているネットワーク共有にアクセスできる適切なサービスアカウントとして実行されていると確信しています。

powershell -Noexit -File 'D:\Scripts\myScript.ps1' '\\otherServer\share\folder\subfolder\' '\\someserver.domain.edu\D$\working_directory\' '\\otherServer\share\folder\my_log.txt'

これらのバリアントはコンソールでも機能しません(ログへの最初の書き込みを行うほどではありません)。

powershell -Noexit -File "D:\Scripts\myScript.ps1" "\\otherServer\share\folder\subfolder\ \\server.domain.edu\D$\working_directory\ \\otherServer\share\folder\my_log.txt"
powershell -Noexit -command {"& 'D:\Scripts\myScript.ps1' '\\otherServer\share\folder\subfolder\' '\\server.domain.edu\D$\working_directory\' '\\otherServer\share\folder\my_log.txt'"}

Scripting Guysブログ に基づいて、-Commandの代わりに-File引数を使用してみるべきだと思いました。これらの2つのバリアントは、コンソールでファイルシステムウォッチャーを起動し、対応するメッセージをログファイルに書き込みますが、作成時にファイルを取得しません。

powershell -Noexit -command "& 'D:\Scripts\myScript.ps1' '\\otherServer\share\folder\subfolder\' '\\server.domain.edu\D$\working_directory\' '\\otherServer\share\folder\my_log.txt'"
powershell -Noexit -command "& D:\Scripts\myScript.ps1 \\otherServer\share\folder\subfolder\ \\server.domain.edu\D$\working_directory\ \\otherServer\share\folder\my_log.txt"

コード

スクリプトはコンソールで機能するため、問題はコード自体にあるのではないと確信しています。それでも、コードを見ないと満足できない人のために、スクリプト自体からいくつかの関連部分があります。 :)

FileSystemWatcherを作成します

Function startWatcher ($onFolder) {
    try {
        #Create a file watcher
        $filter = "*.xlsx"
        $fsWatcher = New-Object IO.FileSystemWatcher $onFolder, $filter -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}
        $fileWatcherStartDate = (Get-Date -format M.d.yyyy.HH.mm.ss).Tostring()
        log($fileWatcherStartDate)
        log "Started file system watcher on $onFolder for $filter files.`r`n"
        return $fsWatcher
    }
    catch {
        handleError("Error starting file system watcher")
    }
}

作成イベントの登録

Function registerCreationEvent ($watcher) {
    log "Attempting to register creation event..."
    try {
        Register-ObjectEvent $watcher Created -SourceIdentifier FileCreated -Action {
            try {
                #Code to read from Excel file, create an output text file from the 
                #content, and move both to the specified working directory.
            }
            catch {
                handleError("Performing main action on individual file.")
            }
        }
        log "Event creation registered."
    }
    catch {
        handleError("Error registering creation event")
    }
}
5
jonnybot

ジョージによって、私はそれを持っていると思います!

最終的には、コンソールで最初に実行していた方法(つまり、 dot-sourcing )に戻りましたが、前に-Noexitフラグを追加しました。

プログラム:%SystemRoot%\syswow64\WindowsPowerShell\v1.0\powershell.exe

引数:-Noexit . D:\Scripts\myScript.ps1 \\otherserver\share\folder\subfolder\ \\server.domain.edu\D$\working_dir\ \\otherserver\share\folder\my_log.txt

3
jonnybot