文字通り他のオプションがない限り、グローバル変数を使用しないでください、以上です。 5040>
つまり、グローバルは一般的にかなりひどいということです…参照としてのみ使用し、関数内から変更することがなければ。 なぜそれが重要なのでしょうか。 なぜなら、10 個の関数がすべて同じ変数を使用していて、その変数に基づいて行うことを変更し、そのうちの誰かがそれを変更する可能性がある場合、突然、それらのすべての動作がきわめて予測不可能になるからです。 データ、オブジェクト、テキスト、何でも好きなものを出力し、関数を呼び出すときにその出力を何かに保存します。 関数が完了すると、そのコンテナは必要な値を保持します。
$variable = Function-Name -Parameter1 'ParameterValue'
このような行になるため、フォローするのがはるかに簡単です。 グローバル変数と比較すると:
$global:Var = 'initial value'Function-Name -Parameter1 'ParameterValue'# check the value of $global:Var$global:Var
そして、その変数がまだ元の値を保持しているかどうかは、まったくわかりません。 この影響は、グローバル変数を多用し始めるとさらにひどくなり、自分のコードが何をしているのかを追うのが非常に困難になります。
では、物事を分別しておくにはどうしたらよいのでしょうか?
関数の例では:
function Get-DiskSize { param( $Drives ) $Drives | ForEach-Object { $Vol = ("$_" + ":") $WMIPriorDisk = Get-WmiObject Win32_LogicalDisk -Filter "DeviceID='$Vol'" | Select-Object Size, FreeSpace $PriorDiskObject = @{ DriveLetter = $Vol DiskSizePrior = "{0:N2}" -f ($WMIPriorDisk.Size / 1GB) DiskFreePrior = "{0:N2}" -f ($WMIPriorDisk.FreeSpace / 1GB) } Write-Output $PriorDiskObject } }$Drives = (::GetDrives() | Where-Object {$_.DriveType -eq "Fixed"} | Select-Object -ExpandProperty 'Name').Replace(":\","")$DisksPrior = Get-DiskSize -Drives $Drives
それを分解すると、
- 最初に関数があります。 他の何かをする前に、関数を定義します。 関数はコードのどこでも使えるので、関数をチェックする場所を一貫して決めておくと、より便利です。 そうすれば、変更する必要がある関数をどこに置いたか、スクリプト全体を検索する必要がなくなります。
- Define parameters. 関数がより広いスクリプトから使用する必要があるデータは、そのパラメータで定義する必要があります。 これにより、関数が必要とするデータを一目で見ることができ、また正しいデータを与えようとしていること、そしてスクリプトのどこか他の場所に誤ってデータを埋め込んでいないことを確認することができます。
Write-Output
はそれを行う非常に明確な方法ですが、デフォルトでは、データをキャプチャしない (たとえば、それ自体で行に立たせる) ことで、単に出力ストリームにデータを「落下」させると、それが出力されるようになります。 私は、「はい、このデータを出力します」と指定する、より明確な構文を好みます。 - Capturing!
$var = function-name
を行うことは、基本的に「この関数を呼び出して、どんな出力でも変数$var
に取り込む」ことを意味します。 これにより、このデータを後で使用することができます。また、使用するのと同じ場所で定義しているため、コードで何を行っているかを追跡するのがはるかに容易になります。 あなたは PSObject 型を使用し、ハッシュテーブルを使用してそれを構築しています。 私がやっていることは非常に似ていますが、一般に、PsCustomObject は、あなたが必要とするものに対してより柔軟なタイプであることがわかります。 より簡単にフォーマットでき、すべてのコマンドレットとシームレスに動作します。 -
補足:これらの角括弧は、「属性」として知られているものです。 これらは、さまざまな用途で関数に適用できる余分なビットです。
では、これが「高度な関数」であると宣言しています (私にはばかげた名前ですが、彼らがそう呼ぶことにしたのです)。 基本的にこれは、PS が関数に持たせるデフォルトのパラメータを使用することを可能にします。 たとえば、
Write-Verbose
を呼び出して、通常は隠されている(通常は必要ないため)何をしているかの情報を残し、-Verbose
パラメータで関数を呼び出してメッセージを見る(何かが期待通りに進まない場合、どこで混乱しているのかが分かる)ようなことができます。 特定の位置、必須かどうか、パイプライン入力を受け入れるかどうかなど、さまざまなことを定義できます。
では、このことを念頭に置いて、私自身がこの関数をどのように扱うかについて説明します。 私はここで、おそらく完全にあなたを圧倒していることを認識しています。ですから、恐れずに少しずつ調べて、わからないことがあれば質問してください。 上記で紹介しきれなかったこともありますが、ご容赦ください。
頑張ってください、少し乱暴かもしれませんが 😀
.