web-dev-qa-db-fra.com

ERREUR Exécuter le script PowerShell dans l'agent SQL Server

J'ai un travail SQL qui fonctionne via SQL Server Agent (exécutant SQL Server 2012 Enterprise). La dernière étape du travail consiste à exécuter une application située sur une part de réseau. Malheureusement, je ne connais pas le nom du dossier que l'application est dans (le dossier est le numéro de version), alors j'utilise PowerShell pour le trouver:

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

Si j'ouvre une fenêtre PowerShell sur le serveur SQL, cela fonctionne bien. Lorsque j'exécute cela dans SQL Server Agent, j'obtiens l'erreur suivante:

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

Je pensais que cela pourrait être une question d'autorisations, donc j'ai essayé SQL Server Agent exécuté sous mes informations d'identification (c'est un serveur de test, pas une production) mais je reçois toujours la même erreur. J'ai également essayé de mapper un lecteur réseau dans le dossier partagé au lieu des chemins UNC, mais la même erreur.

Quelqu'un peut-il suggérer comment je peux vous connecter à ce dossier?

9
Greg

Je crois que votre problème va être le fournisseur SQLPS. Étant donné que les étapes PowerShell dans SQL Server Agent vous mettent automatiquement dans le contexte de ce fournisseur, certaines commandes qui fonctionnent dans votre console normale ne fonctionneront pas de la même manière. Une écriture a été faite ici avec Set-Location. Vous devez essentiellement dire SQLPS le fournisseur que vous souhaitez utiliser.

Votre code ressemblerait à quelque chose comme ci-dessous:

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

Vous pouvez également envelopper le reste en deux lignes si vous le souhaitez:


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

L'autre alternative serait d'utiliser la commande du système d'exploitation et de donner PowerShell.exe C: /path/script.ps1 comme commande et enregistrez votre script dans script.ps1. Cela garantira d'utiliser OS PowerShell au lieu d'utiliser un fournisseur.

2
Ketan