Agus mo mhodheolaíocht féin á cruthú agam chun cúltacaí a bhainistiú ar fhreastalaithe iomadúla MS-SQL, chaith mé go leor ama ag déanamh staidéir ar an meicníocht chun luachanna a rith i Powershell le linn cianghlaonna, agus mar sin tá meabhrúchán á scríobh agam dom féin ar eagla go mbeadh sé úsáideach do dhuine eile.
Mar sin, déanaimis tosú le script shimplí agus é a rith go háitiúil:
$exitcode = $args[0]
Write-Host 'Out to host.'
Write-Output 'Out to output.'
Write-Host ('ExitCode: ' + $exitcode)
Write-Output $exitcode
$host.SetShouldExit($exitcode)Chun scripteanna a rith, úsáidfidh mé an comhad CMD seo a leanas, ní chuirfidh mé san áireamh é gach uair:
@Echo OFF
PowerShell .TestOutput1.ps1 1
ECHO ERRORLEVEL=%ERRORLEVEL%Ar an scáileán feicfimid na rudaí seo a leanas:
Out to host.
Out to output.
ExitCode: 1
1
ERRORLEVEL=1
Anois, déanaimis an script chéanna a rith trí WSMAN (go cianda):
Invoke-Command -ComputerName . -ScriptBlock { &'D:sqlagentTestOutput1.ps1' $args[0] } -ArgumentList $args[0]Agus seo an toradh:
Out to host.
Out to output.
ExitCode: 2
2
ERRORLEVEL=0Go hiontach, tá Errorlevel imithe áit éigin, ach ní mór dúinn an luach a fháil ón script! Déanaimis iarracht an tógáil seo a leanas:
$res=Invoke-Command -ComputerName . -ScriptBlock { &'D:sqlagentTestOutput1.ps1' $args[0] } -ArgumentList $args[0]Tá sé seo níos suimiúla fós. Tá an teachtaireacht in Aschur imithe áit éigin:
Out to host.
ExitCode: 2
ERRORLEVEL=0Anois, mar chlaonadh lyrical, tabharfaidh mé faoi deara má scríobhann tú taobh istigh d’fheidhm Powershell Scríobh-Aschur nó díreach slonn gan é a shannadh d’athróg ar bith (agus go dtugann sé seo le tuiscint go hintuigthe aschur go dtí an cainéal Aschuir), ansin fiú agus tú ag rith go háitiúil, ní thaispeánfar aon rud ar an scáileán! Is iarmhairt é seo ar ailtireacht phíblíne powershell - tá a píblíne Aschuir féin ag gach feidhm, cruthaítear eagar dó, agus meastar go bhfuil gach rud a théann isteach ann mar thoradh ar fhorghníomhú na feidhme, cuireann an t-oibreoir Tuairisceáin an luach tuairisceáin leis an gcéanna. píblíne mar an eilimint dheireanach agus aistríonn sé rialú chuig an bhfeidhm glaonna. Mar léiriú, rithfimid an script seo a leanas go háitiúil:
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: "+$_) }
Agus seo é an toradh:
Main: ParameterValue
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
2
Main: Function: ParameterValue
Main: ReturnValueTá a phíblíne Aschuir féin ag an bpríomhfheidhm (comhlacht scripte), agus má ritheann muid an chéad script ó CMD, an t-aschur a atreorú chuig comhad,
PowerShell .TestOutput1.ps1 1 > TestOutput1.txt
ansin feicfimid ar an scáileán
ERRORLEVEL=1agus sa chomhad
Out to host.
Out to output.
ExitCode: 1
1
má dhéanaimid glao cosúil ó powershell
PS D:sqlagent> .TestOutput1.ps1 1 > TestOutput1.txtansin beidh sé ar an scáileán
Out to host.
ExitCode: 1agus sa chomhad
Out to output.
1Tarlaíonn sé seo toisc go seolann an CMD powershell, a mheascann, in éagmais treoracha eile, dhá shnáithe (Óstríomhaire agus Aschur) agus a thugann chuig an CMD iad, a sheolann gach rud a fuair sé chuig comhad, agus i gcás seolta ó powershell, tá an dá shnáithe seo ann ar leithligh, agus ní dhéanann na hathsheolaidh siombailí ach difear don Aschur.
Ag filleadh ar an ábhar is mó, in iúl dúinn cuimhneamh go bhfuil an tsamhail réad .NET taobh istigh powershell ann go hiomlán laistigh de ríomhaire amháin (OS amháin), nuair a rith cód go cianda trí WSMAN, aistrítear réada trí sraithiú XML, a thugann a lán suime sa bhreis. dár dtaighde. Leanaimis lenár dturgnaimh tríd an gcód seo a leanas a rith:
$res=Invoke-Command -ComputerName . -ScriptBlock { &'D:sqlagentTestOutput1.ps1' $args[0] } -ArgumentList $args[0]
$res.GetType()
$host.SetShouldExit($res)
Agus seo an méid atá againn ar an scáileán:
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=0Toradh iontach! Ciallaíonn sé, nuair a ghlaonn tú Invoke-Command, go ndéantar na píblínte a roinnt ina dhá shnáithe (Óstach agus Aschur), rud a thugann dóchas dúinn go n-éireoidh linn. Déanaimis iarracht gan ach luach amháin a fhágáil sa sruth Aschuir, a n-athróimid an chéad script a rithfimid go cianda:
$exitcode = $args[0]
Write-Host 'Out to host.'
#Write-Output 'Out to output.'
Write-Host ('ExitCode: ' + $exitcode)
Write-Output $exitcode
$host.SetShouldExit($exitcode)
Déanaimis é a rith mar seo:
$res=Invoke-Command -ComputerName . -ScriptBlock { &'D:sqlagentTestOutput1.ps1' $args[0] } -ArgumentList $args[0]
$host.SetShouldExit($res)
agus... TÁ, is cosúil le bua!
Out to host.
ExitCode: 4
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Int32 System.ValueType
ERRORLEVEL=4Déanaimis iarracht a dhéanamh amach cad a tharla. D'iarramar powershell go háitiúil, rud a ghlaoigh powershell ar an gcianríomhaire agus rinneamar ár script ansin. Rinneadh dhá shruth (Óst agus Aschur) ón gcian-mheaisín a shraithiú agus a thabhairt ar ais, agus aistríodh an sruth Aschuir, a bhfuil luach aonair digiteach aige ann, go cineál Int32 agus mar sin aistríodh go dtí an taobh glactha é, agus d'úsáid an taobh glactha é. mar chód scoir an ghlaoiteora powershell.
Agus mar sheiceáil dheiridh, cruthaímis freastalaí Tasc SQL aonchéime de chineál "Córas Oibriúcháin (cmdexec)" leis an téacs seo a leanas:
PowerShell -NonInteractive -NoProfile "$res=Invoke-Command -ComputerName BACKUPSERVER -ConfigurationName SQLAgent -ScriptBlock {&'D:sqlagentTestOutput1.ps1' 6}; $host.SetShouldExit($res)"HÚIR! Críochnaíodh an tasc le hearráid, téacs sa loga:
Выполняется от имени пользователя: DOMAINagentuser. Out to host. ExitCode: 6. Код завершения процесса 6. Шаг завершился с ошибкой.
Conclúidí:
- Seachain úsáid Scríobh-Aschur agus sonraigh nathanna gan sannadh. Bíodh a fhios agat go bhféadfadh torthaí gan choinne a bheith ag gluaiseacht an chóid seo áit éigin eile sa script.
- I scripteanna nach bhfuil beartaithe le seoladh láimhe, ach le húsáid i do mheicníochtaí uathoibrithe, go háirithe le haghaidh cianghlaonna trí WINRM, déan láimhseáil earráidí trí Try/Catch, agus cinntigh, agus imeachtaí á bhforbairt, go seolann an script seo luach cineál primitive amháin . Más mian leat an clasaiceach Errorlevel a fháil, caithfidh an luach seo a bheith uimhriúil.
Foinse: will.com
