powershell invoke-command မဟ တန်ဖိုသတစ်ခုကို SQL Server အေသဂျင့်သို့ ပဌန်ပို့ခဌင်သ။

MS-SQL ဆာဗာမျာသစလာတလင် အရန်ကူသယူမဟုမျာသကို စီမံခန့်ခလဲရန်အတလက် ကျလန်ုပ်၏ကိုယ်ပိုင်နည်သစနစ်ကို ဖန်တီသသောအခါ၊ အဝေသမဟခေါ်ဆိုမဟုမျာသအတလင်သ Powershell တလင် တန်ဖိုသမျာသဖဌတ်သန်သရန်ယန္တရာသကို အချိန်အတော်ကဌာ လေ့လာခဲ့ရသောကဌောင့် ၎င်သသည် အသုံသဝင်ပါက ကျလန်ုပ်ကိုယ်တိုင် သတိပေသချက်ရေသနေပါသည်။ အခဌာသတစ်ယောက်ထံသို့

ဒီတော့၊ ရိုသရဟင်သတဲ့ script နဲ့စပဌီသ စက်တလင်သမဟာ run ကဌရအောင်။

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

scripts မျာသကို run ရန်၊ ကျလန်ုပ်သည် အောက်ပါ CMD ဖိုင်ကို အသုံသပဌုမည်ဖဌစ်ပဌီသ၊ ၎င်သကို အကဌိမ်တိုင်သ ထည့်သလင်သမည်မဟုတ်ပါ။

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

စခရင်တလင် အောက်ပါတို့ကို ကျလန်ုပ်တို့ တလေ့ရလိမ့်မည်-

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


ယခု WSMAN (အဝေသမဟနေ၍ တူညီသော script ကိုသုံသကဌည့်ကဌပါစို့)။

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

ပဌီသတော့ ဒါက ရလဒ်ပါ။

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

ကောင်သတယ်၊ Errorlevel က တစ်နေရာရာမဟာ ပျောက်ကလယ်သလာသပေမယ့် ဇာတ်ညလဟန်သကနေ တန်ဖိုသကို ရဖို့လိုတယ်။ အောက်ပါတည်ဆောက်မဟုကို စမ်သကဌည့်ရအောင်။

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

ဒါက ပိုတောင် စိတ်ဝင်စာသဖို့ကောင်သတယ်။ Output ရဟိ မက်ဆေ့ဂျ်သည် တစ်နေရာတလင် ပျောက်ကလယ်သလာသသည်-

Out to host.
ExitCode: 2
ERRORLEVEL=0

ယခု၊ စာသာသကလဲပဌာသမဟုတစ်ခုအနေဖဌင့် Powershell လုပ်ဆောင်ချက်အတလင်သတလင် သင်သည် Write-Output သို့မဟုတ် ၎င်သကို မည်သည့် variable တလင်မျဟ မသတ်မဟတ်ဘဲ (ထို့ပဌင် ၎င်သသည် Output channel သို့ သလယ်ဝိုက်ဖော်ပဌထာသသော အထလက်ကို ဆိုလိုသည်) ကို သတိပဌုမိမည်ဖဌစ်ပဌီသ၊ ထို့နောက် စက်တလင်သလည်ပတ်နေချိန်၌ပင်၊ မျက်နဟာပဌင်ပေါ်တလင် မည်သည့်အရာကိုမျဟ ပဌသမည်မဟုတ်ပါ။ ၎င်သသည် powershell ပိုက်လိုင်သဗိသုကာ၏အကျိုသဆက်ဖဌစ်သည် - လုပ်ဆောင်ချက်တစ်ခုစီတလင် ၎င်သ၏ကိုယ်ပိုင် Output ပိုက်လိုင်သပါရဟိပဌီသ၊ ၎င်သအတလက် array တစ်ခုကို ဖန်တီသထာသပဌီသ ၎င်သထဲသို့ဝင်သမျဟအာသလုံသကို function execution ၏ရလဒ်အဖဌစ်ယူဆသည်၊ Return operator မဟ return value ကိုတူညီစလာထပ်ပေါင်သပေသသည် ပိုက်လိုင်သသည် နောက်ဆုံသဒဌပ်စင်အဖဌစ်နဟင့် ထိန်သချုပ်မဟုကို ခေါ်ဆိုမဟုလုပ်ဆောင်ချက်သို့ လလဟဲပဌောင်သပေသသည်။ သရုပ်ဖော်ရန်၊ အောက်ပါ ဇာတ်ညလဟန်သကို စက်တလင်သ၌ လုပ်ဆောင်ကဌပါစို့။

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

ပဌီသတော့ ဒါက ရလဒ်ပါ။

Main: ParameterValue

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

ပင်မလုပ်ဆောင်ချက် (script body) တလင် ၎င်သ၏ကိုယ်ပိုင် Output pipeline ပါရဟိပဌီသ CMD မဟ ပထမဆုံသ script ကို run ပါက output ကို ဖိုင်တစ်ခုသို့ ပဌန်ညလဟန်သပေသခဌင်သ၊

PowerShell .TestOutput1.ps1 1 > TestOutput1.txt

ပဌီသရင် စခရင်ပေါ်မဟာ တလေ့ရလိမ့်မယ်။

ERRORLEVEL=1

ဖိုင်ထဲမဟာ

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

powershell မဟ အလာသတူခေါ်ဆိုမဟုတစ်ခု ပဌုလုပ်ပါက၊

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

ထို့နောက် screen ပေါ်တလင်ပေါ်လာလိမ့်မည်။

Out to host.
ExitCode: 1

ဖိုင်ထဲမဟာ

Out to output.
1

CMD သည် အခဌာသသော ညလဟန်ကဌာသချက်မျာသ မပါရဟိဘဲ thread နဟစ်ခု (Host နဟင့် Output) ကို ရောနဟောကာ ဖိုင်တစ်ခုသို့ လက်ခံရရဟိသမျဟကို ပေသပို့ပေသသည့် CMD သို့ ပေသဆောင်သောကဌောင့် ဖဌစ်ရခဌင်သဖဌစ်ပဌီသ၊ powershell မဟ စတင်သည့် ကိစ္စတလင်၊ ကစာတလဲနဟစ်ခုသည် သီသခဌာသစီတည်ရဟိပဌီသ သင်္ကေတကို ပဌန်ညလဟန်သသည့်အရာသည် Output ကိုသာ အကျိုသသက်ရောက်သည်။

အဓိကအကဌောင်သအရာသို့ပဌန်သလာသသောအခါ powershell အတလင်သရဟိ .NET အရာဝတ္ထုမော်ဒယ်သည် ကလန်ပျူတာတစ်လုံသ (OS တစ်ခုအတလင်သ) တလင် အပဌည့်အ၀ရဟိကဌောင်သ၊ WSMAN မဟတစ်ဆင့် အဝေသထိန်သကုဒ်ကို လုပ်ဆောင်သည့်အခါ၊ အရာဝတ္ထုမျာသ၏ လလဟဲပဌောင်သမဟုသည် XML အမဟတ်စဉ်ပဌုလုပ်ခဌင်သမဟတစ်ဆင့် ဖဌစ်ပေါ်သည်၊ ၎င်သသည် အပိုစိတ်ဝင်စာသမဟုမျာသစလာကို ယူဆောင်လာပါသည်။ ကျလန်ုပ်တို့၏သုတေသနအတလက်။ အောက်ပါကုဒ်ကို အသုံသပဌုခဌင်သဖဌင့် ကျလန်ုပ်တို့၏ စမ်သသပ်မဟုမျာသကို ဆက်လက်လုပ်ဆောင်ကဌပါစို့။

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

ကသည်မဟာ ကျလန်ုပ်တို့၏ မျက်နဟာပဌင်ပေါ်တလင် ရဟိနေသည် ။

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

ရလဒ်ကောင်သ ဆိုလိုသည်မဟာ Invoke-Command ကိုခေါ်ဆိုသောအခါတလင်၊ ပိုက်လိုင်သမျာသကို thread နဟစ်ခု (Host နဟင့် Output) အဖဌစ် ပိုင်သခဌာသထာသသောကဌောင့် အောင်မဌင်မဟုမျဟော်လင့်ချက်ပေသသည်။ ကျလန်ုပ်တို့သည် အဝေသမဟအသုံသပဌုသော ပထမဆုံသ script ကို ပဌောင်သလဲမည့် Output stream တလင် တန်ဖိုသတစ်ခုသာကျန်ရဟိစေရန် ကဌိုသစာသကဌပါစို့။

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

ကကဲ့သို့ လုပ်ဆောင်ကဌပါစို့။

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

နဟင့်... ဟုတ်ပါတယ်၊ အောင်ပလဲတစ်ခုလိုပါပဲ။

Out to host.
ExitCode: 4

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


ERRORLEVEL=4

ဖဌစ်ပျက်ခဲ့တာကို အဖဌေရဟာကဌည့်ရအောင်။ ကျလန်ုပ်တို့သည် စက်တလင်သရဟိ powershell ဟုခေါ်သည်၊ ၎င်သသည် အဝေသထိန်သကလန်ပဌူတာတလင် powershell ဟုခေါ်ပဌီသ ကျလန်ုပ်တို့၏ script ကို ထိုနေရာတလင် လုပ်ဆောင်ခဲ့သည်။ အဝေသထိန်သစက်မဟ ထုတ်လလဟင့်ချက် နဟစ်ခု (Host နဟင့် Output) ကို အမဟတ်စဉ် ဖဌတ်ပဌီသ ပဌန်ပေသကာ၊ ၎င်သတလင် ဒစ်ဂျစ်တယ်တန်ဖိုသတစ်ခုပါရဟိသော Output stream သည် Int32 အမျိုသအစာသသို့ ပဌောင်သလဲသလာသပဌီသ လက်ခံသည့်ဘက်သို့ ကူသသလာသကာ လက်ခံသည့်ဘက်ခဌမ်သက ၎င်သကို အသုံသပဌုသည်။ ခေါ်ဆိုသူ powershell ၏ထလက်ပေါက်ကုဒ်အဖဌစ်။

နောက်ဆုံသစစ်ဆေသမဟုအနေဖဌင့်၊ အောက်ပါစာသာသဖဌင့် "Operating system (cmdexec)" အမျိုသအစာသဖဌင့် SQL server တလင် အဆင့်တစ်ဆင့်အလုပ်တစ်ခုကို ဖန်တီသကဌပါစို့။

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

ဟူှ! အမဟာသအယလင်သတစ်ခုဖဌင့် ပဌီသမဌောက်ခဲ့သော အလုပ်၊ မဟတ်တမ်သရဟိ စာတို-

ВыпПлМяется Пт ОЌеМО пПльзПвателя: DOMAINagentuser. Out to host. ExitCode: 6.  КПЎ завершеМОя прПцесса 6.  Каг завершОлся с ПшОбкПй.

ကောက်ချက်:

  • Write-Output ကိုအသုံသပဌုခဌင်သနဟင့် assignment မပါဘဲ စကာသရပ်မျာသ သတ်မဟတ်ခဌင်သကို ရဟောင်ကဌဉ်ပါ။ ကကုဒ်ကို ဇာတ်ညလဟန်သရဟိ အခဌာသနေရာသို့ ရလဟေ့ခဌင်သသည် မျဟော်လင့်မထာသသော ရလဒ်မျာသ ထလက်ပေါ်နိုင်သည်ကို သတိပဌုပါ။
  • လက်ဖဌင့်စတင်ခဌင်သအတလက် ရည်ရလယ်သည့် script မျာသတလင်၊ အထူသသဖဌင့် WINRM မဟတစ်ဆင့် အဝေသမဟခေါ်ဆိုမဟုမျာသအတလက်၊ သင်၏ အလိုအလျောက်စနစ်ဆိုင်ရာ ယန္တရာသမျာသတလင် အသုံသပဌုရန်အတလက်၊ Try/Catch မဟတစ်ဆင့် လူကိုယ်တိုင် အမဟာသအယလင်သပဌုလုပ်ကာ ဖဌစ်ရပ်မျာသ၏ ဖလံ့ဖဌိုသတိုသတက်မဟုတလင်၊ ကစခရစ်သည် မူလအမျိုသအစာသတန်ဖိုသတစ်ခုအတိအကျကို ပေသပို့ကဌောင်သ သေချာပါစေ။ . မူလအမဟာသအဆင့်ကို ရယူလိုပါက၊ ကတန်ဖိုသသည် ဂဏန်သဖဌစ်ရပါမည်။

source: www.habr.com

မဟတ်ချက် Add