2017-04-05 3 views
0

Ich versuche invoke-Async zu verwenden, um ein SQL-Skript auf mehreren SQL-Servern bereitzustellen.Invoke-Async zum Bereitstellen von SQL-Skript auf mehreren Servern.

Der Invoke-Async-Code ist here. Das Skript verwendet invoke-sqlcmd2, dessen Code here ist.

Der folgende non-sql-server-code funktioniert.

$sb = [scriptblock] {param($system) gwmi win32_operatingsystem -ComputerName $system | select csname,caption} 
$servers = 'Server1', 'Server2', 'Server3', 'Server4' 
$rtn = Invoke-Async -Set $servers -SetParam system -ScriptBlock $sb 
$rtn 

Ich habe den Code ein bisschen (unten) für den SQL-Server optimiert. Funktioniert nicht. Offensichtlich vermisse ich etwas. Jede Hilfe wird sehr geschätzt. Vielen Dank.

$sb = [scriptblock] {param($system) Invoke-SQLCmd2 -ServerInstance $system -ServerInstance 'select name from sys.databases' } 
$servers = 'Server1', 'Server2', 'Server3', 'Server4' 
$rtn = Invoke-Async -Set $servers -SetParam system -ScriptBlock $sb 
$rtn 
+0

Es gibt keinen Standardbefehl für Powershell Invoke-Async. Aber es gibt eine Funktion zur Verfügung. Sie sollten den Fehler erhalten, dass Invoke-Async nicht als Cmdlet erkannt wird. Bitte posten Sie den Fehler –

+0

Ich habe bereits eine Kopie von invoke-sync heruntergeladen, wie ich in meinem Beitrag erwähnt habe. Ich erhalte die Ausnahme "Invoke-Async wird nicht als Cmdlet erkannt". Ich kann Invoke-sqlcmd2 mit Invoke-sync nur nicht verwenden. Funktioniert Invoke-Async für Sie mit invoke-sqlcmd2? – RaviLobo

+0

Invoke-sqlcmd2 ist auch eine externe Funktion, die standardmäßig nicht vorhanden ist. Wenn Sie sie verwenden möchten, dann setzen Sie die gesamte Funktionsdefinition in den Skriptblock und rufen Sie sie –

Antwort

1

Dies ist sehr einfach. Da Sie Zeilen zurückgeben. Verwenden Sie einfach invoke-sqlcmd .. Nicht sicher, ob Invoke-Async Tabellen bei Verwendung von Invoke-sqlcmd2 -As DataTable zurückgibt.

 $sb = [scriptblock] {param($system) Invoke-Sqlcmd -ServerInstance $system -query 'select name from sys.databases' } 
     $servers = 'Server1', 'Server2', 'Server3' 
     $rtn = Invoke-Async -Set $servers -SetParam system -ScriptBlock $sb -Verbose  
     $rtn 
+0

Danke Rahim, das hat funktioniert. Hier sind die Dinge, die ich gelernt habe. 1. Ich hätte Invoke-SQLCMD (anstelle von invoke-sqlcmd2) 2. Ich verwendet -SERVERINSTANCE zweimal in meinem Beispiel. Das war ein Typ. Der zweite sollte -QUERY sein. – RaviLobo

Verwandte Themen