web-dev-qa-db-ja.com

Get-ScheduledTaskコマンドがWindows Server 2008 R2で機能しない

名前に特定のパターンがあるスケジュールされたタスクを検索しようとしています。私の場合、スケジュールされたタスクの名前にこのパターン「ServiceNow」が含まれているはずです。このためにGet-ScheduledTaskコマンドを使用していますが、このコマンドはWindows Server 2008 R2では失敗します。

$taskPattern = "ServiceNow"
$taskDetails = Get-ScheduledTask | Where-Object {$_.TaskName -match $taskPattern  }
$taskName = $taskDetails.TaskName

このスクリプトはエラーで失敗します:

"Get-ScheduledTask:「Get-ScheduledTask」という用語は、コマンドレット、関数、スクリプトファイル、または操作可能なプログラムの名前として認識されません。名前のスペルを確認するか、パスが含まれているかどうか、パスが修正してもう一度お試しください。」

次に、「(taskname Date&Time State)」を与えるこのアプローチを試しましたが、出力からタスク名のみを抽出する方法がわかりません。

$taskPattern = "ServiceNow" 
$taskExists = schtasks /query | select-string -patt $taskPattern 
$taskExists

実際のタスク名を抽出するだけでWindows Server 2008 R2で機能させる方法を教えていただけますか?前もって感謝します

5
beginner

Windows 2012用に導入され、誰もバックポートしていないため、Windows 2008 R2ではGet-ScheduledTaskを取得できません。詳細は github のリンクを参照してください。

状況を最もよく表すコメントは次のとおりです。

こんにちは@dronkoff-このモジュールはPS 4.0でサポートされています。ただし、問題はPowerShellのバージョンにはありません。問題は、このリソースが依存するScheduledTasksモジュールがWindows Server 2008R2に組み込まれていないことです。 Windows Server 2012に最初に含まれていました。

これは、PowerShellモジュールの多くに当てはまります。古いバージョンのWindows(ネットワークなど)にはありません。奇妙な状況では、簡単な回避策があります。ただし、この場合、完全に書き直さないとリソースを変換してschtasks.exeを使用することは不可能であり、おそらく非常に不安定でバグの多いものになります(異なるschtasksのローカライズバージョンで発生する問題は言うまでもありません)。残念ながら、これが実際に発生することはありません(コミュニティの他の誰かがこれを行う方法についていくつかのアイデアを持っている場合を除きます)。

しかし、あなたは正しいです。これは、Windows Server 2008R2が現在サポートされていないことを言及する必要があります。

回避策

それを回避するには、正しいスイッチでschtaskを使用します。

例のようにMicrosoftフォルダーにある場合は、実行するだけです。

schtasks /tn \Microsoft\ServiceNow /query /fo LIST

出力:

Folder: \Microsoft
HostName:      XXXXXACL06
TaskName:      \Microsoft\ServiceNow
Next Run Time: 7/4/2018 8:16:22 AM
Status:        Ready
Logon Mode:    Interactive only

詳細が必要な場合は、/v(詳細)スイッチを使用できます。

schtasks /tn \Microsoft\ServiceNow /query /v > service_now_details.txt

Edit-パターンを見つける

検索するパターンのみがある場合は、追加のツールを使用して文字列を検索する必要があります。ウィンドウはネイティブでfindstr(またはSelect-String(short _sls)in powershell)をサポートします:

次に使用できるタスク名を見つけるには:

schtasks /query /fo LIST | findstr "ServiceNow"

またはワイルドチャーターでも

schtasks /query /fo LIST | findstr "ServiceNo*"

またはpowershell方法:

schtasks /query /fo LIST | sls 'ServiceNo*'

すべての場合の出力は次のようになります(私のタスクの名前はServiceNowなので):

TaskName: \Microsoft\ServiceNow

Edit2大文字と小文字の区別

大文字と小文字を区別しない文字列を検索する場合:findstrの場合、/Iを追加して、大文字と小文字を区別しないようにする必要があります。 powershellのselect-string(sls)は、本来は区別されません。

12
tukan

MSスクリプトギャラリーにはすばらしいスクリプトがあります Get-ScheduledTasks (サービス名の最後のSに注意してください)。これは、Windows Server 2003/Windows XPに遡る古いバージョンのWindowsで機能します。

これを作成して共有してくれた素晴らしいWarren F(別名Rambling Cookie Monster)に感謝します。

0
JohnLBevan