Rediens ad valorem ab SQL Servo agente ad invocationem-imperio SQL

Cum meam methodologiam meam creandi ad tergum gerendi in multiplicibus MS-SQL servientibus, multum temporis exegi studens mechanismum ad bona transitoria in Powershell in longinquis vocatis, ideo memoriam mihi scribo in casu utile. alicui.

Itaque cum scriptura simplici incipiamus et localiter curramus;

$exitcode = $args[0]
Write-Host 'Out to host.'
Write-Output 'Out to output.'
Write-Host ('ExitCode: ' + $exitcode)
Write-Output $exitcode
$host.SetShouldExit($exitcode)

Ad scripta currere, CMD sequenti fasciculo utar, ea non omni tempore comprehendam:

@Echo OFF
PowerShell .TestOutput1.ps1 1
ECHO ERRORLEVEL=%ERRORLEVEL%

In screen quae sequuntur videbimus:

Out to host.
Out to output.
ExitCode: 1
1
ERRORLEVEL=1


Nunc idem scriptum per WSMAN (remote);

Invoke-Command -ComputerName . -ScriptBlock { &'D:sqlagentTestOutput1.ps1' $args[0] } -ArgumentList $args[0]

Et hic est effectus;

Out to host.
Out to output.
ExitCode: 2
2
ERRORLEVEL=0

Magnus, Errorlevel alicubi evanuit, sed opus est ut valorem e scriptore accipiamus! Experiamur tali consilio:

$res=Invoke-Command -ComputerName . -ScriptBlock { &'D:sqlagentTestOutput1.ps1' $args[0] } -ArgumentList $args[0]

Hoc magis placet. Haec epistula in Output abiit in quodam loco:

Out to host.
ExitCode: 2
ERRORLEVEL=0

Nunc, ut lyrici digressio, notabo quod si intra functionem Powershell scribis Write-Output vel iustam expressionem sine assignando alicui variabili (quod implicite implicat output ad alveum Output), tunc etiam cum localiter currit; nihil in screen proponendum! Hoc consequitur architecturae organorum fistularum potentiarum - unumquodque munus suum habet Output pipeline, ordinatio pro eo creata est, et omne quod in eam ingreditur, consideratur effectus muneris exsecutionis, Reditus operator addit valorem reditus eidem. pipeline ut ultimum elementum et imperium ad munus vocationis transfert. Ad illustrandum, sequenti scripto localiter percurramus;

Function Write-Log {
  Param( [Parameter(Mandatory=$false, ValueFromPipeline=$true)] [String[]] $OutString = "`r`n" )
  Write-Output ("Function: "+$OutString)
  Return "ReturnValue"
}
Write-Output ("Main: "+"ParameterValue")
$res = Write-Log "ParameterValue"
$res.GetType()
$res.Length
$res | Foreach-Object { Write-Host ("Main: "+$_) }

Et hic est effectus;

Main: ParameterValue

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array
2
Main: Function: ParameterValue
Main: ReturnValue

Praecipuum munus (corpus script) etiam pipelineum suum Output habet, et si primum scriptum ab CMD curritur, output ad limam redigens;

PowerShell .TestOutput1.ps1 1 > TestOutput1.txt

tunc videbimus in screen

ERRORLEVEL=1

et in tabella

Out to host.
Out to output.
ExitCode: 1
1

si simile nomen powershell

PS D:sqlagent> .TestOutput1.ps1 1 > TestOutput1.txt

tunc erit in screen

Out to host.
ExitCode: 1

et in tabella

Out to output.
1

Hoc accidit quod CMD potestates infert, quae, absentibus aliis praeceptis, duo stamina (Host et Output) miscet et ea CMD dat, quae omnia ad fasciculum recipienda mittit, et in casu e potestatibus decurrentibus; haec duo stamina separatim exstant, et symbolum redirectum tantum output afficit.

Revertentes ad principale argumentum, meminerimus exemplar objectum .NET intra viressellorum plene in uno computatorio (unum OS), cum codice remoto per WSMAN currentem, translatio rerum occurrit per XML serializationem, quae multum interest additae. ad inquisitionem nostram. Experimenta nostra pergamus currendo in codice sequenti:

$res=Invoke-Command -ComputerName . -ScriptBlock { &'D:sqlagentTestOutput1.ps1' $args[0] } -ArgumentList $args[0]
$res.GetType()
$host.SetShouldExit($res)

Et hoc est quod habemus in velo;

Out to host.

ExitCode: 3

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array
Не удается преобразовать аргумент "exitCode", со значением: "System.Object[]", для "SetShouldExit" в тип "System.Int32": "Не удается преобразовать значение "System.Object[]" типа "System.Object[]" в тип "System
.Int32"."
D:sqlagentTestOutput3.ps1:3 знак:1
+ $host.SetShouldExit($res)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument

ERRORLEVEL=0

Consequuntur magni! Significat cum Invoke-Mand vocans, fistularum divisionem in duo fila (Host et Output) conservari, quod spem victoriae praebet. Studeamus unum tantum valorem relinquere in Output amnis, cuius primam scripturam ipsam quae remotius currimus mutabimus;

$exitcode = $args[0]
Write-Host 'Out to host.'
#Write-Output 'Out to output.'
Write-Host ('ExitCode: ' + $exitcode)
Write-Output $exitcode
$host.SetShouldExit($exitcode)

Sic curramus:

$res=Invoke-Command -ComputerName . -ScriptBlock { &'D:sqlagentTestOutput1.ps1' $args[0] } -ArgumentList $args[0]
$host.SetShouldExit($res)

et... VERO victoriae similis est!

Out to host.
ExitCode: 4

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Int32                                    System.ValueType


ERRORLEVEL=4

Experiamur ad instar quid acciderit. Powershell localiter appellavimus, quod vicissim in computatro remoto potentiashell appellavimus et scripturam nostram ibi executi sumus. Duo rivi (Host et Output) e machina remota serialized et recesserunt, dum Output amnis, unicum valorem digitalem habens in eo, conversus est ad typus Int32 et sic transivit ad latus recipiendum et latus recipiens usus est. ut exitus codicem RECENS Powershell.

Et ut finalis perscriptio, unum gradum officium in SQL server cum typo "ratio operandi (cmdexec)" crearemus cum sequenti textu:

PowerShell -NonInteractive -NoProfile "$res=Invoke-Command -ComputerName BACKUPSERVER -ConfigurationName SQLAgent -ScriptBlock {&'D:sqlagentTestOutput1.ps1' 6}; $host.SetShouldExit($res)"

EUGE! Negotium cum errore confecto, textus in sextario:

Выполняется от имени пользователя: DOMAINagentuser. Out to host. ExitCode: 6.  Код завершения процесса 6.  Шаг завершился с ошибкой.

conclusiones:

  • Fugientes Write-Output et specifica expressions sine assignatione. Scias me movens hunc codicem alibi in scriptione inopinatos eventus producere posse.
  • In scriptoribus destinatis non ad launch manualem, sed ad usum in machinationibus tuis automation, praesertim remotis vocatis per WINRM, manuali errore tractando per Experimentum/Capite, et ut in omni eventuum evolutione hoc scriptum mittat unum genus valorem primitivum. . Si vis classic Errorlevel, hic valor numericus esse debet.

Source: www.habr.com

Add a comment