Fehler beim Ausführen des Powershell-Skripts im SQL Server-Agenten


9

Ich habe einen SQL-Job, der über den SQL Server-Agenten (Ausführen von SQL Server 2012 Enterprise) ausgeführt wird. Der letzte Schritt des Jobs besteht darin, eine Anwendung auszuführen, die sich auf einer Netzwerkfreigabe befindet. Leider kenne ich den Namen des Ordners, in dem sich die Anwendung befindet, nicht (der Ordner ist die Versionsnummer), daher verwende ich PowerShell, um ihn zu finden:

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

Wenn ich ein PowerShell-Fenster auf dem SQL Server öffne, funktioniert es einwandfrei. Wenn ich dies in SQL Server Agent ausführe, wird folgende Fehlermeldung angezeigt:

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

Ich dachte, es könnte ein Berechtigungsproblem sein, also habe ich versucht, SQL Server Agent unter meinen Anmeldeinformationen auszuführen (es ist ein Testserver, keine Produktion), aber ich erhalte immer noch den gleichen Fehler. Ich habe auch versucht, ein Netzwerklaufwerk anstelle von UNC-Pfaden dem freigegebenen Ordner zuzuordnen, aber der gleiche Fehler.

Kann jemand vorschlagen, wie ich mich mit diesem Ordner verbinden kann?

Antworten:


9

Ich glaube, Ihr Problem wird der SQLPSAnbieter sein. Da PowerShell-Schritte in SQL Server Agent Sie automatisch in den Kontext dieses Anbieters versetzen, funktionieren einige Befehle, die in Ihrer normalen Konsole funktionieren, nicht auf die gleiche Weise. Ein aufzuschreiben erfolgte hier mit Set-Location. Grundsätzlich müssen Sie SQLPSdem Anbieter mitteilen, den Sie verwenden möchten.

Ihr Code würde ungefähr so ​​aussehen:

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

Sie können den Rest auch in zwei Zeilen einschließen, wenn Sie möchten:


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

@ShawnMelton Was ist mit dem Ausführen von Powershell-Befehlen auf einem Remote-Server? dba.stackexchange.com/questions/83068/…
Marcello Miorelli

Wir hatten das gleiche Problem und haben festgestellt, dass cd c:beim Ausführen eines Skripts am Anfang des Skripts das Kontext- / Speicherortproblem behoben wurde. Dann funktionierten alle UNC-Pfade wie erwartet.
James Khoury

cd c:ist ein Alias ​​für die Verwendung Set-Location C:, es ist also der gleiche Befehl.

2

Die andere Alternative wäre, den Betriebssystembefehl zu verwenden und Powershell.exe c: /path/script.ps1 als Befehl anzugeben und Ihr Skript in script.ps1 zu speichern. Dadurch wird sichergestellt, dass die Betriebssystem-Powershell anstelle des Providers verwendet wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.