Windows Server 2008 R2でスケジュールされたタスクとして3つの引数を取る32ビットPowerShellスクリプトを実行する必要があります。スクリプトはFileSystemWatcherを起動するので、新しいファイルを取得し続けることができるように、スクリプトを存続させる必要があります。
スキミングしている場合は、以下の「引数」の下にあるものを確認する必要があります。
Windows Server 2008R2ボックスのx86PowerShellコンソールから正常に実行されるPowerShellスクリプトを作成しました。 FileSystemWatcherを作成し、ファイル作成イベントのアクションを登録します。監視を続けるにはFileSystemWatcherが必要なので、スクリプトが実行された直後に終了するのではなく、PowerShellを実行し続ける必要があります。
スクリプトは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"
スクリプトはコンソールで機能するため、問題はコード自体にあるのではないと確信しています。それでも、コードを見ないと満足できない人のために、スクリプト自体からいくつかの関連部分があります。 :)
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")
}
}
ジョージによって、私はそれを持っていると思います!
最終的には、コンソールで最初に実行していた方法(つまり、 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