{"id":80,"date":"2023-12-02T11:15:54","date_gmt":"2023-12-02T11:15:54","guid":{"rendered":"http:\/\/www.mnwebdesign.nstrefa.pl\/mojapolska\/?p=80"},"modified":"2024-02-09T21:05:32","modified_gmt":"2024-02-09T21:05:32","slug":"funkcje-powershell-kluczowe-kroki-do-perfekcji","status":"publish","type":"post","link":"https:\/\/www.mnwebdesign.nstrefa.pl\/mojapolska\/funkcje-powershell-kluczowe-kroki-do-perfekcji\/","title":{"rendered":"Funkcje PowerShell: Kluczowe Kroki do Perfekcji"},"content":{"rendered":"\n<p>W dzisiejszym \u015bwiecie automatyzacji i programowania, pisanie funkcji w PowerShell staje si\u0119 nieod\u0142\u0105czn\u0105 cz\u0119\u015bci\u0105 pracy ka\u017cdego administratora systemu czy cloud in\u017cyniera. Aby jednak stworzy\u0107 efektywn\u0105 i \u0142atw\u0105 w u\u017cyciu funkcj\u0119, warto przestrzega\u0107 pewnych krok\u00f3w i zasad. W poni\u017cszym wpisie om\u00f3wimy dziesi\u0119\u0107 krok\u00f3w, kt\u00f3re pomog\u0105 Ci w tworzeniu funkcji PowerShell od podstaw. Od zdefiniowania celu po udost\u0119pnienie gotowego kodu &#8211; przewodnik ten poprowadzi Ci\u0119 przez ca\u0142y proces.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h3 class=\"wp-block-heading\">Krok 1: Zdefiniuj Jasny Cel<\/h3>\n\n\n\n<p>Zanim zaczniesz pisa\u0107 funkcj\u0119, dok\u0142adnie zastan\u00f3w si\u0119, jaki jest jej cel. Jakie zadanie lub zadania ma ona wykona\u0107? M\u00f3wi si\u0119, \u017ce dobry plan to po\u0142owa sukcesu, wi\u0119c przemy\u015bl swoj\u0105 funkcj\u0119 przed napisaniem pierwszych linii kodu.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Krok 2: Wybierz Zgodn\u0105 Nazw\u0119<\/h3>\n\n\n\n<p>Wybierz nazw\u0119 dla funkcji, kt\u00f3ra jasno odzwierciedla jej cel. Zaleca si\u0119 stosowanie konwencji czasownik-rzeczownik dla nazw funkcji w PowerShell. Na przyk\u0142ad <code>Get-MyData<\/code> lub <code>Invoke-Task<\/code>.<\/p>\n\n\n\n<pre lang=\"powershell\">function Get-AzDevOpsRepository {\n    [cmdletbinding()]\n}\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Krok 3: Zadeklaruj Parametry<\/h3>\n\n\n\n<p>Je\u015bli wystarczaj\u0105co du\u017co czasu sp\u0119dzi\u0142e\u015b w kroku 1 to dok\u0142adnie wiesz jakich danych potrzebujesz na wej\u015bciu, aby funkcja wykonania swoje zadania. U\u017cyj s\u0142owa kluczowego <code>param<\/code> do deklaracji parametr\u00f3w. <\/p>\n\n\n\n<p>Na przyk\u0142ad:<\/p>\n\n\n\n<pre lang=\"powershell\">function Get-AzDevOpsRepository {\n    [cmdletbinding()]\n    param(\n        $organizationName,\n        $projectName,\n        $token\n    )\n}\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Krok 4: Obs\u0142uguj Walidacj\u0119 Parametr\u00f3w<\/h3>\n\n\n\n<p>Je\u015bli masz zdefiniowane parametry, dodaj walidacj\u0119 warto\u015bci wej\u015bciowych, aby upewni\u0107 si\u0119, \u017ce spe\u0142niaj\u0105 oczekiwane kryteria. PowerShell dostarcza r\u00f3\u017cne atrybuty do walidacji parametr\u00f3w, takie jak <code>[ValidateNotNullOrEmpty()]<\/code> lub <code>[ValidateRange()]<\/code>. <\/p>\n\n\n\n<p>U\u017cyj tych atrybut\u00f3w, aby zwi\u0119kszy\u0107 odporno\u015b\u0107 twojej funkcji, jak r\u00f3wnie\u017c okre\u015bl typ danych dla Twoich danych wej\u015bciowych.<\/p>\n\n\n\n<pre lang=\"powershell\">function Get-AzDevOpsRepository {\n    [cmdletbinding()]\n    param(\n        [Parameter(Mandatory)]\n        [ValidateNotNullOrEmpty()]\n        [string]$organizationName,\n        [Parameter(Mandatory)]\n        [ValidateNotNullOrEmpty()]\n        [string]$projectName,\n        [Parameter(Mandatory)]\n        [ValidateNotNullOrEmpty()]\n        [securestring]$token\n    )\n}\n<\/pre>\n\n\n\n<p>Wi\u0119cej na ten temat znajdziesz tutaj &#8211; <a href=\"http:\/\/3 sposoby sprawdzania warto\u015bc parametr\u00f3w w PowerShell\">3 sposoby sprawdzania warto\u015bc parametr\u00f3w w PowerShell<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Krok 5: Wprowad\u017a Logik\u0119<\/h3>\n\n\n\n<p>Napisz podstawow\u0105 logik\u0119 funkcji. Rozbij z\u0142o\u017cone zadania na mniejsze, \u0142atwiejsze do zarz\u0105dzania kroki. Wykorzystuj wbudowane cmdlety i funkcje, kiedy to konieczne, oraz rozwa\u017c obs\u0142ug\u0119 b\u0142\u0119d\u00f3w, aby zwi\u0119kszy\u0107 odporno\u015b\u0107 funkcji.<\/p>\n\n\n\n<p>Do realizacji logiki funkcji, staraj si\u0119 wykorzystywa\u0107 natywnie dost\u0119pne polecenia, aby unika\u0107 zale\u017cno\u015bci od &#8222;zewn\u0119trznych&#8221; modu\u0142\u00f3w.<\/p>\n\n\n\n<pre lang=\"powershell\">function Get-AzDevOpsRepository {\n    [cmdletbinding()]\n    param(\n        [Parameter(Mandatory)]\n        [ValidateNotNullOrEmpty()]\n        [string]$organizationName,\n        [Parameter(Mandatory)]\n        [ValidateNotNullOrEmpty()]\n        [string]$projectName,\n        [Parameter(Mandatory)]\n        [ValidateNotNullOrEmpty()]\n        [securestring]$token\n    )\n\n    $insecureToken = $token| ConvertFrom-SecureString -AsPlainText\n    $B64Token = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes(\"`:$insecureToken\"))\n    $Headers = @{\n        \"Authorization\" = \"Basic $B64Token\"\n        \"Content-Type\"  = \"application\/json\"\n        \"Accept\"        = \"application\/json\"\n    }\n    \n    $Url = \"https:\/\/dev.azure.com\/{0}\/{1}\/_apis\/git\/repositories?api-version=4.1\" -f $organizationName, $projectName\n    $Response = Invoke-RestMethod -Uri $Url -Headers $Headers -Method Get -StatusCodeVariable StatusCode\n    if($StatusCode -eq 200) {\n       Write-Output $Response.value\n    }\n    else {\n        Write-Output $Response\n    }\n}\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Krok 6: Wykorzystaj Obs\u0142ug\u0119 Potoku<\/h3>\n\n\n\n<p>Zaprojektuj funkcj\u0119 tak, aby dzia\u0142a\u0142a p\u0142ynnie z potokiem PowerShell. Pozwala to u\u017cytkownikom \u0142\u0105czy\u0107 ze sob\u0105 wiele polece\u0144, zwi\u0119kszaj\u0105c elastyczno\u015b\u0107 i u\u017cyteczno\u015b\u0107 twojej funkcji.<\/p>\n\n\n\n<pre lang=\"powershell\">function Get-AzDevOpsRepository {\n    [cmdletbinding()]\n    param(\n        [Parameter(Mandatory)]\n        [ValidateNotNullOrEmpty()]\n        [string]$organizationName,\n\n        # wa\u017cne, atrybut ValueFromPipeline i ValueFromPipelineByPropertyName oznaczaj\u0105, kt\u00f3re \n        # parametry b\u0119d\u0105 przekazywane w potoku\n        [Parameter(Mandatory,ValueFromPipeline,ValueFromPipelineByPropertyName)]\n        [ValidateNotNullOrEmpty()]\n        [string]$projectName,\n\n        [Parameter(Mandatory)]\n        [ValidateNotNullOrEmpty()]\n        [securestring]$token\n    )\n\n    # niezb\u0119dny blog process \n    process {\n        $insecureToken = $token | ConvertFrom-SecureString -AsPlainText\n        $B64Token = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes(\"`:$insecureToken\"))\n        $Headers = @{\n            \"Authorization\" = \"Basic $B64Token\"\n            \"Content-Type\"  = \"application\/json\"\n            \"Accept\"        = \"application\/json\"\n        }\n    \n        $Url = \"https:\/\/dev.azure.com\/{0}\/{1}\/_apis\/git\/repositories?api-version=4.1\" -f $organizationName, $projectName\n        $Response = Invoke-RestMethod -Uri $Url -Headers $Headers -Method Get -StatusCodeVariable StatusCode\n        if ($StatusCode -eq 200) {\n            Write-Output $Response.value\n        }\n        else {\n            Write-Output $Response\n        }\n    }\n}\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Krok 7: Zastan\u00f3w si\u0119 nad Wyj\u015bciem<\/h3>\n\n\n\n<p>Zdecyduj, co twoja funkcja powinna zwraca\u0107. Mo\u017ce to by\u0107 okre\u015blony obiekt, prost\u0105 warto\u015b\u0107 lub w og\u00f3le nic. Jednolite formaty wyj\u015bcia sprawiaj\u0105, \u017ce funkcja jest przewidywalna i \u0142atwiejsza w u\u017cyciu.<\/p>\n\n\n\n<p>Ja preferuj\u0119 obiekt na wyj\u015bciu, u\u0142atwia nie tylko przekazywanie bardziej skomplikowanych danych, ale tak\u017ce p\u00f3\u017aniejsze ich przetwarzanie.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre lang=\"powershell\">function Get-AzDevOpsRepository {\n    [cmdletbinding()]\n    param(\n        [Parameter(Mandatory)]\n        [ValidateNotNullOrEmpty()]\n        [string]$organizationName,\n\n        # wa\u017cne, atrybut ValueFromPipeline i ValueFromPipelineByPropertyName oznaczaj\u0105, kt\u00f3re \n        # parametry b\u0119d\u0105 przekazywane w potoku\n        [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)]\n        [ValidateNotNullOrEmpty()]\n        [string]$projectName,\n\n        [Parameter(Mandatory)]\n        [ValidateNotNullOrEmpty()]\n        [securestring]$token\n    )\n\n    # niezb\u0119dny blog process \n    process {\n        $insecureToken = $token | ConvertFrom-SecureString -AsPlainText\n        $B64Token = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes(\"`:$insecureToken\"))\n        $Headers = @{\n            \"Authorization\" = \"Basic $B64Token\"\n            \"Content-Type\"  = \"application\/json\"\n            \"Accept\"        = \"application\/json\"\n        }\n    \n        $Url = \"https:\/\/dev.azure.com\/{0}\/{1}\/_apis\/git\/repositories?api-version=4.1\" -f $organizationName, $projectName\n        $Response = Invoke-RestMethod -Uri $Url -Headers $Headers -Method Get -StatusCodeVariable StatusCode\n        if ($StatusCode -eq 200) {\n            \n            $Response.value | ForEach-Object {\n                Write-Output ([PSCustomObject][Ordered]@{\n                    Name = $_.Name\n                    SizeMB = $_.size \/ 1MB\n                    isDisabled = $_.isDisabled\n                    lastUpdateTime= $_.project.lastUpdateTime\n                })\n            }\n\n        }\n        else {\n            Write-Output $Response\n        }\n    }\n}\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Krok 8: Napisz Pomoc z U\u017cyciem Komentarzy<\/h3>\n\n\n\n<p>Udokumentuj swoj\u0105 funkcj\u0119, u\u017cywaj\u0105c komentarzy. Opisz cel, parametry, dane wej\u015bciowe, dane wyj\u015bciowe i przyk\u0142ady. Ta dokumentacja jest kluczowa dla u\u017cytkownik\u00f3w, kt\u00f3rzy chc\u0105 zrozumie\u0107 i u\u017cywa\u0107 twojej funkcji. Na przyk\u0142ad:<\/p>\n\n\n\n<pre lang=\"powershell\"><#\n.SYNOPSIS\n    Pobiera informacje o repozytoriach Azure DevOps na podstawie dostarczonych parametr\u00f3w.\n.DESCRIPTION\n    Funkcja ta \u0142\u0105czy si\u0119 z interfejsem API Azure DevOps, aby pobra\u0107 informacje o repozytoriach.\n.PARAMETER organizationName\n    Nazwa organizacji Azure DevOps.\n.PARAMETER projectName\n    Nazwa projektu w Azure DevOps.\n.PARAMETER token\n    Token uwierzytelniaj\u0105cy dost\u0119pu do Azure DevOps (SecureString).\n.EXAMPLE\n    $InsecureToken = 'token' | ConvertTo-SecureString -AsPlainText -Force\n    'Testy' | Get-AzDevOpsRepository -organizationName 'Organizacja' -token $Insecuretoken\n#>\nfunction Get-AzDevOpsRepository {\n    [cmdletbinding()]\n    param(\n        [Parameter(Mandatory)]\n        [ValidateNotNullOrEmpty()]\n        [string]$organizationName,\n\n        # wa\u017cne, atrybut ValueFromPipeline i ValueFromPipelineByPropertyName oznaczaj\u0105, kt\u00f3re \n        # parametry b\u0119d\u0105 przekazywane w potoku\n        [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)]\n        [ValidateNotNullOrEmpty()]\n        [string]$projectName,\n\n        [Parameter(Mandatory)]\n        [ValidateNotNullOrEmpty()]\n        [securestring]$token\n    )\n\n    # niezb\u0119dny blog process \n    process {\n        # Konwersja zabezpieczonego tokena na niezabezpieczony i kodowanie Base64\n        $insecureToken = $token | ConvertFrom-SecureString -AsPlainText\n        $B64Token = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes(\"`:$insecureToken\"))\n        $Headers = @{\n            \"Authorization\" = \"Basic $B64Token\"\n            \"Content-Type\"  = \"application\/json\"\n            \"Accept\"        = \"application\/json\"\n        }\n    \n        $Url = \"https:\/\/dev.azure.com\/{0}\/{1}\/_apis\/git\/repositories?api-version=4.1\" -f $organizationName, $projectName\n        $Response = Invoke-RestMethod -Uri $Url -Headers $Headers -Method Get -StatusCodeVariable StatusCode\n\n        # Sprawdzenie kodu statusu odpowiedzi\n        if ($StatusCode -eq 200) {\n            \n            $Response.value | ForEach-Object {\n                Write-Output ([PSCustomObject][Ordered]@{\n                    Name = $_.Name\n                    SizeMB = $_.size \/ 1MB\n                    isDisabled = $_.isDisabled\n                    lastUpdateTime= $_.project.lastUpdateTime\n                })\n            }\n\n        }\n        else {\n            Write-Output $Response\n        }\n    }\n}\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Krok 9: Testuj Dok\u0142adnie<\/h3>\n\n\n\n<p>Przetestuj swoj\u0105 funkcj\u0119 z r\u00f3\u017cnymi danymi wej\u015bciowymi, aby upewni\u0107 si\u0119, \u017ce zachowuje si\u0119 zgodnie z oczekiwaniami. Ten krok jest kluczowy dla identyfikacji i naprawienia ewentualnych problem\u00f3w przed udost\u0119pnieniem funkcji innym.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Krok 10: Udost\u0119pnij i Udoskonalaj<\/h3>\n\n\n\n<p>Gdy jeste\u015b pewien swojej funkcji, rozwa\u017c podzielenie si\u0119 ni\u0105 z innymi. Mo\u017cesz udost\u0119pni\u0107 j\u0105 jako cz\u0119\u015b\u0107 skryptu, modu\u0142u lub dostarczy\u0107 kod bezpo\u015brednio. B\u0105d\u017a otwarty na opinie i wprowadzaj zmiany w oparciu o do\u015bwiadczenia i sugestie u\u017cytkownik\u00f3w.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Podsumowanie<\/h2>\n\n\n\n<p>Tworzenie funkcji w PowerShell to fascynuj\u0105ce wyzwanie, ale wymaga \u015bcis\u0142ego przestrzegania kluczowych krok\u00f3w. Zacznij od jasno zdefiniowanego celu, odpowiedniej nazwy i deklaracji parametr\u00f3w. Dodaj walidacj\u0119, obs\u0142ug\u0119 potoku i skuteczn\u0105 obs\u0142ug\u0119 wyj\u0105tk\u00f3w, aby zwi\u0119kszy\u0107 funkcjonalno\u015b\u0107 i niezawodno\u015b\u0107. Testowanie i udokumentowanie s\u0105 kluczowe przed udost\u0119pnieniem funkcji.<\/p>\n\n\n\n<p>Photo by <a href=\"https:\/\/unsplash.com\/@brett_jordan?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash\">Brett Jordan<\/a> on <a href=\"https:\/\/unsplash.com\/photos\/brown-wooden-cross-on-white-surface-Fp4ERdkR5jU?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash\">Unsplash<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>W dzisiejszym \u015bwiecie automatyzacji i programowania, pisanie funkcji w PowerShell staje si\u0119 nieod\u0142\u0105czn\u0105 cz\u0119\u015bci\u0105 pracy ka\u017cdego administratora systemu czy cloud in\u017cyniera. Aby jednak stworzy\u0107 efektywn\u0105 i \u0142atw\u0105 w u\u017cyciu funkcj\u0119, warto przestrzega\u0107 pewnych krok\u00f3w i zasad. W poni\u017cszym wpisie om\u00f3wimy dziesi\u0119\u0107 krok\u00f3w, kt\u00f3re pomog\u0105 Ci w tworzeniu funkcji PowerShell od podstaw. Od zdefiniowania celu po [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"off","_et_pb_old_content":"<!-- wp:image {\"id\":7228,\"sizeSlug\":\"large\",\"linkDestination\":\"none\",\"className\":\"is-style-default\"} -->\n<figure class=\"wp-block-image size-large is-style-default\"><img src=\"http:\/\/www.mnwebdesign.nstrefa.pl\/akademiapowershell.pl\/wp-content\/uploads\/2023\/11\/Funkcje-PowerShell-Kluczowe-Kroki-do-Perfekcji-1024x576.png\" alt=\"Funkcje PowerShell: Kluczowe Kroki do Perfekcji\" class=\"wp-image-7228\"\/><\/figure>\n<!-- \/wp:image -->\n\n<!-- wp:paragraph -->\n<p>W dzisiejszym \u015bwiecie automatyzacji i programowania, pisanie funkcji w PowerShell staje si\u0119 nieod\u0142\u0105czn\u0105 cz\u0119\u015bci\u0105 pracy ka\u017cdego administratora systemu czy cloud in\u017cyniera. Aby jednak stworzy\u0107 efektywn\u0105 i \u0142atw\u0105 w u\u017cyciu funkcj\u0119, warto przestrzega\u0107 pewnych krok\u00f3w i zasad. W poni\u017cszym wpisie om\u00f3wimy dziesi\u0119\u0107 krok\u00f3w, kt\u00f3re pomog\u0105 Ci w tworzeniu funkcji PowerShell od podstaw. Od zdefiniowania celu po udost\u0119pnienie gotowego kodu - przewodnik ten poprowadzi Ci\u0119 przez ca\u0142y proces.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:more -->\n<!--more-->\n<!-- \/wp:more -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\">Krok 1: Zdefiniuj Jasny Cel<\/h3>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Zanim zaczniesz pisa\u0107 funkcj\u0119, dok\u0142adnie zastan\u00f3w si\u0119, jaki jest jej cel. Jakie zadanie lub zadania ma ona wykona\u0107? M\u00f3wi si\u0119, \u017ce dobry plan to po\u0142owa sukcesu, wi\u0119c przemy\u015bl swoj\u0105 funkcj\u0119 przed napisaniem pierwszych linii kodu.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\">Krok 2: Wybierz Zgodn\u0105 Nazw\u0119<\/h3>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Wybierz nazw\u0119 dla funkcji, kt\u00f3ra jasno odzwierciedla jej cel. Zaleca si\u0119 stosowanie konwencji czasownik-rzeczownik dla nazw funkcji w PowerShell. Na przyk\u0142ad <code>Get-MyData<\/code> lub <code>Invoke-Task<\/code>.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<pre lang=\"powershell\">function Get-AzDevOpsRepository {\n    [cmdletbinding()]\n}\n<\/pre>\n<!-- \/wp:html -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\">Krok 3: Zadeklaruj Parametry<\/h3>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Je\u015bli wystarczaj\u0105co du\u017co czasu sp\u0119dzi\u0142e\u015b w kroku 1 to dok\u0142adnie wiesz jakich danych potrzebujesz na wej\u015bciu, aby funkcja wykonania swoje zadania. U\u017cyj s\u0142owa kluczowego <code>param<\/code> do deklaracji parametr\u00f3w. <\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Na przyk\u0142ad:<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<pre lang=\"powershell\">function Get-AzDevOpsRepository {\n    [cmdletbinding()]\n    param(\n        $organizationName,\n        $projectName,\n        $token\n    )\n}\n<\/pre>\n<!-- \/wp:html -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\">Krok 4: Obs\u0142uguj Walidacj\u0119 Parametr\u00f3w<\/h3>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Je\u015bli masz zdefiniowane parametry, dodaj walidacj\u0119 warto\u015bci wej\u015bciowych, aby upewni\u0107 si\u0119, \u017ce spe\u0142niaj\u0105 oczekiwane kryteria. PowerShell dostarcza r\u00f3\u017cne atrybuty do walidacji parametr\u00f3w, takie jak <code>[ValidateNotNullOrEmpty()]<\/code> lub <code>[ValidateRange()]<\/code>. <\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>U\u017cyj tych atrybut\u00f3w, aby zwi\u0119kszy\u0107 odporno\u015b\u0107 twojej funkcji, jak r\u00f3wnie\u017c okre\u015bl typ danych dla Twoich danych wej\u015bciowych.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<pre lang=\"powershell\">function Get-AzDevOpsRepository {\n    [cmdletbinding()]\n    param(\n        [Parameter(Mandatory)]\n        [ValidateNotNullOrEmpty()]\n        [string]$organizationName,\n        [Parameter(Mandatory)]\n        [ValidateNotNullOrEmpty()]\n        [string]$projectName,\n        [Parameter(Mandatory)]\n        [ValidateNotNullOrEmpty()]\n        [securestring]$token\n    )\n}\n<\/pre>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>Wi\u0119cej na ten temat znajdziesz tutaj - <a href=\"http:\/\/3 sposoby sprawdzania warto\u015bc parametr\u00f3w w PowerShell\">3 sposoby sprawdzania warto\u015bc parametr\u00f3w w PowerShell<\/a>.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\">Krok 5: Wprowad\u017a Logik\u0119<\/h3>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Napisz podstawow\u0105 logik\u0119 funkcji. Rozbij z\u0142o\u017cone zadania na mniejsze, \u0142atwiejsze do zarz\u0105dzania kroki. Wykorzystuj wbudowane cmdlety i funkcje, kiedy to konieczne, oraz rozwa\u017c obs\u0142ug\u0119 b\u0142\u0119d\u00f3w, aby zwi\u0119kszy\u0107 odporno\u015b\u0107 funkcji.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Do realizacji logiki funkcji, staraj si\u0119 wykorzystywa\u0107 natywnie dost\u0119pne polecenia, aby unika\u0107 zale\u017cno\u015bci od \"zewn\u0119trznych\" modu\u0142\u00f3w.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<pre lang=\"powershell\">function Get-AzDevOpsRepository {\n    [cmdletbinding()]\n    param(\n        [Parameter(Mandatory)]\n        [ValidateNotNullOrEmpty()]\n        [string]$organizationName,\n        [Parameter(Mandatory)]\n        [ValidateNotNullOrEmpty()]\n        [string]$projectName,\n        [Parameter(Mandatory)]\n        [ValidateNotNullOrEmpty()]\n        [securestring]$token\n    )\n\n    $insecureToken = $token| ConvertFrom-SecureString -AsPlainText\n    $B64Token = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes(\"`:$insecureToken\"))\n    $Headers = @{\n        \"Authorization\" = \"Basic $B64Token\"\n        \"Content-Type\"  = \"application\/json\"\n        \"Accept\"        = \"application\/json\"\n    }\n    \n    $Url = \"https:\/\/dev.azure.com\/{0}\/{1}\/_apis\/git\/repositories?api-version=4.1\" -f $organizationName, $projectName\n    $Response = Invoke-RestMethod -Uri $Url -Headers $Headers -Method Get -StatusCodeVariable StatusCode\n    if($StatusCode -eq 200) {\n       Write-Output $Response.value\n    }\n    else {\n        Write-Output $Response\n    }\n}\n<\/pre>\n<!-- \/wp:html -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\">Krok 6: Wykorzystaj Obs\u0142ug\u0119 Potoku<\/h3>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Zaprojektuj funkcj\u0119 tak, aby dzia\u0142a\u0142a p\u0142ynnie z potokiem PowerShell. Pozwala to u\u017cytkownikom \u0142\u0105czy\u0107 ze sob\u0105 wiele polece\u0144, zwi\u0119kszaj\u0105c elastyczno\u015b\u0107 i u\u017cyteczno\u015b\u0107 twojej funkcji.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<pre lang=\"powershell\">function Get-AzDevOpsRepository {\n    [cmdletbinding()]\n    param(\n        [Parameter(Mandatory)]\n        [ValidateNotNullOrEmpty()]\n        [string]$organizationName,\n\n        # wa\u017cne, atrybut ValueFromPipeline i ValueFromPipelineByPropertyName oznaczaj\u0105, kt\u00f3re \n        # parametry b\u0119d\u0105 przekazywane w potoku\n        [Parameter(Mandatory,ValueFromPipeline,ValueFromPipelineByPropertyName)]\n        [ValidateNotNullOrEmpty()]\n        [string]$projectName,\n\n        [Parameter(Mandatory)]\n        [ValidateNotNullOrEmpty()]\n        [securestring]$token\n    )\n\n    # niezb\u0119dny blog process \n    process {\n        $insecureToken = $token | ConvertFrom-SecureString -AsPlainText\n        $B64Token = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes(\"`:$insecureToken\"))\n        $Headers = @{\n            \"Authorization\" = \"Basic $B64Token\"\n            \"Content-Type\"  = \"application\/json\"\n            \"Accept\"        = \"application\/json\"\n        }\n    \n        $Url = \"https:\/\/dev.azure.com\/{0}\/{1}\/_apis\/git\/repositories?api-version=4.1\" -f $organizationName, $projectName\n        $Response = Invoke-RestMethod -Uri $Url -Headers $Headers -Method Get -StatusCodeVariable StatusCode\n        if ($StatusCode -eq 200) {\n            Write-Output $Response.value\n        }\n        else {\n            Write-Output $Response\n        }\n    }\n}\n<\/pre>\n<!-- \/wp:html -->\n\n<!-- wp:paragraph -->\n<p>Wi\u0119cej o obs\u0142udz\u0119 potoku w funkcjach napisa\u0142em tutaj - <a href=\"http:\/\/www.mnwebdesign.nstrefa.pl\/akademiapowershell.pl\/2020\/03\/funkcja-potok-powershell\/\">Przetwarzanie potokowe we w\u0142asnych funkcjach, co musisz wiedzie\u0107?<\/a><\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\">Krok 7: Zastan\u00f3w si\u0119 nad Wyj\u015bciem<\/h3>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Zdecyduj, co twoja funkcja powinna zwraca\u0107. Mo\u017ce to by\u0107 okre\u015blony obiekt, prost\u0105 warto\u015b\u0107 lub w og\u00f3le nic. Jednolite formaty wyj\u015bcia sprawiaj\u0105, \u017ce funkcja jest przewidywalna i \u0142atwiejsza w u\u017cyciu.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Ja preferuj\u0119 obiekt na wyj\u015bciu, u\u0142atwia nie tylko przekazywanie bardziej skomplikowanych danych, ale tak\u017ce p\u00f3\u017aniejsze ich przetwarzanie.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<pre lang=\"powershell\">function Get-AzDevOpsRepository {\n    [cmdletbinding()]\n    param(\n        [Parameter(Mandatory)]\n        [ValidateNotNullOrEmpty()]\n        [string]$organizationName,\n\n        # wa\u017cne, atrybut ValueFromPipeline i ValueFromPipelineByPropertyName oznaczaj\u0105, kt\u00f3re \n        # parametry b\u0119d\u0105 przekazywane w potoku\n        [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)]\n        [ValidateNotNullOrEmpty()]\n        [string]$projectName,\n\n        [Parameter(Mandatory)]\n        [ValidateNotNullOrEmpty()]\n        [securestring]$token\n    )\n\n    # niezb\u0119dny blog process \n    process {\n        $insecureToken = $token | ConvertFrom-SecureString -AsPlainText\n        $B64Token = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes(\"`:$insecureToken\"))\n        $Headers = @{\n            \"Authorization\" = \"Basic $B64Token\"\n            \"Content-Type\"  = \"application\/json\"\n            \"Accept\"        = \"application\/json\"\n        }\n    \n        $Url = \"https:\/\/dev.azure.com\/{0}\/{1}\/_apis\/git\/repositories?api-version=4.1\" -f $organizationName, $projectName\n        $Response = Invoke-RestMethod -Uri $Url -Headers $Headers -Method Get -StatusCodeVariable StatusCode\n        if ($StatusCode -eq 200) {\n            \n            $Response.value | ForEach-Object {\n                Write-Output ([PSCustomObject][Ordered]@{\n                    Name = $_.Name\n                    SizeMB = $_.size \/ 1MB\n                    isDisabled = $_.isDisabled\n                    lastUpdateTime= $_.project.lastUpdateTime\n                })\n            }\n\n        }\n        else {\n            Write-Output $Response\n        }\n    }\n}\n<\/pre>\n<!-- \/wp:html -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\">Krok 8: Napisz Pomoc z U\u017cyciem Komentarzy<\/h3>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Udokumentuj swoj\u0105 funkcj\u0119, u\u017cywaj\u0105c komentarzy. Opisz cel, parametry, dane wej\u015bciowe, dane wyj\u015bciowe i przyk\u0142ady. Ta dokumentacja jest kluczowa dla u\u017cytkownik\u00f3w, kt\u00f3rzy chc\u0105 zrozumie\u0107 i u\u017cywa\u0107 twojej funkcji. Na przyk\u0142ad:<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:html -->\n<pre lang=\"powershell\"><#\n.SYNOPSIS\n    Pobiera informacje o repozytoriach Azure DevOps na podstawie dostarczonych parametr\u00f3w.\n.DESCRIPTION\n    Funkcja ta \u0142\u0105czy si\u0119 z interfejsem API Azure DevOps, aby pobra\u0107 informacje o repozytoriach.\n.PARAMETER organizationName\n    Nazwa organizacji Azure DevOps.\n.PARAMETER projectName\n    Nazwa projektu w Azure DevOps.\n.PARAMETER token\n    Token uwierzytelniaj\u0105cy dost\u0119pu do Azure DevOps (SecureString).\n.EXAMPLE\n    $InsecureToken = 'token' | ConvertTo-SecureString -AsPlainText -Force\n    'Testy' | Get-AzDevOpsRepository -organizationName 'Organizacja' -token $Insecuretoken\n#>\nfunction Get-AzDevOpsRepository {\n    [cmdletbinding()]\n    param(\n        [Parameter(Mandatory)]\n        [ValidateNotNullOrEmpty()]\n        [string]$organizationName,\n\n        # wa\u017cne, atrybut ValueFromPipeline i ValueFromPipelineByPropertyName oznaczaj\u0105, kt\u00f3re \n        # parametry b\u0119d\u0105 przekazywane w potoku\n        [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)]\n        [ValidateNotNullOrEmpty()]\n        [string]$projectName,\n\n        [Parameter(Mandatory)]\n        [ValidateNotNullOrEmpty()]\n        [securestring]$token\n    )\n\n    # niezb\u0119dny blog process \n    process {\n        # Konwersja zabezpieczonego tokena na niezabezpieczony i kodowanie Base64\n        $insecureToken = $token | ConvertFrom-SecureString -AsPlainText\n        $B64Token = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes(\"`:$insecureToken\"))\n        $Headers = @{\n            \"Authorization\" = \"Basic $B64Token\"\n            \"Content-Type\"  = \"application\/json\"\n            \"Accept\"        = \"application\/json\"\n        }\n    \n        $Url = \"https:\/\/dev.azure.com\/{0}\/{1}\/_apis\/git\/repositories?api-version=4.1\" -f $organizationName, $projectName\n        $Response = Invoke-RestMethod -Uri $Url -Headers $Headers -Method Get -StatusCodeVariable StatusCode\n\n        # Sprawdzenie kodu statusu odpowiedzi\n        if ($StatusCode -eq 200) {\n            \n            $Response.value | ForEach-Object {\n                Write-Output ([PSCustomObject][Ordered]@{\n                    Name = $_.Name\n                    SizeMB = $_.size \/ 1MB\n                    isDisabled = $_.isDisabled\n                    lastUpdateTime= $_.project.lastUpdateTime\n                })\n            }\n\n        }\n        else {\n            Write-Output $Response\n        }\n    }\n}\n<\/pre>\n<!-- \/wp:html -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\">Krok 9: Testuj Dok\u0142adnie<\/h3>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Przetestuj swoj\u0105 funkcj\u0119 z r\u00f3\u017cnymi danymi wej\u015bciowymi, aby upewni\u0107 si\u0119, \u017ce zachowuje si\u0119 zgodnie z oczekiwaniami. Ten krok jest kluczowy dla identyfikacji i naprawienia ewentualnych problem\u00f3w przed udost\u0119pnieniem funkcji innym.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\">Krok 10: Udost\u0119pnij i Udoskonalaj<\/h3>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Gdy jeste\u015b pewien swojej funkcji, rozwa\u017c podzielenie si\u0119 ni\u0105 z innymi. Mo\u017cesz udost\u0119pni\u0107 j\u0105 jako cz\u0119\u015b\u0107 skryptu, modu\u0142u lub dostarczy\u0107 kod bezpo\u015brednio. B\u0105d\u017a otwarty na opinie i wprowadzaj zmiany w oparciu o do\u015bwiadczenia i sugestie u\u017cytkownik\u00f3w.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">Podsumowanie<\/h2>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Tworzenie funkcji w PowerShell to fascynuj\u0105ce wyzwanie, ale wymaga \u015bcis\u0142ego przestrzegania kluczowych krok\u00f3w. Zacznij od jasno zdefiniowanego celu, odpowiedniej nazwy i deklaracji parametr\u00f3w. Dodaj walidacj\u0119, obs\u0142ug\u0119 potoku i skuteczn\u0105 obs\u0142ug\u0119 wyj\u0105tk\u00f3w, aby zwi\u0119kszy\u0107 funkcjonalno\u015b\u0107 i niezawodno\u015b\u0107. Testowanie i udokumentowanie s\u0105 kluczowe przed udost\u0119pnieniem funkcji.<\/p>\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Photo by <a href=\"https:\/\/unsplash.com\/@brett_jordan?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash\">Brett Jordan<\/a> on <a href=\"https:\/\/unsplash.com\/photos\/brown-wooden-cross-on-white-surface-Fp4ERdkR5jU?utm_content=creditCopyText&amp;utm_medium=referral&amp;utm_source=unsplash\">Unsplash<\/a><\/p>\n<!-- \/wp:paragraph -->","_et_gb_content_width":"1080","footnotes":""},"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/www.mnwebdesign.nstrefa.pl\/mojapolska\/wp-json\/wp\/v2\/posts\/80"}],"collection":[{"href":"https:\/\/www.mnwebdesign.nstrefa.pl\/mojapolska\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mnwebdesign.nstrefa.pl\/mojapolska\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mnwebdesign.nstrefa.pl\/mojapolska\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mnwebdesign.nstrefa.pl\/mojapolska\/wp-json\/wp\/v2\/comments?post=80"}],"version-history":[{"count":6,"href":"https:\/\/www.mnwebdesign.nstrefa.pl\/mojapolska\/wp-json\/wp\/v2\/posts\/80\/revisions"}],"predecessor-version":[{"id":485,"href":"https:\/\/www.mnwebdesign.nstrefa.pl\/mojapolska\/wp-json\/wp\/v2\/posts\/80\/revisions\/485"}],"wp:attachment":[{"href":"https:\/\/www.mnwebdesign.nstrefa.pl\/mojapolska\/wp-json\/wp\/v2\/media?parent=80"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mnwebdesign.nstrefa.pl\/mojapolska\/wp-json\/wp\/v2\/categories?post=80"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mnwebdesign.nstrefa.pl\/mojapolska\/wp-json\/wp\/v2\/tags?post=80"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}