web-dev-qa-db-ja.com

SQL ServerエージェントでのPowershellスクリプトの実行エラー

SQL Serverエージェント(SQL Server 2012 Enterpriseの実行)を介して実行されるSQLジョブがあります。ジョブの最後のステップは、ネットワーク共有にあるアプリケーションを実行することです。残念ながら、アプリケーションが入っているフォルダーの名前(フォルダーはバージョン番号です)がわからないので、PowerShellを使用して検索します。

set-location "\\server\companydocuments\MyApp\Application Files\"
$name = Get-ChildItem | sort name -desc | select -f 1 | select name
cd $name.name
& ".\Application.exe"

SQL ServerでPowerShellウィンドウを開くと、正常に動作します。 SQL Serverエージェントでこれを実行すると、次のエラーが発生します。

A job step received an error at line 1 in a PowerShell script.
The corresponding line is 'set-location "\\server\companydocuments\MyApp\Application Files\'"

アクセス許可の問題かもしれないと思ったので、資格情報(運用サーバーではなくテストサーバー)でSQL Serverエージェントを実行してみましたが、それでも同じエラーが発生します。 UNCパスの代わりに共有ドライブにネットワークドライブをマッピングしようとしましたが、同じエラーが発生しました。

誰でも私がこのフォルダに接続する方法を提案できますか?

9
Greg

あなたの問題はSQLPSプロバイダーになると思います。 SQL ServerエージェントでのPowerShellステップにより、自動的にそのプロバイダーのコンテキストに入るので、通常のコンソールで機能する一部のコマンドは同じように機能しません。書き込みが行われました here with Set-Location。基本的には、使用するプロバイダーをSQLPSに通知する必要があります。

コードは次のようになります。

set-location -Path Microsoft.PowerShell.Core\FileSystem::"\\server\companydocuments\MyApp\Application Files\"

必要に応じて、残りを2行にラップすることもできます。


cd (Get-ChildItem | Sort-Object name -Descending | Select name -First 1).name
& ".\Application.exe"
9
user507

もう1つの方法は、オペレーティングシステムコマンドを使用して、powershell.exe c:/path/script.ps1をコマンドとして指定し、スクリプトをscript.ps1に保存することです。これにより、プロバイダーを使用する代わりにOS powershellを使用できるようになります。

2
Ketan