Pada iye kan pada lati ipepe-aṣẹ agbara si aṣoju olupin SQL

Nigbati o ba ṣẹda ilana ti ara mi fun ṣiṣakoso awọn afẹyinti lori ọpọlọpọ awọn olupin MS-SQL, Mo lo akoko pupọ ni kikọ ilana fun gbigbe awọn iye kọja ni Powershell lakoko awọn ipe latọna jijin, nitorinaa Mo n kọ olurannileti si ara mi ni ọran ti o wulo si elomiran.

Nitorinaa, jẹ ki a bẹrẹ pẹlu iwe afọwọkọ ti o rọrun ati ṣiṣe ni agbegbe:

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

Lati ṣiṣẹ awọn iwe afọwọkọ, Emi yoo lo faili CMD atẹle, Emi kii yoo pẹlu rẹ ni gbogbo igba:

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

Lori iboju a yoo ri awọn wọnyi:

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


Bayi jẹ ki a ṣiṣẹ iwe afọwọkọ kanna nipasẹ WSMAN (latọna jijin):

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

Ati pe eyi ni abajade:

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

Nla, Errorlevel ti sọnu ni ibikan, ṣugbọn a nilo lati gba iye lati inu iwe afọwọkọ naa! Jẹ ki a gbiyanju apẹrẹ wọnyi:

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

Eleyi jẹ ani diẹ awon. Ifiranṣẹ inu Ijade ti sọnu ni ibikan:

Out to host.
ExitCode: 2
ERRORLEVEL=0

Bayi, bi digression lyrical, Emi yoo ṣe akiyesi pe ti inu iṣẹ Powershell kan o kọ Kọ-jade tabi o kan ikosile laisi fifisilẹ si eyikeyi oniyipada (ati pe eyi tumọ si iṣelọpọ si ikanni Ijade), lẹhinna paapaa nigba ṣiṣe ni agbegbe, ko si ohun ti yoo han loju iboju! Eyi jẹ abajade ti faaji opo gigun ti agbara - iṣẹ kọọkan ni opo gigun ti o wu jade, a ṣẹda akojọpọ fun rẹ, ati pe ohun gbogbo ti o lọ sinu rẹ ni abajade ti ipaniyan iṣẹ naa, oniṣẹ ipadabọ ṣe afikun iye ipadabọ si kanna. opo gigun bi nkan ti o kẹhin ati gbigbe iṣakoso si iṣẹ pipe. Lati ṣapejuwe, jẹ ki a ṣiṣẹ iwe afọwọkọ atẹle ni agbegbe:

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: "+$_) }

Ati pe eyi ni abajade:

Main: ParameterValue

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

Iṣẹ akọkọ (ara iwe afọwọkọ) tun ni opo gigun ti o jade, ati pe ti a ba ṣiṣẹ iwe afọwọkọ akọkọ lati CMD, ti n ṣe atunṣe abajade si faili kan,

PowerShell .TestOutput1.ps1 1 > TestOutput1.txt

lẹhinna a yoo rii loju iboju

ERRORLEVEL=1

ati ninu faili

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

ti a ba ṣe iru ipe lati powershell

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

lẹhinna o yoo wa loju iboju

Out to host.
ExitCode: 1

ati ninu faili

Out to output.
1

Eyi ṣẹlẹ nitori CMD ṣe ifilọlẹ powershell, eyiti, ni laisi awọn ilana miiran, dapọ awọn okun meji (Olulejo ati Ijade) ati fifun wọn si CMD, eyiti o firanṣẹ ohun gbogbo ti o gba si faili kan, ati ni ọran ti ifilọlẹ lati agbara agbara, awọn okun meji wọnyi wa lọtọ, ati awọn àtúnjúwe aami yoo kan Ijade nikan.

Pada si koko akọkọ, jẹ ki a ranti pe awoṣe ohun elo .NET inu powershell ni kikun wa laarin kọnputa kan (OS OS kan), nigbati o nṣiṣẹ koodu latọna jijin nipasẹ WSMAN, gbigbe awọn nkan waye nipasẹ serialization XML, eyiti o mu ọpọlọpọ iwulo afikun. si iwadi wa. Jẹ ki a tẹsiwaju awọn idanwo wa nipa ṣiṣiṣẹ koodu atẹle:

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

Ati pe eyi ni ohun ti a ni loju iboju:

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

Abajade nla! O tumọ si pe nigba pipe Invoke-Command, pipin awọn opo gigun ti epo si awọn okun meji (Olulejo ati Ijade) ti wa ni itọju, eyiti o fun wa ni ireti fun aṣeyọri. Jẹ ki a gbiyanju lati fi iye kan silẹ ni ṣiṣan Ijade, fun eyiti a yoo yi iwe afọwọkọ akọkọ ti a ṣiṣẹ latọna jijin pada:

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

Jẹ ki a ṣiṣẹ bi eleyi:

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

ati... BẸẸNI, o dabi iṣẹgun!

Out to host.
ExitCode: 4

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


ERRORLEVEL=4

Jẹ ká gbiyanju lati ro ero ohun to sele. A pe powershell ni agbegbe, eyiti o jẹ pe a pe ni powershell lori kọnputa latọna jijin o si ṣiṣẹ iwe afọwọkọ wa nibẹ. Awọn ṣiṣan meji (Olugbalejo ati Ijade) lati ẹrọ latọna jijin ni a ṣe lẹsẹsẹ ati kọja sẹhin, lakoko ti ṣiṣan Ijade, ti o ni iye oni-nọmba kan ninu rẹ, ti yipada si iru Int32 ati bii iru kọja si ẹgbẹ gbigba, ati ẹgbẹ gbigba lo o. bi koodu ijade ti agbara olupe.

Ati bi ayẹwo ikẹhin, jẹ ki a ṣẹda iṣẹ-igbesẹ kan lori olupin SQL pẹlu iru “Eto iṣẹ (cmdexec)” pẹlu ọrọ atẹle:

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

HOORAY! Iṣẹ-ṣiṣe ti pari pẹlu aṣiṣe, ọrọ ninu akọọlẹ:

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

Awọn ipinnu:

  • Yago fun lilo Kọ-Ijade ati sisọ awọn ọrọ asọye laisi iṣẹ iyansilẹ. Ṣe akiyesi pe gbigbe koodu yii si ibomiiran ninu iwe afọwọkọ le ṣe awọn abajade airotẹlẹ.
  • Ninu awọn iwe afọwọkọ ti a pinnu kii ṣe fun ifilọlẹ afọwọṣe, ṣugbọn fun lilo ninu awọn ọna adaṣe adaṣe rẹ, pataki fun awọn ipe latọna jijin nipasẹ WINRM, ṣe mimu aṣiṣe afọwọṣe nipasẹ Gbiyanju/Catch, ati rii daju pe, ni eyikeyi idagbasoke ti awọn iṣẹlẹ, iwe afọwọkọ yii n firanṣẹ ni deede iru iru atijo kan pato. . Ti o ba fẹ gba Aṣiṣe Ayebaye, iye yii gbọdọ jẹ nomba.

orisun: www.habr.com

Fi ọrọìwòye kun