windows - কিভাবে প্রথম ত্রুটি একটি PowerShell স্ক্রিপ্ট বন্ধ?



(4)

যখন আমি যে কোনও কমান্ড চালাতে ব্যর্থ হব তখন আমার পাওয়ারশেল স্ক্রিপ্ট থামাতে চাই। আমি Powershell কমান্ড ( New-Object System.Net.WebClient ) এবং প্রোগ্রাম ( .\setup.exe ) উভয় ব্যবহার করছি।

https://ffff65535.com


@ এলাস্টারট্রি থেকে answer সামান্য পরিবর্তন:

function Invoke-Call {
    param (
        [scriptblock]$ScriptBlock,
        [string]$ErrorAction = $ErrorActionPreference
    )
    & @ScriptBlock
    if (($lastexitcode -ne 0) -and $ErrorAction -eq "Stop") {
        exit $lastexitcode
    }
}

Invoke-Call -ScriptBlock { dotnet build . } -ErrorAction Stop

এখানে কী পার্থক্য রয়েছে:

  1. এটি Verb-Noun ব্যবহার করে ( Invoke-Command অনুকরণ)
  2. এটি কভার অধীনে কল অপারেটর ব্যবহার করে বোঝায়
  3. cmdlets মধ্যে নির্মিত থেকে mimics -ErrorAction আচরণ
  4. নতুন বার্তা দিয়ে ব্যতিক্রম নিক্ষেপ করার পরিবর্তে একই প্রস্থান কোড দিয়ে প্রস্থান করে

আপনি আপনার স্ক্রিপ্টের শুরুতে $ErrorActionPreference = "Stop" স্টেটমেন্টটি ব্যবহার করে এটি সম্পাদন করতে সক্ষম হওয়া উচিত।

$ErrorActionPreference এর ডিফল্ট সেটিংটি Continue , সেই কারণে আপনি আপনার স্ক্রিপ্টগুলিকে ত্রুটিগুলির পরে চলতে দেখছেন।


দুঃখজনকভাবে, নিউ-রেজিকি এবং ক্লিয়ার-ডিস্কের মতো বাগি cmdlets এর কারণে , এইগুলির কোনও উত্তর যথেষ্ট নয়। আমি বর্তমানে আমার স্যানিটি বজায় রাখার জন্য কোনও পাওয়ারশেল স্ক্রিপ্টের শীর্ষে নিম্নলিখিত লাইনগুলিতে বসতি স্থাপন করেছি।

Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"
$PSDefaultParameterValues['*:ErrorAction']='Stop'

এবং তারপর কোন নেটিভ কল এই চিকিত্সা পায়:

native_call.exe
$native_call_success = $?
if (-not $native_call_success)
{
    throw 'error making native call'
}

যে নেটিভ কল প্যাটার্ন ধীরে ধীরে আমার জন্য যথেষ্ট সাধারণ হয়ে উঠছে যে আমি সম্ভবত এটি আরো সংক্ষিপ্ত করতে বিকল্পগুলিতে তাকান উচিত। আমি এখনও একটি ক্ষমতাশালী নবাগত নই, তাই পরামর্শ স্বাগত জানাই।


পাওয়ারশেল ফাংশনগুলির জন্য এবং Exe এর কল করার জন্য আপনাকে সামান্য ভিন্ন ত্রুটি হ্যান্ডলিং প্রয়োজন, এবং আপনার স্ক্রিপ্টটির কলকারীকে এটি ব্যর্থ হওয়ার বিষয়ে নিশ্চিত করতে হবে। লাইব্রেরী সাইক থেকে এক্সেকের উপরে বিল্ডিং, নিচের কাঠামোটি একটি স্ক্রিপ্ট যা সব ত্রুটিগুলিতে থামবে এবং সর্বাধিক স্ক্রিপ্টগুলির জন্য বেস টেমপ্লেট হিসাবে ব্যবহারযোগ্য।

Set-StrictMode -Version latest
$ErrorActionPreference = "Stop"


# Taken from psake https://github.com/psake/psake
<#
.SYNOPSIS
  This is a helper function that runs a scriptblock and checks the PS variable $lastexitcode
  to see if an error occcured. If an error is detected then an exception is thrown.
  This function allows you to run command-line programs without having to
  explicitly check the $lastexitcode variable.
.EXAMPLE
  exec { svn info $repository_trunk } "Error executing SVN. Please verify SVN command-line client is installed"
#>
function Exec
{
    [CmdletBinding()]
    param(
        [Parameter(Position=0,Mandatory=1)][scriptblock]$cmd,
        [Parameter(Position=1,Mandatory=0)][string]$errorMessage = ("Error executing command {0}" -f $cmd)
    )
    & $cmd
    if ($lastexitcode -ne 0) {
        throw ("Exec: " + $errorMessage)
    }
}

Try {

    # Put all your stuff inside here!

    # powershell functions called as normal and try..catch reports errors 
    New-Object System.Net.WebClient

    # call exe's and check their exit code using Exec
    Exec { setup.exe }

} Catch {
    # tell the caller it has all gone wrong
    $host.SetShouldExit(-1)
    throw
}




powershell