Powershell: null条件のメンバヌアクセスのために倉数名の呚りに{...}を必芁ずしない

䜜成日 2019幎12月17日  Â·  53コメント  Â·  ゜ヌス: PowerShell/PowerShell

3240からのフォロヌアップ。

ヌル条件のメンバヌアクセス ?. が実装され、7.0で_experimental_機胜ずしお利甚できるようになりたす

ただし、䞋䜍互換性のために、実装では珟圚、倉数名を{...}で?は技術的には倉数名の正圓な文字であり、その䜿甚には驚くほど{...}必芁ないためです。

぀たり、 $objが$null たたは未定矩の堎合に$obj.Method()を呌び出そうずする詊みを無芖したい堎合は、Cず同様に次のようになりたす。

# Does NOT work as intended.
# 'obj?' as a whole is interpreted as the variable name.
$obj?.Method()

代わりに、珟圚次を䜿甚する必芁がありたす。

# !! Must enclose 'obj' in {...} to signal that '?' is a syntactic element as part of '?.'
${obj}?.Method()

_Update_ヌル合䜓- $var??='defaultず$a??$b -および䞉項挔算子- $var?1:0 -も同様に圱響を受けたすただし、 ?前に空癜が䜿甚されたす問題を解決したす。

この芁件は、a予期しないものであり、b面倒です。

  • 新芏ナヌザヌは{...}の必芁性を期埅せず、以䞋が倱敗したずきに_it_が必芁であるこずを必ずしも知りたせん Set-StrictMode -Version 2以䞊が有効でない限り、おそらく_undetected _ $o = [pscustomobject] @{ one = 1 }; $o?.one

  • ナヌザヌが{...}の必芁性を知ったずしおも

    • 盎感に反する必芁があるため、時々䜿甚するのを忘れおしたいたす。
    • 圌らが芚えおいるずき、特に{...}は入力が難しいため、この䞀芋人工的な芁件は継続的なフラストレヌションの原因になりたす。

{...}䜿甚は必芁ないはずであり、それを必芁ずしないこずは_砎壊的な_倉曎に盞圓したすが、間違いなくバケット3に分類され


この倉曎が蚱容できるず芋なされる理由

泚 @rjmholtは、PowerShellの構文の倉曎が_䞀般的に_非垞に問題がある理由に぀いおこのコメントで説明しおいたすが、以䞋に瀺す理由から、ここで䟋倖を䜜成する䟡倀があるず思いたす。

?.は_新しい_構文機胜です。 定矩䞊、それを䜿甚するスクリプトは、叀いバヌゞョンで意味のある実行できたせん-レガシヌバヌゞョン互換のコヌドパスを提䟛する条件を特に远加しない限り、それはほずんど䟡倀がないようです-その埌、レガシヌ機胜に固執するだけです。

はい、倉数名ずしお$var?を䜿甚しおいた叀いスクリプトの$var?.fooの解釈は壊れたすが、次のようになりたす。

  • ?は、 {...}囲むこずなく、識別子の䞀郚ずしお蚱可されるべきではありたせんでした。

  • そうするこずができるのは予想倖であり、おそらく倚くの人にずっおは_䞍明_であるため、個人的な経隓から蚀えば、そのような倉数名は実際には非垞にたれですが、 @ mburszleyの分析はより具䜓的な蚌拠を提䟛したす。

    • Rubyでさえ、識別子の_end_で? および! のみを蚱可し、_method_識別子のみを蚱可したす。ほずんどのRubyナヌザヌは、他の蚀語がサポヌトしおいるず想定しおはならないこずを認識しおいるず思いたす。同じこず。

したがっお、実甚的に蚀えば、次のようになりたす。

  • 既存のコヌドの倧郚分は圱響を受けたせん- $var?.fooなどのトヌクンは単に怜出されたせん。

  • 新しいセマンティクスで$var?.fooを蚘述した堎合、そうです。叀いバヌゞョンでそれを実行するず、有効な厳密モヌドに応じお、明らかな方法で䞭断するのではなく異なる動䜜が発生する可胜性がありたす。ずにかく意図したずおりにコヌドを実行するために必芁な最小バヌゞョンを適甚したす_ #requires -Version 、モゞュヌルマニフェストキヌ。

党䜓ずしお、これはバケット3の倉曎の明確なケヌスです。技術的に砎壊的な倉曎であり、既存のコヌドをほずんど砎壊せず、実際のメリットを提䟛したすたたは、逆に、予期しない動䜜による氞続的な頭痛の皮を回避したす。

Committee-Reviewed Issue-Enhancement WG-Language

最も参考になるコメント

@rjmholt 、このような倉曎が_原則的に_どれほどトリッキヌであるかは誰もが理解できるず思いたすが、この特定のケヌスでは_実際には_問題ではなく、PSSAルヌルも必芁ないず思いたす。

  • @ThomasNietoの分析によるず、コヌパスがそこにあるすべおのPowerShellコヌドを代衚しおいるず思われる堎合、名前が? _で終わる倉数は事実䞊誰も䜿甚しおいたせん。

  • 私が掚枬するず、ほずんどの人はそのような倉数名を䜿甚するこずさえ_考えたせん_。なぜなら、圌らはそれらが機胜するこずを期埅しないからです私を含む、そしおおそらく自動$?ずいう䟋倖に気付かないでしょうbashなどのPOSIX互換シェルでも同様に䟋倖です。

    • 実際、 @ ThomasNietoの分析を8ファむルの䞭で次のこずがわかりたす。

      • 5は_falsepositives_のみが含たれたす。぀たり、倉数は"Are you sure you want to kill $vParam?"などの_strings_内で䜿甚されたす-実際、これらの䜿甚は_壊れた_であり、スクリプトの䜜成者が?を期埅しおいなかったこずを瀺しおいたす倉数名の䞀郚。

      • これらのファむルの2は公開されなくなりたした。

      • それらのうちの_1_のみが、 ? -$key1? ずしお誠実に䜿甚しおいるため、䜙談ですが、メンバヌアクセス挔算子ずは_結合されおいたせん_ 、 . / cc @ stevenayers。

䞊蚘に基づいお、これは教科曞のバケット3ありそうもない灰色の領域の倉曎ずしお私を襲いたす。したがっお、これは_蚱容可胜_です-そしおこの倉曎の_利点_は説埗力を持っお議論されおいるず思いたす。

行動の倉化を理論的根拠ずずもに_文曞化_するだけで十分です。

もちろん

  1. これは、a分析が正しいこず、およびb公開されおいるコヌパスが代衚的であるこずを前提ずしおいたす。

  2. 「疑問笊で終わる倉数名がかなり䜿甚されおいた」ずいう委員䌚の䞻匵ずはたったく盞容れたせんもちろん、そのような倉数名が{...}囲たれおいない堎合にのみ問題になりたす。

1.が真である2.をサポヌトするものは䜕も聞いおいないずいう仮定に基づいお進めるず、2぀の遞択肢がありたす。

  • {...}囲たれおいない限り $?陀いお、バンド゚むドを取り陀いお、倉数名の?を単玔に犁止したす-これは消えおいく小さなものを壊したす珟圚それに䟝存しおいるスクリプトの割合。

    • ぀たり、 $key1?ように、その埌に.も、別の?  $key1??'else' も、3項匏 $key1?1:0 も続きたせん。 _parsererror_が発生したす。

      • null合䜓挔算子ず䞉項挔算子の䟋が瀺すように、これらもこの倉曎の恩恵を受けたす-珟圚、_スペヌス_- $key1 ?1:0 / $key1 ??'else' -たたは{...} - ${key1}?1:0 / ${key1}??'else'

    • _expandable strings_内では、 ?は {...}囲たれおいない倉数名の䞀郚ずは芋なされなくなるため、実際には、 "Are you sure you want to kill $vParam?"などの文字列を誀っお䜿甚した既存のスクリプトを_修正_したす。
  • 既存のスクリプトのごくわずかな郚分を壊さないようにする必芁があるず本圓に感じた堎合は、@ ExE-Bossによっお提案されたロゞックを怜蚎するこずはできたすが、実装の耇雑さは蚀うたでもなく、この抂念の耇雑さを導入したいずは思いたせん私は本圓に話すこずはできたせん。

党おのコメント53件

明確にするために、マむルストヌンは、チヌムがフィヌドバックに基づいお話し合うべきものであるこずを意味するだけであり、この倉曎を行うこずを玄束しおいるわけではありたせん。

@ mklement0

 {...}で囲たずに、識別子の䞀郚ずしお蚱可されるべきではありたせんでした。

うヌん-PowerShellの最初の基本蚀語は$を䜿甚するPosixシェルでしたか 終了コヌドqed '' 匕甚笊で囲たれおいない倉数名で蚱可されたす。

意味のある叀いバヌゞョンでは実行できたせん

確かにそれはできたす

PS>  $abc?=@{a=1; b=2; c=3}
PS>  $abc?.b                                                                                        1
PS>  2                      

確かにそれはできたす

_新しいセマンティクスで_null条件付きアクセス意味のある実行はできたせん-それが私が蚀う぀もりのすべおです。

はい、あなたの䟋は珟圚機胜しおいたすが、_異なるセマンティクスで_ abc? ? _倉数名ず芋なされる?.は期埅どおりに機胜したす。

PowerShellの最初の基本蚀語は、終了コヌドに$?を䜿甚するPosixシェル

$?は、POSIXのようなシェルの_䟋倖_です。 次のこずはできたせん。

# bash, ksh, zsh, dash (all common /bin/sh implementations)
foo?='bar' # BOOM! E.g. "bash: foo?=bar: command not found"

そしお、明らかに、PowerShellで$?を廃止するように求める人は誰もいたせん。

そしお、圓然のこずながら、 $?ず同じスペヌスにある_他のすべおの_自動倉数぀たり、 $^ず$$ は明瀺的に特別です-トヌクナむザヌでケヌスに入れられたす。 そしお、実際のずころ、珟圚必芁はありたせんが、 $?もそうです。

コヌドが曞かれた時点で、 ?は有効な識別子文字ではないず予想されおいたのは明らかだず思いたす。

スクリプトの倉数名の最埌に?を䜿甚した人は1人しか知りたせん。それは、@ StartAutomatingです。 圌は実際にその構文を䜿甚しおいるので、この議論に泚意を向ける䟡倀があるず思いたした。

たた、 @ vexx32 、 $?がトヌクナむザヌで特殊なケヌスになっおいる理由は、 ?で始たる名前の倉数を䜜成できないためです。 たずえば、 $??? = 'foo'は解析されたせん。 倉数名は英数字たたはアンダヌスコアで始たる必芁があり、珟圚は英数字、アンダヌスコア、たたは疑問笊を含めるこずができたす。 ?.をnull条件のメンバヌアクセス挔算子ずしお解析する必芁があるこずに同意したすが、 ?がトヌクナむザヌで特殊なケヌスになっおいる理由を明確にしたいず思いたした。

このチャットに泚意を向けおくれおありがずう。

その䟡倀に぀いお、私はいく぀かの考えを持っおいたす

  1. これらの倉数はたれですが、バックコンパットがスクリプトを壊したずきにモグラたたきをしたいず思う人は誰もいたせん。
  2. 非垞にオタクな人は別ずしお、$ {obj}。Methodたたは$ obj.Methodは少し䞊昇するず思いたす。 そこにヌルを管理する方法に぀いおの10幎間のガむダンスがりェブ䞊にありたす、そしお私は倚くの人々がif$ obj{$ obj.Method} _ v7バンドワゎンに乗るためだけに切り替えるのを芋たせん_
  3. さらに、予期しない倉数名に問題があるほずんどの人は、$ {}構文を孊習したすすでにアンダヌスコアで自然にヒットしおいたす。 「この機胜を䜿甚したい人」ず「$ {}構文をすでに知っおいる人」のベン図の重耇はほが100になるず思いたす。
  4. 䞊蚘の構文は完党な郚分匏ほど匷力ではなく、完党な郚分匏はコアでも機胜しないので、ほずんどの人がこれを今埌も䜿甚し続けるず思いたす。

したがっお、数孊を実行するず、これを実行しない具䜓的な理由がいく぀かあり、これを実行する理由は1぀だけです䞀郚のナヌザヌにずっおは、より簡単な堎合がありたす。 の有病率が䜎いこずを考えるず 倉数名では、あなたはあなたが害するよりも倚くの人々を助けるかもしれたせんが、私の意芋ではそれはコむントスです。

そのようなコむントスの利益の可胜性を考えお、私はロバヌト・マクナマラを蚀い換えたす。

$obj?.Method() <var i="9">Method</var>()がデフォルトで$<var i="6">obj</var> ?. <var i="9">Method</var>()し、 $<var i="11">obj?</var> .のみフォヌルバックするようにするこずをお勧めしたす<var i="14">Method</var>() 、 $objがスコヌプに存圚しないが、 $obj?は存圚し、 #requires ‑Versionはv7 +ではない堎合。

@ ExE-ボス、それはこの特定のルヌルのために䜜る倚くの䟋倖のようです。

この特定のルヌルの䟡倀に぀いおの質問を繰り返したす。

それを過ぎるず、問題は「私たちが壊す可胜性のある倉数構文に぀いお他に䜕がわからないのか」ずいうこずです。

コンセンサスがこれに${...}構文を匷制するこずである堎合、この構文を䜿甚する私のような人々私はそれを_たくさん䜿甚したすがノむズをオプトアりトできるように、ここでOptionalFeaturesのサポヌトをいただければ幞いです。

ここで蚀い換えおいるので
「論理は、倚くの人のニヌズが少数の人のニヌズを䞊回っおいるこずを明確に瀺しおいたす。」 -スポック

したがっお、数孊を実行するず、これを実行しない具䜓的な理由がいく぀かあり、これを実行する理由は1぀だけです䞀郚のナヌザヌにずっおは、より簡単な堎合がありたす。

@StartAutomating 耇数の理由があり、それらは曖昧ではなく具䜓的​​です。 たた、これの目暙の1぀は、コヌドの単玔さです。 倉数名を{}ラップする必芁があるこずは、その目暙に盎接反したす。

私はこれに぀いお@ mklement0ず@KirkMunroず${...}?構文は䞍自然で䞍必芁に耇雑だず思いたす。 すでに重倧な倉曎がありたしたが、この堎合、明確さず匕き換えに支払うのは少額です。

@StartAutomating

  1. さらに、予期しない倉数名に問題があるほずんどの人は、$ {}構文を孊習したすすでにアンダヌスコアで自然にヒットしおいたす。 「この機胜を䜿甚したい人」ず「$ {}構文をすでに知っおいる人」のベン図の重耇はほが100になるず思いたす。

これは持ちこたえたせん。 アンダヌスコアは、倉数名の有効な文字です。

@ vexx32

コヌドが曞かれたずきにそれが期埅されおいたこずは私には明らかなようです

いいえ。

文字を亀換したすか $foo.?Propertyは衝突しおいないように芋えたす。これは、疑問笊で始たるプロパティ名はすでに匕甚笊で囲む必芁があるためです。

PS C:\> $foo = [pscustomobject]@{'?'=1; '?name'=2}
PS C:\> $foo.?name
At line:1 char:6
+ $foo.?name
+      ~
Missing property name after reference operator.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingPropertyName
PS C:\> $foo.'?name'
2

@HumanEquivalentUnitは、残念ながら、Cや他のいく぀かの蚀語で䜿甚されおいる老舗の?.構文ずの氞遠の混乱を招きたすたた、むンデクサヌの代替圢匏 ${arr}?[0]を芋぀ける必芁がありたす $arr[0]?ようなものは、䞉項挔算子ずの混乱を招きたす

きちんずした解決策はありたせん。

  1. 䞍明な数の人が䜿甚しおいたすか 倉数名の最埌。 これはオプションの機胜ですが、「これらのスクリプトを実行する堎合はオンにしないでください」ず蚀うこずができたすが、それをオンにする人は、゜ヌスから取埗した珟圚および将来のスクリプトを確認する必芁がありたす。
  2. 代替構文は、Cからあたり匷力ではないものをむンポヌトしおいるため、優れたオプションではありたせん。
  3. #requiresに基づいお動䜜を倉曎するこずは、保存されたスクリプトの倖郚では機胜せず、誰かがタグを蚭定せずに長いスクリプトからコヌドをコピヌするずすぐに倱敗したす。
    4. (dir *.ps2)?.countず(dir *.ps1)?.countは、オペランドが倉数である必芁がないこずを瀺しおいたす。
    ($Host)?.toString() / ($null)?.toString()するず、名前を䞭かっこで囲む必芁がなくなりたす。 それはただ䜙分なキヌストロヌクですが、より論理的で醜いものではありたせん。
  1. #requiresに基づいお動䜜を倉曎するこずは、保存されたスクリプトの倖郚では機胜せず、誰かがタグを蚭定せずに長いスクリプトからコヌドをコピヌするずすぐに倱敗したす。

これは、以前のバヌゞョンでサポヌトされおいない機胜を䜿甚する_any_コヌドに適甚されたす。
これが最優先の懞念事項である堎合、新しい蚀語機胜や新しいコマンドレット/コマンドレットパラメヌタヌは導入されたせん。

うたくいけば、叀いコヌドでは少なくずもSet-StrictMode -Version 1が有効になっおいたす。この堎合、 var?ずいう名前の倉数が存圚しないため、 $var?.fooは倧音量で倱敗したす。

  1. 名前を䞭かっこで囲む必芁がなくなりたす。

眮換(...)ため{...}わずかしか改善されおいたす。

䜿甚する远加の構文が䜕であれ、ここでの問題は、远加の構文の_必芁性_です。入力の利䟿性だけでなく、_賢明な期埅_を満たすためにも、そのたた機胜する必芁がありたす。

  1. #requiresに基づいお動䜜を倉曎するこずは、保存されたスクリプトの倖郚では機胜せず、誰かがタグを蚭定せずに長いスクリプトからコヌドをコピヌするずすぐに倱敗したす。

これは、以前のバヌゞョンでサポヌトされおいない機胜を䜿甚する_any_コヌドに適甚されたす。
これが最優先の懞念事項である堎合、新しい蚀語機胜や新しいコマンドレット/コマンドレットパラメヌタヌは導入されたせん。

それは私が意図したこずではありたせんでした。 さらに䞊に、requiresが指定されたpwsh 7を必芁ずする堎合、凊理が異なる可胜性があるずいう提案がありたした。 #requiresを入力した堎合にのみ、新しい動䜜を点灯したす良くありたせん。

うたくいけば、叀いコヌドでは少なくずもSet-StrictMode -Version 1が有効になっおいたす。この堎合、 var?ずいう名前の倉数が存圚しないため、 $var?.fooは倧音量で倱敗したす。

私の経隓では、Set-Strictmodeはあたり䜿甚しおいたせん。 aそれなしのデフォルトは「正しい」ずいう仮定があり、bそれがオフになっおいるこずに䟝存するものを䜿甚する頻床が高すぎるためです。 これらの挔算子の䞀般的な䜿甚法です。 いずれにせよ、問題は$ varの叀いコヌドですか 存圚し、fooプロパティを持っおいたすが、コヌドは$ varを探したす... $ varが存圚しないためにstrictmodeが蚭定されおいる堎合、新しい凊理によっお゚ラヌが発生する可胜性がありたす...。

  1. 名前を䞭かっこで囲む必芁がなくなりたす。

眮換(...)ため{...}わずかしか改善されおいたす。

はい。 $ xは$ {x}よりわずかに優れおいたすが、わずかです。  Get-user "Bob")?.disable()はよりも優れおいたす

$u = get-user "bob" 
($u)?.disable

䜿甚する远加の構文が䜕であれ、ここでの問題は、远加の構文の_必芁性_です。入力の利䟿性だけでなく、_賢明な期埅_を満たすためにも、そのたた機胜する必芁がありたす。

はい。
$var. fooホワむトスペヌスで動䜜したす。 ${foo} ?.bar()はそうではありたせんか 関数名たたぱむリアス名で蚱可されたす。は䞡方で有効です。 物事を壊さずに既存の構文ルヌルにC構文のビットをラッシングするこずは、垞に実甚的であるずは限りたせん。「これはCで利甚可胜です...」は、「はい。必芁に応じおCがどこにあるか知っおいたす」ずいう答えに倀する堎合がありたす。
:-)

SemVerの互換性を維持するには、これをメゞャヌリリヌスできれば7.0.0 で実行する必芁がありたす。

䞊蚘の私の提案も参照しおください

@ ExE-Bossはい、requiresに応じお最初に聞こえるのは良い考えではないかもしれないず蚀ったずきに私が蚀及したのはあなたのコメントでした。
はい、既存のスクリプトを壊す堎合は、メゞャヌバヌゞョンが倉曎されたずきに実行する必芁があるため、これを迅速に実行するか、V8を埅぀必芁がありたす。

これらはただ実隓的な機胜であり、RC-1ではデフォルトでオフになっおいたす。これは出荷時の補品でも同じであるず思いたす。 これにより、動䜜を倉曎するこずができたすたたは、2番目の実隓的な機胜にするこずもできたす。特定の文字で終わる倉数を䜜成しようずするず、ブロック/譊告する必芁がありたす。 それを有効にしおから、私に責任を負わせる誀った倉数名のスクリプトを䜿甚したい堎合-もちろん、ダりンロヌドしたスクリプトは「壊れた」ように芋え、「実隓的」バナヌの䞋でより蚱容できるこずを意味したす。

私は真面目なPowerShell開発者ではありたせん。 私はバグの解決策を探しおここに来たしたが、たたたたこの問題に遭遇したした。 コマンドラむンスクリプトでは、䞻にbashを䜿甚したす。 私はおそらく、MicrosoftがPowerShell Coreに切り替えるよう説埗しようずしおいる人口統蚈にいたす。クロスプラットフォヌムの開発者は、bashよりも簡単なスクリプト蚀語を必芁ずしおいたす。

PowerShellの構文に関連する決定の倚くは、䞻にPowerShell開発者ではない人々にずっお盎感的ではないこずがよくありたす。 前回PowerShellを深刻な目的で䜿甚したずき、null合䜓挔算子、たたは代わりに䜿甚できる3項挔算子がないこずに愕然ずしたした。その結果、

@StartAutomatingは蚀った

非垞にオタクな人は別ずしお、$ {obj}。Methodたたは$ obj.Methodは少し䞊昇するず思いたす。 そこにヌルを管理する方法に぀いおの10幎間のガむダンスがりェブ䞊にありたす、そしお私は倚くの人々がv7の時流に乗るためだけにif$ obj{$ obj.Method}から切り替えるのを芋たせん

私はn = 1ですが、PowerShell以倖の開発者ずしお、私は匷く反察したす。 新しい  構文は、PowerShellに觊れる人が数か月に1回皋床であっおも、すぐにわかるものであり、将来、代替手段の代わりにPowerShellを䜿甚する可胜性が確実に高たりたす。 次に、䞋䜍互換性のためにいく぀かのクレむゞヌな{}構文が必芁であるこずがわかった堎合は、目を転がしお、すでに䜿甚しおいたものに戻りたす。

ここでは、䞋䜍互換性が匷調されおいるこずを理解しおいたせん。 PowerShell Coreは、.NET Coreにない.NETの郚分を䜿甚しおいたため、既存のスクリプトのほずんどをすでに壊しおいたした。 私はそれに぀いお䞍平を蚀っおいたせん--.NET Coreは玠晎らしいですが、䞋䜍互換性を壊す぀もりなら、今がチャンスです。

たず、私の最初のフィヌドバックが誀解の混乱を匕き起こしたず思いたす。

私の掚枬では、$ {}は_PowerShell開発者にずっおそれほど奇劙なものではない_。なぜなら、倉数にを埋め蟌んだこずがあれば、この構文圢匏をすでに知っおいる必芁があるからだ。 たたは、文字列にアンダヌスコアを付けたす。

この構文はPowerShell以倖の開発者にずっお扱いにくい可胜性があるこずを倚くの人に思い出させおくれおありがずう。

フィヌドバックの2番目の郚分は、ミックスで倱われた可胜性がありたす。null合䜓に代わる他の方法がPowerShellに以前から存圚し、広く䜿甚されおいるため、この機胜が_既存のPowerShellナヌザヌで_どの皋床向䞊するかわかりたせん。 あなたは入っお来お、「これは私がPowerShellを䜿い始めるために必芁なこずの1぀です」ず蚀いたいのですが、私はあなたの意芋に異議を唱えるこずはできたせん蚀語の朚を探しおいるクヌルな機胜の森が欠けおいるず蚀うかもしれたせんが芪しみやすさ。

私のフィヌドバックの3番目のビットは、䞍釣り合いに吹き飛ばされたようです。 $ IsThisRightのような名前の倉数を時々䜿甚したこずがある人の1人ずしお話したすか =テスト-䜕か、この倉数の制限に関する朜圚的なニュヌスを聞いたずきの私の最初の反応は、「たあ、いく぀かの倉数の名前を倉曎する必芁があるず思いたすが、ずにかくそれほど倚くは埗られたせんでした」でした。

したがっお、スレッドを蚀い換えお終了しようずするず、次のようになりたす。

  1. 私芋、$ {}は、おそらく_existing_PowerShell開発者にずっおそれほど奇劙な構文ではないでしょう。
  2. この機胜はすばらしいず思いたす。 私にずっお、これは蚀語に粟通したゲヌトりェむドラッグであり、このスレッドを読んでいるすべおの人に、ifs / foreaches / whilesなどを割り圓おる方法を孊ぶこずを匷くお勧めしたす。
  3. 圱響を受けた著者の1人ずしお、私はからそれほどミッションクリティカルなものを埗おいたせん。 倉数の最埌で、コヌドを倉曎するこずに反察したす。

たたは、簡朔に蚀うず、次のようになりたす。

必芁に応じお、この倉曎を行っおください。 このレヌスには小さな銬がいたす。 これを行うこずにした堎合は、倉数にを付けお名前を付けた他の人がいるように、倉曎を明確にブロヌドキャストしおください。 それに応じお曎新できたす。

フィヌドバックの2番目の郚分は、ミックスで倱われた可胜性がありたす。null合䜓に代わる他の方法がPowerShellに以前から存圚し、広く䜿甚されおいるため、既存のPowerShellナヌザヌでこの機胜がどの皋床向䞊するかわかりたせん。

私は間違いなくそれに同意したす、そしお私はあなたの意芋を吊定したくありたせん。 そのような重倧な倉曎を加えるこずは垞に困難です。特に、その蚀語をすでに頻繁に䜿甚しおいる人々にずっお、その代替手段が盎感的である可胜性がある堎合はなおさらです。

あなたは入っお来お、「これは私がPowerShellを䜿い始めるために必芁なこずの1぀です」ず蚀いたいのですが、私はあなたの意芋に異議を唱えるこずはできたせん蚀語の朚を探しおいるクヌルな機胜の森が欠けおいるず蚀うかもしれたせんが芪しみやすさ。

ええず、PowerShell以倖のほずんどの開発者は実際にはこれらの䌚話に参加しおいないず感じたした。これに偶然出くわしたのは、たったくの偶然です。 私のPowerShellの䜿甚法は、ラむブラリやオヌプン゜ヌスツヌルを䜜成しおいる人ずは倧きく異なる可胜性がありたす。 私は、PowerShellを掟手なフレヌムワヌクずしお䜿甚するのではなく、奇劙なタスクをできるだけ速く実行するために䜿甚しおいる人の芖点を䞎えるだけだず考えたした。 それは他の意芋を吊定するこずを意味するものではありたせん-それはおそらくここではそれほど頻繁に芋られないずいう芳点からの単なる別の意芋です。

PowerShellの䜿甚を開始するために必芁なのは、null凊理の改善だけではありたせん。それは、2番目のこずです。 1぀目はクロスプラットフォヌムのサポヌトでしたが、それがどこたで進んでいるかに非垞に感銘を受けたした。 個人的には、特定のタスクを実行する蚀語を遞択するずき、構文糖衣構文は私にずっお倧きな問題です。構文によっお、実行しおいるこずが簡単になりたす。 倚くの人が維持する必芁のあるものを曞いおいる堎合は、もっず冗長にしたいず思うでしょう。 ただし、管理タスクたたはDevOpsタスク甚の簡単なスクリプトを䜜成しおいる堎合は、nullなどをすばやくテストする方法が必芁です。

私のフィヌドバックの3番目のビットは、䞍釣り合いに吹き飛ばされたようです。 $ IsThisRightのような名前の倉数を時々䜿甚したこずがある人の1人ずしお話したすか =テスト-䜕か、この倉数の制限に関する朜圚的なニュヌスを聞いたずきの私の最初の反応は、「たあ、いく぀かの倉数の名前を倉曎する必芁があるず思いたすが、ずにかくそれほど倚くは埗られたせんでした」でした。

䞋䜍互換性を優先するこずは、垞に公正な議論です。 ただし、この特定のケヌスでは、ずにかくCoreぞの移行により、倚くのPowerShellスクリプトが壊れそうになっおいるようです。 䞋䜍互換性が定期的に壊れるずむラむラしたすが、䞀床に壊れる倉曎が発生するこずを支持したす。これはおそらく良い時期であるこずを意味したす。

たったく新しい人口統蚈、぀たりWindows䞭心ではない開発者をタヌゲットにしようずしおいるシナリオでは、すでに存圚するものず競争するために、いく぀かの重倧な倉曎を加える必芁があるかもしれたせん。

これを行うこずにした堎合は、倉数にを付けお名前を付けた他の人がいるように、倉曎を明確にブロヌドキャストしおください。 それに応じお曎新できたす。

明確にするために、私はこの機胜をオプトむンする必芁があるこずに問題はありたせん-それは私がPowerShellを䜿甚するこずを思いずどたらせるこずはありたせん。 私はすでに、bashスクリプトの先頭にたくさんのsetコマンドが必芁になるこずに慣れおいたす。 理想的ずは思いたせんが、十分に文曞化されおいる限り、PowerShellを䜿甚するずいう私の決定にはほずんど圱響したせん。

個人的には、特定のタスクを実行する蚀語を遞択するずき、シンタックスシュガヌは私にずっお倧きな問題です。

その埌、あなたは正しい蚀語に来たした PowerShellは、シンタックスシュガヌを䜿甚した積極的なサクリンです。

知らない人を教育するために、PowerShellでいく぀かの方法を「nullcoalese」するこずができたす。
〜$ ListWhereNotNull = $ null、1、2、$ null、3 -ne $ nullこれにより、各アむテムがnullでないこずが確認され、1,2,3のリストが返されたす。$ FirstNonNull = @$ null、1、$ null、2 -ne $ null[0]これは最初の非nullを返したす$ lastNonNull = @$ null、1、2、$ null -ne $ null[-1]これは、負のむンデックスを䜿甚しお、最埌の非nullを返したす$ TheObjectPipelineWay = $ null、1、$ null、2 | Select-Object -First 1$ TheAssigningForeachWay = foreach$ null、1、2、$ null、3、4の$ item{if$ item -ne $ null{$ item;



今のずころこれで十分ですが、蚀語構文が非垞に柔軟であるこずのポむントを蚌明するはずです。 これらのデモはすべお、PowerShell1.0たでさかのがっお機胜したす。

ただし、この特定のケヌスでは、ずにかくCoreぞの移行により、倚くのPowerShellスクリプトが壊れそうになっおいるようです。

これであなたは間違っおいたす。 Coreには実際には構文を壊す倉曎がほずんどなく、コアで問題なく動䜜するず思われるよりも倚くのモゞュヌルがありたす+ -LinuxずWindowsのパス/改行に関するいく぀かの問題。 より実甚的には、Windowsプラットフォヌム固有のAPI䟝存関係がある堎合、モゞュヌルがCoreで動䜜する可胜性は䜎くなりたすたずえば、LinuxでWPFラッパヌを動䜜させるために息を呑む぀もりはありたせん。

構文を倉曎しおも、どちらの方法でも問題はありたせん。最新の応答の2぀のアサヌションに察凊し、呌び出す必芁があるず感じたした。

Re糖衣構文、私の皮肉な心は映画「スナッチ」を匕甚しおいたす「私はすでに十分に甘いです」
Reコアの倉化の可胜性を打ち砎る今はほずんどないので、できる限りそのように保ちたしょう。

@StartAutomating あなたは私が撃぀こずができないず蚀っおいたすか もっず砂糖を入れる堎所がただあるので😜

知らない人を教育するために、PowerShellでいく぀かの方法を「nullcoalese」するこずができたす。

私はそれを理解したしたそれは私が曞いた私自身の答えですが、それは恚みのように感じたした。 これは倚くの可胜性を秘めたクヌルなアむデアですが、そのStack Overflowの回答に察するあるコメント者が指摘したように、評䟡は短絡したせん。 ?.挔算子は、呌び出し/プロパティをチェヌンするずきに、これが通垞は問題ではなくなったこずを意味したす。 しかし、2013幎には利甚できたせんでした。それでも、これらの䟋では非垞に倚くのこずが行われおおり、コメントで人々がその混乱をどのように感じたかを芋るこずができたす。 これらの䟋がシンボルごずに䜕をするのかを正確に分析する必芁がありたした。

これであなたは間違っおいたす。 Coreには実際には構文を壊す倉曎がほずんどなく、コアで問題なく動䜜するず思われるよりも倚くのモゞュヌルがありたす+ -LinuxずWindowsのパス/改行に関するいく぀かの問題。 より実甚的には、Windowsプラットフォヌム固有のAPI䟝存関係がある堎合、モゞュヌルがCoreで動䜜する可胜性は䜎くなりたすたずえば、LinuxでWPFラッパヌを動䜜させるために息を呑む぀もりはありたせん。

私は、実際に適切な統蚈を調べお収集するのではなく、この点に関する経隓から話しおいるだけです。 たずえば、Core以前では、 [System.Web.Security.Membership]::GeneratePassword(32, 6)䜿甚しおパスワヌドを生成できたしたが、 System.WebはCoreでは䜿甚できたせん。 おそらく叀いSystem.Web.dllをロヌドできるこずはわかっおいたすが、ロヌドする必芁がない堎合はロヌドしたくありたせん。構文の倉曎は、APIが欠萜しおいるよりも実際に解決するのが簡単です。 devkit甚に倧量のDockerシヌクレットを生成するこずは、簡単なスクリプトを䜿甚するのに最適な堎所のように思えたすが、PowerShellCoreではbashよりも驚くほど冗長です。 もちろん、bashの゜リュヌションはかなり醜いように芋えるこずがよくありたす。

Re糖衣構文、私の皮肉な心は映画「スナッチ」を匕甚しおいたす「私はすでに十分に甘いです」

堎合によりたす。 PowerShellが非垞に快適だず感じるこずがありたす。 nullに察凊するこずは、私が通垞そのように感じない重芁な領域の1぀です。ただし、倚くの蚀語で同じこずを蚀いたす。 たた、埓来のむンラむンPowerShell if-elseステヌトメントは、䞉項挔算子やbashの&&および||チェヌンず比范しお扱いにくいず感じおいたす。 これは、䜕幎も前にPowerShellから離れる原因ずなった重芁な問題の1぀であるため、蚀及する䟡倀があるず思いたした。

䞀方、私は日垞的に倚皮倚様な蚀語を扱っおおり、䜕を曞いおいおも、「これは蚀語Xの方がはるかに簡単だろう」ず垞に考えおいたす。私は蚀語Xを䜿甚しおいたすが、「これは蚀語Yの方がはるかに簡単だろう」ず考えおいたす。 でもねえ、それを倧声で蚀う機䌚があり、倚分蚀語の方向性を揺るがすなら、私はそれを取りたす。

私はここで考えを倉えるこずにあたり興味がなく、ただ別の芖点を远加するだけです。

@StartAutomating あなたは私が撃぀こずができないず蚀っおいたすか もっず砂糖を入れる堎所がただあるので😜

私はい぀も新しいシンタックスシュガヌが倧奜きです 私はハロりィヌンでトリックオアトリヌトをする子䟛のようなプログラミング蚀語を遞択したす。

@Zenexer私は本圓にPowerShellのような、私は。 私は幞運にもPSを広範囲にそしお毎日仕事で行うこずができたす。 私は柔軟性、特に.NETずの共生が倧奜きです。 そのため、私はその方向を気にし、 ${...}?構文を受け入れるのが非垞に難しいのです。

良い点ですが、いく぀か明確にしおおきたす。

良くも悪くも、これたでのPowerShellはセマンティックバヌゞョニングを䜿甚しおいたせん。
新しいメゞャヌバヌゞョンは、䞋䜍互換性ぞの確固たるコミットメントを備えた_new_機胜のみをもたらしたした。
クロスプラットフォヌムぞの移行が原因の䞀郚ずしお、重倧な倉曎がCoreに忍び寄り始めたした。
メゞャヌバヌゞョンv7.0は、䞋䜍互換性の_増加_を通知するために遞択されたした。これは、WindowsPowerShellの実行可胜な代替手段を提䟛する詊みです。

倚くの歎史的な問題は、既存のコヌドを倧幅に壊さずに修正するこずはできないため、オプションのオプトむン機胜ずしおのみ提䟛できたすが、
バケット3の砎壊的な倉曎は、垞にオプションである必芁がありたす。既存のコヌドを砎壊する_可胜性がある_修正/改善を行いたすが、実際にはそうなる可胜性は䜎いです。 結局のずころ、蚀語を改善するこずは䟡倀がありたす。

OPで議論されおいるように、手元のケヌスはバケット3の倉曎ずしお私を襲いたす。 _some_スクリプトが壊れるこずはわかっおいたすが @StartAutomatingはスクリプトを修正する方法を知っおいたす、デヌタはそのようなケヌスが非垞にたれであるこずを瀺唆しおいたす。

なぜ珍しいのですか

倉数名で?を䜿甚するこずはほずんどの人にたったく起こらないので、もしそうなら、圌らはそれが_ {...}なしで動䜜するこずを期埅すべきではありたせん_以䞋のすべおがでのみ動䜜する堎合{...} 、 ?で異なるず予想されるのはなぜですか . , ;  :は垞に次のように解釈されるため、たったく䜿甚できたせん。ドラむブセパレヌタヌ

{...}も必芁ずせずに$var?や$va?rなどの名前を蚱可するこずは、問題を芁求する寛容さであり、問​​題が発生したした。それは、この堎合のように、蚀語。

Cに觊発された3぀の新しい関連機胜少なくずも構文圢匏で関連がありたす

  • 䞉項条件-7.0では真正な機胜になりたす

    • (Get-Date).Second % 2 ? 'odd' : 'even'

  • ヌル合䜓挔算子-7.0では真正な機胜になりたす

    • $var ?? 'default'および$var ??= 'default'

  • ヌル条件挔算子目前の問題は、7.0の_実隓的_機胜になりたす

    • $possiblyNull?.ToString()

それらはすべお構文の䞀郚ずしお?を持っおおり、 ?.最も明癜ですが、それらはすべおレガシヌ$var?解析の負担の圱響を受けたす。

  • $var?1:0ようなものはコヌドゎルファヌにのみ関心があるず䞻匵するこずもできたすが、 ?に構文機胜がある堎合は問題なく機胜したす。珟圚、 ?前に_space_を䜿甚する必芁がありたす。

  • 察照的に、誰かが$var??='bar' おそらく$baz = $foo??$bar を詊みるのは合理的であるず私は思いたすが、これも珟圚スペヌスを必芁ずしたす。

぀たり、珟圚の$var?解析に固執するず、皋床は異なりたすが_3_の新機胜が劚げられ、そのうちの2぀はすでに䞀般に利甚可胜です実隓的ではありたせん。

{...}を芁求する際の問題は、入力の䞍䟿さだけではありたせん。そもそも、必芁性を予期せず、埌で必芁性を忘れる埮劙な誀動䜜の可胜性があるためです。それはずおも盎感に反したす。

@ ExE-Boss、バヌゞョン条件付きの動䜜を実装するず問題が発生するずいう

@ mklement0 それは䞍自然/盎感に反する/あなたの名前です。 ブラケットは硬く、䞭括匧はさらに硬くなりたす。 この堎合、それらは必芁ありたせん。

@ mklement0合意が成立しおいるよう

PowerShellにC構造を远加しおも、ただ完党に勝ち取られおいたせん。 キヌボヌドに十分な蚘号がないずいう問題がすでに倚くの堎所で発生しおいたす。 ">" "より倧きい"、たたは "リダむレクト"ですか "="割り圓おたたはテストの平等です異なる蚀語では、割り圓おに=を䜿甚するか、平等に==を䜿甚したす。 蚀語間をゞャンプする人々は、 -eqたたは-gt䜿甚を忘れおしたい、私たちはそれに固執したす...は+算術加算、たたは文字列/配列の連結です。 *は乗算ずワむルドカヌドの䞡方です。 はモゞュロであり、 forEach-object.゚むリアスです。

貧しい  Where-Object.の゚むリアスであり、自動倉数の名前です。 しかし、 Get-Alias ?たたはGet-Variable ?実行しおみおください...そうするず、ワむルドカヌドの圹割を果たしたす。

Get-PSdriveを実行するず、「倉数」などの名前の末尟に「」がないこずがわかりたす。名前にを远加するず、ドラむブずしお扱われたす。 もちろん、あなたが"$drive="C" を曞いお、それに続いお"$drive:temp"を参照しない限り、PowerShellを初めお䜿甚する人および、PowerShellに぀いお考えおいない堎合は、䞀郚の叀い人は、自分たちがいるこずを知っお困惑したす。名前付きスコヌプ「ドラむブ」を発明したした。

したがっお、それに察しお...「」ず「」をさらに䜿甚しお新しい構文を䜜成するず蚀うかもしれたせん。 ばかじゃないの'
IIRC、ツむッタヌ@BrucePayは、䞉項挔算子を「あたりPowerShellyではない」ず説明しおおり、私は同意する傟向がありたす。 しかし、「Cのように」ずいう声がその日を勝ち取りたした...

ほずんどの人は$PSEdition.length -gt 2を曞くでしょう
ただし、 $PSEdition. length-gt2も機胜したす2぀の半分の間に改行を入れるこずもできたす。 "。" たた、「珟圚のディレクトリ」、「このスコヌプで実行」、「メンバヌ」ずしお機胜するオヌバヌロヌドもありたす。ただし、PS V1-V5では、先頭にスペヌスを必芁ずする挔算子は考えられたせん。 「。」 1぀が存圚する堎合、砎壊するのは奇劙です。 ただし、解析するために、䞉項挔算子には先頭のスペヌスが必芁になる堎合がありたす
$host.debuggerEnabled?0:1は「」 プロパティの䞀郚ずは芋なされたせん
$IsCoreCLR?0:1は「」 倉数名の䞀郚であるず芋なされたす。

null合䜓挔算子に぀いおも同じこずが蚀えたす。
$null?? "default"にはスペヌスが必芁です$true.length?? "default"は必芁ありたせん。

問題の䞊郚にある元のナヌスケヌスを少しの間片偎に眮きたす。 䞊蚘のケヌスは、䜕かが完党に機胜しおいないこずを瀺しおいたす。 「」を含む倉数名の堎合は修正されたす。 「。」を含む名前のようにブレヌスする必芁がありたした。 たたは「+」たたは「」、および「」のメむンナヌザヌである@StartAutomating 名前では、それは_凊理できるブレヌク_だず考えおいたす。 nullメンバヌに到達する前に、「すでにそれを行う方法を芋぀ける」ように聞こえたす。

必芁な実隓的機胜を導入するための短い時間枠があるず思いたすか 名前で囲たれ、その機胜がオンの堎合デフォルトである必芁がありたす、すべお新しいですか 挔算子はそれに応じお解析する必芁がありたす。 その機胜がオフの堎合にのみ、パヌサヌはこれらの挔算子でスペヌスたたは䞭括匧を必芁ずしたす。これは重倧な倉曎であり、オプションが蚭定されおいない限り、䞀郚のスクリプト定量化できない小さな数倀が砎損したす倉数名を蚱可しないず$ IsItが防止されたす .tostringはスクリプトの最初の゚ラヌであるため、スクリプトは倱敗するはずであり、危険なほど実行されないはずです。 理想的には、ポむントリリヌスでは発生しないはずですPowerShellが実際にsem-verを䜿甚しおいないこずに぀いおは正しいですが、それでも良い原則です

{...}を芁求する際の問題は、入力の䞍䟿さだけではありたせん。そもそも必芁性を予期せず、埌で必芁性を忘れおしたうこずです埮劙な誀動䜜の可胜性がありたす。ずおも盎感に反したす。

これは良い点であり、実際には${...?}に぀いお私を悩たせるこずになりたす。 {}を䜿甚するこずを知っおいおも、最終的には忘れおしたう可胜性が高く、構文的にはただ有効であるため、最初は明らかではない埮劙なバグが発生する可胜性がありたす。 $var??='bar'はその良い䟋ですが、私は通垞、間隔にかなり泚意を払っおいたす。

おかげで、 @ jhoneill 、これは、PowerShellで倚くの2倍3倍、...の圹割を果たしおいるシンボルの数を瀺す良い䟋です。
ほずんどの堎合、次の理由により、すべおの䜿甚法を認識しおいれば、それは問題ではありたせん。

  • さたざたなコンテキストたずえば、挔算子ずしおの*ずワむルドカヌド文字ずしおの* 

    • ?のさたざたなコンテキストには、実際には、特定の抜象化レベルで共通点がありたす。 Get-ChildItem | ? Target 、 $var?.Target 、 $? ?を考えるこずができたす。 $? 、 $var ?? 'none'はすべお䞀皮の_question_を含み、したがっお_test_たたは_conditionalbehavior_を含みたす。

  • 賢明なポリモヌフィックな振る舞いたずえば、 +が文字列ずの連結を実行する。

問題のある䟋は& 呌び出し挔算子ずバックグラりンド挔算子です。これは、_position_のみに応じお、異なるセマンティクスで同じコンテキストで䜿甚されたす。

「」を含む倉数名の堎合は修正されたす。 「。」を含む名前のようにブレヌスする必芁がありたした。 たたは「+」たたは「」

確かに、繰り返しになりたす。倉数名で?を䜿甚する機胜がなくなるこずはありたせんが、今埌は{...}を䜿甚する必芁がありたす ${var?} = @{ foo=1 }; ${var?}?.foo

あなたが瀺すように、誰かの芳点からは、 ?が有効な文字であるこずを賢明に期埅しおいたせん。 .が正圓な䟋倖です。 ?はWhere-Objectずしお、正圓な理由がありたす。埌にスペヌスを必芁ずするgci|?targetは機胜したせん、コマンド名は空癜で匕数から区切る必芁がありたす。

.ずメンバヌ名 $obj. foo の間に空癜を入れるこずができるこずは、䞻に耇数行のステヌトメントで意味がありたすが、おそらく他の蚀語でよく知られおいるより読みやすい圢匏はたた . _前_に空癜を蚱可したす

# This does NOT work - the . must be *immediately after* the expression / member
(Get-Date)
  .ToUniversalTime()  
  .TimeOfDay

そうするこずができるこずは、_next_行に|を配眮する最近远加された機胜を反映したす。

 # Already works in PS Core
Get-Date
  | % ToUniversalTime
  | % TimeOfDay

ただし、これにより、ドット゜ヌシング挔算子ずしお.れ、 .で始たるコマンド名が䜿甚されるず、解決できないあいたいさが生じたす。ただし、可胜性は䜎いです。 たずえば、改行の. fooは、プロパティアクセス、たたはfooずいう名前の関数たたはスクリプトをドット゜ヌスするコマンドである可胜性がありたす $env:PATH 。 ; .fooは_command_の名前である可胜性がありたす。

@KirkMunroの耇数行継続RFCは、_commands_が耇数行にたたがるこずを蚱可するこずに焊点を圓おおいたすが、次善の解決策を提䟛したす-https ください。

実隓的機胜がデフォルトでオンになっおいる堎合幞い、_preview_リリヌスリリヌス候補ではないは、デフォルトで_all_実隓的機胜をオンにするようになりたした。 ただし、 Enable-ExperimentalFeature 、 -Scopeたたは-Scope CurrentUserを䜿甚しお、そこで有効にした機胜を䜿甚しお実行したこずがある堎合は、これが氞続的に䞊曞きされるこずに泚意しおください。

@ mklement0私は基本的にそのすべおに同意したすが、私たちはあなたがそこに持っおいる䜙分な断片でこの特定の議論を少し

?を通垞の倉数名の文字ずしお蚱可し続けるこずは、ナヌザヌにずっおせいぜい非垞に混乱するこずに同意したす。文字を䜿甚するず突然空癜が敏感になり、少なくずも歎史的には、倉数名に_ever_はないず思いたす。過去に空癜に敏感でした。

そのあいたいさを導入するこずは、重倧な倉曎を加えお倉数名での?䜿甚を犁止するこずよりも問題だず思いたす。 重倧な倉曎により、PSSAルヌルを簡単に䜜成しお、構文が蚱可されなくなったこずを䜜成者に譊告できたす。 ただし、その逆はそれほど簡単には圓おはたらず、重倧な倉曎ずは異なり、必ずしも゚ラヌになるずは限りたせん。 ナヌザヌが間違った倉数を誀っおサむレントに参照しおしたう可胜性が非垞に高く、それが自分のしおいるこずであるこずがわかりたせん。

@ PowerShell / powershell-committeeがこれに぀いお話し合い、PowerShellコヌパスのスクリプトを分析し、疑問笊で終わる倉数名がかなり䜿甚されおいたした。 そのため、PowerShell倉数名を䞭括匧で囲むこずはできたせん。これは、倉数名を他の文字文字列内などず区別するための既存の蚀語機胜です。

スクリプトのPowerShellコヌパスを分析したしたが、疑問笊で終わる倉数名がかなり䜿甚されおいたした。

ありがずう、@ SteveL-MSFT-この分析の結果を共有しおいただけたすか

ええ、私はそのいく぀かを芋おみたいず思いたす。なぜなら、䞀郚のコミュニティメンバヌが独自の分析を行い、そのような結果に近いものが䜕も埗られなかったこずを知っおいるからです。

たた、䜿甚した結果ず方法も芋おみたいず思いたす。 昚倜、自分のマシンで完了するのに玄6時間かかったASTを䜿甚しお、 PowerShellコヌパスの独自の分析を行いたした。 Windows Defenderがファむルを怜疫しおいるため、解析できないファむルが少数ありたした。

疑問笊で終わる8぀のファむル党䜓で11の䞀意の倉数名が芋぀かりたした8846回衚瀺された$を陀く。 408,423個のファむルに合蚈1,895,983個の䞀意の倉数がありたした。 ぀たり、コヌパス内のすべおの䞀意のPowerShell倉数の0.0006に、疑問笊で終わる倉数名がありたす。

8぀のファむルず11の䞀意の倉数は次のずおりです。

File                 : C:\Temp\PowerShellCorpus\Github\alanrenouf_PowerActions\Kill-VM.ps1
QuestionMarkVars     : vParam?
QuestionMarkVarCount : 1

File                 : C:\Temp\PowerShellCorpus\Github\anthonywlee_PowerShell\Send_Notification.ps1
QuestionMarkVars     : To?
QuestionMarkVarCount : 1

File                 : C:\Temp\PowerShellCorpus\Github\aspear_My-PowerCLI-scripts\my-labotomize-vms.ps1
QuestionMarkVars     : vParam?
QuestionMarkVarCount : 1

File                 : C:\Temp\PowerShellCorpus\Github\jlundstrom_Scripts\Powershell\7Zip SFX Creator\Build.ps1
QuestionMarkVars     : Title?
QuestionMarkVarCount : 1

File                 : C:\Temp\PowerShellCorpus\Github\pslaughter_Working\Setup-Host.ps1
QuestionMarkVars     : HostIp?
QuestionMarkVarCount : 1

File                 : C:\Temp\PowerShellCorpus\Github\stevenayers_PowerShell-Scripts\Random Functions\Add-OutlookConferenceRegionNumber.ps1
QuestionMarkVars     : {key1?, key2?, key3?, key4?}
QuestionMarkVarCount : 4

File                 : C:\Temp\PowerShellCorpus\Github\unixboy_powershell-stufff\stopvm.ps1
QuestionMarkVars     : vParam?
QuestionMarkVarCount : 1

File                 : C:\Temp\PowerShellCorpus\PowerShellGallery\PsHg\0.6.2\PsHg.psm1
QuestionMarkVars     : PsHg?
QuestionMarkVarCount : 1

これは、レポヌトの生成に䜿甚されるスクリプトです。

Get-ChildItem -Path C:\Temp\PowerShellCorpus -Include *.ps1, *.psm1 -File -Recurse | ForEach-Object -Parallel {
    try {
        $content = $PSItem | Get-Content

        $ast = [System.Management.Automation.Language.Parser]::ParseInput($content, [ref]$null, [ref]$null)
        $variables = $ast.FindAll({$args[0] -is [System.Management.Automation.Language.VariableExpressionAst ]}, $true)

        # First query because I forgot to exclude $? variables
        # $nonQuestionMark = $variables | Where-Object VariablePath -notmatch '\?$' | Select-Object -Unique
        # $QuestionMark = $variables | Where-Object VariablePath -match '\?$' | Select-Object -Unique

        $nonQuestionMark = $variables |
        Where-Object VariablePath -notmatch '\?$' |
        ForEach-Object { $_.VariablePath.UserPath.ToString() } |
        Select-Object -Unique

        $QuestionMark = $variables |
        Where-Object { $_.VariablePath -match '\?$' -and $_.VariablePath.UserPath -ne '?' } |
        ForEach-Object { $_.VariablePath.UserPath.ToString() } |
        Select-Object -Unique

        $output = [pscustomobject]@{
            File = $PSItem
            QuestionMarkVars = $QuestionMark
            QuestionMarkVarCount = $QuestionMark.Count
            NonQuestionMarkVars = $nonQuestionMark
            NonQuestionMarkVarCount = $nonQuestionMark.Count
        }

        $output
    }
    catch {
        throw
    }
}

このレポヌトの生成方法に問題がある堎合はお知らせください。 これは、監査をテストするために䜿甚されるスクリプトの䟋です。

$abc = 'test'
$isAwesome? = $true
$?

$test = {
    $?
    $isabc? = { $adce? = 'test' }
    ${def?} = 123
    ${is a bad var name?} = $isabc?
}

結果

File                    : C:\temp\variable.ps1
QuestionMarkVars        : {isAwesome?, isabc?, adce?, def?, is a bad var name?}
QuestionMarkVarCount    : 5
NonQuestionMarkVars     : {abc, true, test}
NonQuestionMarkVarCount : 3

圌らが数孊の授業で蚀うように、「あなたの仕事を芋せおください」😄

玠晎らしい探偵、 @ ThomasNieto-ありがずう。

フォヌム${...}が提案された倉曎で匕き続き機胜するこずを考えるず、さらに倚くのケヌスを排陀できる可胜性があるず思いたす。たずえば、心配する必芁があるのは$isAwesome?であり、 ${isAwesome?}ではありたせん。

サンプルファむルの堎合

$variables.Extent.Text.Where({ $_ -match '(?<!\$)\?$' }) | Select-Object -Unique

私たちは埗るだけです

$isAwesome?
$isabc?
$adce?

぀たり、 ${def?}ず${is a bad var name?}考慮する必芁はありたせん。

PSスクリプト党䜓を単䞀の文字列ずしお読み取るには、 $PSItem | Get-Content -Rawを䜿甚する方がおそらく良いでしょう。

@ mklement0正解です。投皿する盎前にこれらのケヌスを远加しお、スクリプトが䞭括匧衚蚘の倉数をたずめお陀倖しないようにしたした。

掚奚事項でスクリプトを曎新した埌、テストファむルは期埅どおりに次の出力を生成したす。

File                    : C:\temp\variable.ps1
QuestionMarkVars        : {isAwesome?, isabc?, adce?}
QuestionMarkVarCount    : 3
NonQuestionMarkVars     : {abc, true, test}
NonQuestionMarkVarCount : 3

これらの8぀のファむルに察しお曎新されたスクリプトを実行したしたが、いずれも䞭括匧衚蚘を䜿甚しおいないため、提案された倉曎によっお11個の䞀意の倉数が圱響を受けたす。

曎新されたスクリプト

Get-ChildItem -Path C:\Temp\PowerShellCorpus -Include *.ps1, *.psm1 -File -Recurse | ForEach-Object -Parallel {
    try {
        $content = $PSItem | Get-Content -Raw

        $ast = [System.Management.Automation.Language.Parser]::ParseInput($content, [ref]$null, [ref]$null)
        $variables = $ast.FindAll({$args[0] -is [System.Management.Automation.Language.VariableExpressionAst ]}, $true)

        $nonQuestionMark = $variables |
        Where-Object VariablePath -notmatch '\?$' |
        ForEach-Object { $_.VariablePath.UserPath.ToString() } |
        Select-Object -Unique

        $QuestionMark = $variables |
        Where-Object { $_.VariablePath -match '\?$' -and $_.VariablePath.UserPath -ne '?' -and $_.Extent.Text -match '(?<!\$)\?$' } |
        ForEach-Object { $_.VariablePath.UserPath.ToString() } |
        Select-Object -Unique

        $output = [pscustomobject]@{
            File = $PSItem
            QuestionMarkVars = $QuestionMark
            QuestionMarkVarCount = $QuestionMark.Count
            NonQuestionMarkVars = $nonQuestionMark
            NonQuestionMarkVarCount = $nonQuestionMark.Count
        }

        $output
    }
    catch {
        throw
    }
}

ありがずう、 @ ThomasNieto-パヌセンテヌゞを0.0005たで䞋げるこずができるず思っおいたした...冗談です。

それで、委員䌚は別のものを䜿甚したに違いありたせん-プラむベヌト -コヌパス。

したがっお、目前の問題を決定するこずに加えお、疑問が生じたす公開されおいるコヌパスを曎新する必芁がありたすか 正匏にメンテナンスされおいたすか珟圚は2017幎7月26日付け

@ SteveL-MSFT、明確にしおいただけたすか

@ mklement0切り䞊げたので、少しだけ気分を良くしたい堎合は、実際には0.00058です😄

https://github.com/PowerShell/PowerShell-RFC/pull/223#discussion_r318340339で、 @ adityapatwardhanは、私が䜿甚したのず同じ公開コヌパスを䜿甚しお分析を行い、62で、倉数が疑問笊で終わっおいたす。 圌がどのようにしおそのパヌセンテヌゞを思い぀いたのかに぀いおの反応は芋られたせんでした。 PS委員䌚はその分析を䜿甚しおこの芁求を決定したしたか

リンクされたコメントを芋るず、 @ adityapatwardhanが蚀っおいるこずは、_名前に?が含たれるすべおの倉数の䞭で_ 62が名前の_last_文字ずしお?を持っおいるこずだず思いたす。

察照的に、䞭括匧のない ?倉数で終わる実際の有病率の分析党䜓的な倉数䜿甚量のパヌセンテヌゞずしおは、はるかに関連性が高いようです。

この時点で、委員䌚は「やりたくない」ず蚀っおいるように聞こえたすが、その堎合、結果ずしお䞍栌奜で䜿甚されなくなるのであれば、なぜこの機胜を䜿甚するのでしょうか。

@ThomasNieto同様に、私はこれらの問題のどこかで分析を行い、あなたず同様の結果を出したした。

@mburszley分析しおいただきありがずうございたす。 昚幎埗られた結果を確認するために、別の方法ast vs regexを䜿甚したかったのです。

私はあなたを聞きたす、 @ mburszley 、しかし再

委員䌚はただ「したくない」ず蚀っおいるだけです

これが本圓に_フィアット_の決定である堎合実際の䜿甚状況の分析に基づいおいないもの、特に_stated_の理由がそのような分析の根拠であったこずを考えるず、コミュニティ党䜓にずっお良い兆候ではありたせん。

したがっお、委員䌚に、決定の基瀎ずなった実際の䜿甚状況分析を瀺す機䌚を䞎えるか、分析が䞍十分であるこずを認識しお決定を再怜蚎する機䌚を䞎える必芁がありたす。

https://github.com/PowerShell/PowerShell/issues/11379#issuecomment-566756120での私の提案はどうですか

$obj?.Method() <var i="12">Method</var>()がデフォルトで$<var i="9">obj</var> ?. <var i="12">Method</var>()し、 $<var i="14">obj?</var> .のみフォヌルバックするようにするこずをお勧めしたす<var i="17">Method</var>() 、 $<var i="19">obj</var>がスコヌプに存圚しないが、 $<var i="21">obj?</var>は存圚し、 #requires ‑Versionはv7 +ではない堎合。

䞋䜍互換性の懞念のほずんどに察凊できるず思いたす。

@ThomasNieto

@ mklement0は正しいですが、 ?を䜿甚しおいる倉数のうち、62が最埌にそれを䜿甚しおいるこずを意味したした。

ここのコメントに瀺されおいる結果から、 ?䜿甚するすべおの倉数が最埌にそれを䜿甚しおいるようです。 したがっお、重倧な倉曎を加えないずいう提案。

{..}の芁件が削陀された堎合でも、スクリプトは解析されたすが、セマンティクスは異なりたす。これは、私の意芋では非垞に危険です。

確かに...しかし、分析によるず、文字通りほずんど誰もそれらを䜿甚しおいたせん。

他の重倧な倉曎ず同じように、発衚し、しばらくの間実隓的な機胜ずしお導入し、文曞化しお安定させるこずができたす。

識別子文字ずしおの?が実際にリモヌトでかなりの数のケヌスで䜿甚されおいない堎合、難解な構文を掚奚する理由はありたせん。

{..}の芁件が削陀された堎合でも、スクリプトは解析されたすが、セマンティクスは異なりたす。これは、私の意芋では非垞に危険です。

たた、C / C ++ / Cのように?.を䜿甚しおいお、䜕も悪いこずを瀺さずに間違った結果が埗られるこずを心配しおいたせんか 䟋えば

PS> $res = "My length is 15"
PS> $res?.Length
0

確かに、strict-modeはこれを芋぀けたすが、倚くの人がstrictmodeを䜿甚しおいるこずを私は知りたせん。 したがっお、ごくわずかな割合のスクリプトが砎損するのを防ぐために、 ?.を䜿甚しお倱敗する倚くの人々を蚭定しおいるようです。 私はトレヌドオフに倢䞭ではありたせん。 ずはいえ、ごく少数の人でも、人を壊さないようにしたいずいう気持ちは確かに理解しおいたす。

おそらく、PowerShellにはEnable-ExperimentalFeatureず同等のEnable-PSFeatureが必芁です。これは、実隓状態ではなくなったが、デフォルトでオンに堎合です。 この$?.GetType()ようなコヌドで実行されるスクリプトの堎合、将来これが壊れ、代わりに${?}.GetType()を䜿甚する必芁があるずいう譊告を発し始める可胜性がありたす。 個々のスクリプトは、 #requires -version 7.1 -feature PSNullConditionalOperators機胜を有効にするこずができたす。 そうすれば、PS 8がヒットするたびに、この機胜がデフォルトで有効になる可胜性がありたす。

@rkeithhillの䟋は、
PowerShellが今日どのように機胜するかに぀いお知っおいるこずを少し忘れおください。 あなたが芋るずき

PS> $res?.Length

_name、operator、name_のように芋えたす-もちろんそれはそうです。
どちらがより理にかなっおいたす_ "" 挔算子の䞀郚です_、たたは_ "" 名の䞀郚です-element_
これらの挔算子が必芁な堎合そしお「PowerShellyではない」ず思う堎合、誀っお䜿甚されるものず少量の砎損のどちらかを遞択したす。

倉数名に特定の[正圓な]文字を䜿甚するのは悪いスタむルだず蚀うために、psScriptAnalyzer_now_にルヌルを入れ始めたす。

Enable-featureは奜きではありたせん。 誰かがそれをスクリプトに入れお、䜿いたいものを機胜させたす。叀いスクリプトは、新しいスクリプトの埌に実行するず壊れたすただし、残りの時間は機胜したす。 Yが厳密モヌドをオンにし、Xがオフに䟝存しおいるため、スクリプトY_を実行した埌に_サヌドパヌティのスクリプトXが倱敗するのを芋おきたした。 䞡方のスクリプトの䜜者は私の悪い本にありたす。

倉数名に特定の[正圓な]文字を䜿甚するのは悪いスタむルだず蚀うために、psScriptAnalyzerにルヌルを入れ始めたす。

問題は次のずおりです。PowerShellが倉数をトヌクン化する方法を倉曎するず、PSScriptAnalyzerでも倉数の衚瀺が異なりたす。 $res?ような倉数がある堎合は、次のようになりたす。

{
$res?.Length
}.Ast.EndBlock.Statements[0].PipelineElements[0].Expression.Expression.VariablePath.UserPath

あなたにあげる

res?

ただし、PowerShellの解析方法を7.2などで倉曎するず、次のようになりたす。


PSScriptAnalyzerは?認識できなくなりたした。これは、倉数名の䞀郚ではなくなったためです定矩䞊、テストしようずしおいる倉曎であるため。 これは、PSScriptAnalyzerがPowerShellモゞュヌルであり、PowerShellに同梱されおいるものず同じパヌサヌを再利甚するためです。 そしお、それを再実装しようずするず、それは完党に保守䞍可胜であり、灜害のレシピになりたす。

これを回避するには、PSScriptAnalyzerを条件付きでコンパむルするそしおたったく新しいアセンブリを出荷するなど、新しい7.2ロゞックをテストしお同じ蚺断を提䟛する方法がありたす。 しかし、その埌、どこでも耇雑さが増したたは、テストサヌフェスが枛り、やや衚面的なシナリオに察応できるようになりたした。

さらに悪いこずに、ASTに䟝存しおいる他のすべおのツヌルには、PSScriptAnalyzerがそうであるずしおも、この皮の耇雑さを維持する胜力がありたせん。 ASTタヌゲティングツヌルを構築しおいるほずんどの人は、完党な正確さのためにPowerShellの個々のマむナヌバヌゞョンに察しおコンパむルするこずはありたせん。 特にどのバヌゞョンでも゚ラヌではないので、圌らはおそらくそのような小さな重倧な倉曎に぀いおさえ知らないでしょう。 これは、ある行動が静かに別の行動になる、倉化を壊す最も陰湿な圢態です。

これが基本的に、このようなパヌサヌ/トヌクンラむザヌレベルの倉曎をより危険なものにしおいる理由です。 PSScriptAnalyzerでさえ、正しくサヌビスを提䟛するために埌方に曲がる必芁がありたす。぀たり、このような厄介な倉曎ず比范怜蚎する必芁がありたす。

@rjmholt 、このような倉曎が_原則的に_どれほどトリッキヌであるかは誰もが理解できるず思いたすが、この特定のケヌスでは_実際には_問題ではなく、PSSAルヌルも必芁ないず思いたす。

  • @ThomasNietoの分析によるず、コヌパスがそこにあるすべおのPowerShellコヌドを代衚しおいるず思われる堎合、名前が? _で終わる倉数は事実䞊誰も䜿甚しおいたせん。

  • 私が掚枬するず、ほずんどの人はそのような倉数名を䜿甚するこずさえ_考えたせん_。なぜなら、圌らはそれらが機胜するこずを期埅しないからです私を含む、そしおおそらく自動$?ずいう䟋倖に気付かないでしょうbashなどのPOSIX互換シェルでも同様に䟋倖です。

    • 実際、 @ ThomasNietoの分析を8ファむルの䞭で次のこずがわかりたす。

      • 5は_falsepositives_のみが含たれたす。぀たり、倉数は"Are you sure you want to kill $vParam?"などの_strings_内で䜿甚されたす-実際、これらの䜿甚は_壊れた_であり、スクリプトの䜜成者が?を期埅しおいなかったこずを瀺しおいたす倉数名の䞀郚。

      • これらのファむルの2は公開されなくなりたした。

      • それらのうちの_1_のみが、 ? -$key1? ずしお誠実に䜿甚しおいるため、䜙談ですが、メンバヌアクセス挔算子ずは_結合されおいたせん_ 、 . / cc @ stevenayers。

䞊蚘に基づいお、これは教科曞のバケット3ありそうもない灰色の領域の倉曎ずしお私を襲いたす。したがっお、これは_蚱容可胜_です-そしおこの倉曎の_利点_は説埗力を持っお議論されおいるず思いたす。

行動の倉化を理論的根拠ずずもに_文曞化_するだけで十分です。

もちろん

  1. これは、a分析が正しいこず、およびb公開されおいるコヌパスが代衚的であるこずを前提ずしおいたす。

  2. 「疑問笊で終わる倉数名がかなり䜿甚されおいた」ずいう委員䌚の䞻匵ずはたったく盞容れたせんもちろん、そのような倉数名が{...}囲たれおいない堎合にのみ問題になりたす。

1.が真である2.をサポヌトするものは䜕も聞いおいないずいう仮定に基づいお進めるず、2぀の遞択肢がありたす。

  • {...}囲たれおいない限り $?陀いお、バンド゚むドを取り陀いお、倉数名の?を単玔に犁止したす-これは消えおいく小さなものを壊したす珟圚それに䟝存しおいるスクリプトの割合。

    • ぀たり、 $key1?ように、その埌に.も、別の?  $key1??'else' も、3項匏 $key1?1:0 も続きたせん。 _parsererror_が発生したす。

      • null合䜓挔算子ず䞉項挔算子の䟋が瀺すように、これらもこの倉曎の恩恵を受けたす-珟圚、_スペヌス_- $key1 ?1:0 / $key1 ??'else' -たたは{...} - ${key1}?1:0 / ${key1}??'else'

    • _expandable strings_内では、 ?は {...}囲たれおいない倉数名の䞀郚ずは芋なされなくなるため、実際には、 "Are you sure you want to kill $vParam?"などの文字列を誀っお䜿甚した既存のスクリプトを_修正_したす。
  • 既存のスクリプトのごくわずかな郚分を壊さないようにする必芁があるず本圓に感じた堎合は、@ ExE-Bossによっお提案されたロゞックを怜蚎するこずはできたすが、実装の耇雑さは蚀うたでもなく、この抂念の耇雑さを導入したいずは思いたせん私は本圓に話すこずはできたせん。

@ SteveL-MSFT

9月のコミュニティコヌルhttps://aka.ms/PSCommunityCall;この蚘事の執筆時点では、9月のコヌルの録音はそこに投皿されおいたせんが、https//aka.ms/JoinPSCallからアクセスできたす。次の電話たで、4600から、 https  @ThomasNietoの提案に基づいおいたす。

レコヌディングの関連郚分ぞの盎接リンクを提䟛したいず思っおいたしたが、YouTubeに投皿され、https//aka.ms/PSCommunityCallにリンクされるたで埅぀必芁がありたす。

録音でのあなたの発蚀に基づいお

  • これを再怜蚎する意思を瀺した堎合は、この問題を再床開いお、 Review - Committeeタグを付け盎しおください。

  • 倉数名を䞭括匧で囲むこずは既存の機胜であり、この堎合は_矎的_理由で倉数名を䜿甚する必芁があるこずに反察しおいるずいうあなたの意芋に぀いおは、次のようになりたす。

    • ここにいる誰もが、倉数名を明確にするために{...}でき、堎合によっおは䜿甚しなければならないこずに気付いおいないず思いたす。
    • たた、それは_矎孊_に぀いおではなく、䞻に_この堎合は{...}を䜿甚する必芁がないため、_静かに倱敗する_方法で_期埅される動䜜が埗られない_こずです。 二次的な懞念は、入力の䞍䟿です。
GitHub
PowerShell゚コシステムの蚭蚈倉曎ず改善に関するコミュニティフィヌドバックのRFCRequest for Commentsドキュメント-PowerShell / PowerShell-RFC
Microsoft Teams

この問題珟圚は無期限に閉じた状態になっおいるように芋えたすがひび割れに陥るのではないかず心配しおいるので、再蚪するためのリマむンダヌずしお14025を開きたした。興味のある方は、ぜひご支揎ください。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡