Powershell: null ์กฐ๊ฑด๋ถ€ ๋ฉค๋ฒ„ ์•ก์„ธ์Šค์˜ ๊ฒฝ์šฐ ๋ณ€์ˆ˜ ์ด๋ฆ„ ์ฃผ์œ„์— { ... }๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2019๋…„ 12์›” 17์ผ  ยท  53์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: PowerShell/PowerShell

#3240์˜ ํ›„์† ์กฐ์น˜.

Null ์กฐ๊ฑด๋ถ€ ๋ฉค๋ฒ„ ์•ก์„ธ์Šค( ?. )๊ฐ€ ๊ตฌํ˜„๋˜์—ˆ์œผ๋ฉฐ 7.0์—์„œ _์‹คํ—˜_ ๊ธฐ๋Šฅ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์˜ ์ด์ต ๊ตฌํ˜„์€ ํ˜„์žฌ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๋ฌถ์–ด์•ผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค {...} ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ? ์‚ฌ์šฉ ๋†€๋ž„ ํ•„์š” _doesn't_ ๋ณ€์ˆ˜ ์ด๋ฆ„์˜ ๋ฒ•์  ์„ฑ๊ฒฉ ๊ธฐ์ˆ ์ ์œผ๋กœ {...} .

์ฆ‰, $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_: Null ๋ณ‘ํ•ฉ - $var??='default ๋ฐ $a??$b - ๋ฐ ์‚ผํ•ญ ์—ฐ์‚ฐ์ž - $var?1:0 - ์œ ์‚ฌํ•˜๊ฒŒ ์˜ํ–ฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค( ? ์•ž์— ๊ณต๋ฐฑ์ด ์‚ฌ์šฉ๋˜์ง€๋งŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค).

์ด ์š”๊ตฌ ์‚ฌํ•ญ์€ (a) ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒƒ์ด๋ฉฐ (b) ๋ฒˆ๊ฑฐ๋กญ์Šต๋‹ˆ๋‹ค.

  • ์‹ ๊ทœ ์‚ฌ์šฉ์ž๋Š” {...} ์˜ ํ•„์š”์„ฑ์„ ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋‹ค์Œ์ด ์‹คํŒจํ•  ๋•Œ _it_์ด ํ•„์š”ํ•œ์ง€ ๋ฐ˜๋“œ์‹œ ์•Œ์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค( Set-StrictMode -Version 2 ์ด์ƒ์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š” ํ•œ _๊ฐ์ง€๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ_): $o = [pscustomobject] @{ one = 1 }; $o?.one

  • ์‚ฌ์šฉ์ž๊ฐ€ {...} ์˜ ํ•„์š”์„ฑ์„ _do_ ์•Œ๊ฒŒ ๋œ ํ›„์—๋„ :

    • ๋ฐ˜์ง๊ด€์ ์ธ ํ•„์š”์„ฑ ๋•Œ๋ฌธ์— ๋•Œ๋•Œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์žŠ์–ด๋ฒ„๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    • ๊ทธ๋“ค์ด ๊ธฐ์–ตํ•  ๋•Œ, ํŠนํžˆ {...} ๋ฅผ ์ž…๋ ฅํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ฒ‰์œผ๋กœ ๋ณด๊ธฐ์— ์ธ์œ„์ ์ธ ์š”๊ตฌ ์‚ฌํ•ญ์€ ๊ณ„์†ํ•ด์„œ ์ขŒ์ ˆ๊ฐ์„ ์ฃผ๋Š” ์›์ธ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

{...} ์€ ํ•„์š”ํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๋ฉฐ, ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒƒ์€ _๊นจ๋Š”_ ๋ณ€๊ฒฝ์— ํ•ด๋‹นํ•˜์ง€๋งŒ ํ‹€๋ฆผ์—†์ด ๋ฒ„ํ‚ท 3: ๊ฐ€๋Šฅ์„ฑ์ด ์—†๋Š” ํšŒ์ƒ‰ ์˜์—ญ ์— ํ•ด๋‹น ํ•ฉ๋‹ˆ๋‹ค.


์ด ๋ณ€๊ฒฝ์ด ํ—ˆ์šฉ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜์–ด์•ผ ํ•˜๋Š” ์ด์œ :

์ฐธ๊ณ : @rjmholt ๋Š” ์ด ์ฃผ์„ ์—์„œ PowerShell์˜ ๊ตฌ๋ฌธ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด _์ผ๋ฐ˜์ ์œผ๋กœ_ ๋งค์šฐ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ด์œ ์— ๋Œ€ํ•ด

?. ๋Š” _new_ ๊ตฌ๋ฌธ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ •์˜์— ๋”ฐ๋ฅด๋ฉด ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋Š” ์ด์ „ ๋ฒ„์ „์—์„œ ์‹คํ–‰๋  ์ˆ˜ _์—†์Šต๋‹ˆ๋‹ค_ (์˜๋ฏธ ์žˆ๊ฒŒ) - ๋ ˆ๊ฑฐ์‹œ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋Š” ์ฝ”๋“œ ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์กฐ๊ฑด์„ ํŠน๋ณ„ํžˆ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ํ•œ - ๊ทธ๋Ÿด๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์—†์–ด ๋ณด์ž…๋‹ˆ๋‹ค - ๊ทธ๋Ÿฌ๋ฉด ๋ ˆ๊ฑฐ์‹œ ๊ธฐ๋Šฅ์„ ๊ณ„์† ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ, $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 ์—๋Š” _false positives_๋งŒ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰ "Are you sure you want to kill $vParam?" ์™€ ๊ฐ™์€ _strings_ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ณ€์ˆ˜ - ์‹ค์ œ๋กœ ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ์€ _๊นจ์ ธ_ ์žˆ์œผ๋ฉฐ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ์ž๊ฐ€ ? ๋ฅผ ๊ธฐ๋Œ€ํ•˜์ง€ _ํ•˜์ง€_ ์•Š์•˜์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ ์ด๋ฆ„์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

      • ํ•ด๋‹น ํŒŒ์ผ ์ค‘ 2 ๋Š” ๋” ์ด์ƒ ๊ณต๊ฐœ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

      • ๊ทธ ์ค‘ _1_๋งŒ ? - $key1? ) ๋กœ ์„ ์˜์˜ ์‚ฌ์šฉ์ด๋ฉฐ , ๋”ฐ๋ผ์„œ ์ œ์ณ๋‘๊ณ  ๋ฉค๋ฒ„ ์•ก์„ธ์Šค ์—ฐ์‚ฐ์ž์™€ _not_ ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค. , . /cc @stevenayers.

์œ„์˜ ๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉด ์ด๊ฒƒ์€ ๊ต๊ณผ์„œ์ ์ธ ๋ฒ„ํ‚ท 3: ๊ฐ€๋Šฅ์„ฑ์ด ์—†๋Š” ํšŒ์ƒ‰ ์˜์—ญ ๋ณ€๊ฒฝ์œผ๋กœ ์ƒ๊ฐ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ _์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ๋Š”_ - ๊ทธ๋ฆฌ๊ณ  ์ด ๋ณ€๊ฒฝ์˜ _์ด์ _์ด ์„ค๋“๋ ฅ ์žˆ๊ฒŒ ๋…ผ์˜๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

_๋ฌธ์„œํ™”_ ํ–‰๋™์˜ ๋ณ€ํ™”(์ด์œ ๊ฐ€ ์žˆ๋Š”)๋กœ ์ถฉ๋ถ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก ์ด์•ผ:

  1. ์ด๊ฒƒ์€ (a) ๋ถ„์„์ด ์ •ํ™•ํ•˜๊ณ  (b) ๊ณต๊ฐœ์ ์œผ๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•œ ๋ง๋ญ‰์น˜๊ฐ€ ๋Œ€ํ‘œ์„ฑ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ „์ œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

  2. "๋ฌผ์Œํ‘œ๋กœ ๋๋‚˜๋Š” ๋ณ€์ˆ˜ ์ด๋ฆ„์ด ๊ฝค ๋งŽ์ด ์‚ฌ์šฉ๋˜์—ˆ๋‹ค"๋Š” ์œ„์›ํšŒ์˜ ์ฃผ์žฅ๊ณผ ์™„์ „ํžˆ ์ƒ๋ฐ˜๋ฉ๋‹ˆ๋‹ค(๋ฌผ๋ก  ์ด๋Ÿฌํ•œ ๋ณ€์ˆ˜ ์ด๋ฆ„์ด {...} ๋ฌถ์ด์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋งŒ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค).

1.์ด ์‚ฌ์‹ค์ด๋ผ๋Š” ๊ฐ€์ •ํ•˜์— ์ง„ํ–‰ํ•˜๋ฉด(2๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์„ ๋“ฃ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.) ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฐด๋“œ ์›์กฐ๋ฅผ ๋ฒ—์–ด ๋ฒ„๋ฆฌ๊ณ  ๋‹จ์ˆœํžˆ ํ—ˆ์šฉ ? ๋กœ ๋ฌถ์—ฌ ์•Š๋Š” ๋ณ€์ˆ˜ ์ด๋ฆ„์˜์ด ํ–ฅํ›„ {...} (์˜ ๋ช…๋ฐฑํ•œ ์ œ์™ธํ•˜๊ณ  $? ) - ์ด๊ฒƒ์€ ํ•˜๊ณ ์„œ์„ ๊นฐ ๊ฒƒ ํ˜„์žฌ ๊ทธ๊ฒƒ์— ์˜์กดํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ์˜ ๋น„์œจ.

    • ์ฆ‰, . ๋‚˜ ? ( $key1??'else' ) ๋˜๋Š” ์‚ผํ•ญ ํ‘œํ˜„์‹( $key1?1:0 )์ด ๋’ค๋”ฐ๋ฅด์ง€ ์•Š๋Š” $key1? ์™€ ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค $key1??'else' _parser error_๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

      • null-coalescing ๋ฐ 3ํ•ญ ์—ฐ์‚ฐ์ž ์˜ˆ์ œ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์ด ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ํ˜œํƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ _space_ - $key1 ?1:0 / $key1 ??'else' - ๋˜๋Š” {...} - ${key1}?1:0 / ${key1}??'else'

    • _expandable strings_ ๋‚ด๋ถ€์—์„œ ? ๋Š” ๋” ์ด์ƒ (๋น„ {...} -enclosed) ๋ณ€์ˆ˜ ์ด๋ฆ„์˜ ์ผ๋ถ€๋กœ ๊ฐ„์ฃผ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์‹ค์ œ๋กœ "Are you sure you want to kill $vParam?" ์™€ ๊ฐ™์€ ๋ฌธ์ž์—ด์„ ์ž˜๋ชป ์‚ฌ์šฉํ•œ ๊ธฐ์กด ์Šคํฌ๋ฆฝํŠธ๋ฅผ _์ˆ˜์ •_ํ•ฉ๋‹ˆ๋‹ค
  • ์šฐ๋ฆฌ๊ฐ€ ์ •๋ง๋กœ ๊ธฐ์กด ์Šคํฌ๋ฆฝํŠธ์˜ ์•„์ฃผ ์ž‘์€ ๋ถ€๋ถ„์„ ๊นจ๋œจ๋ฆฌ๋Š” ๊ฒƒ์„ ํ”ผํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋Š๋‚€๋‹ค๋ฉด @ExE-Boss๊ฐ€ ์ œ์•ˆํ•œ ๋…ผ๋ฆฌ๋ฅผ _๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์ง€๋งŒ

๋ชจ๋“  53 ๋Œ“๊ธ€

๋ช…ํ™•ํžˆ ํ•˜์ž๋ฉด, ์ด์ •ํ‘œ๋Š” ํŒ€์ด ํ”ผ๋“œ๋ฐฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋…ผ์˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด์ง€ ์ด ๋ณ€๊ฒฝ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์„ ์„ ๋‹คํ•œ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

@mklement0

? {...}๋กœ ๋ฌถ์ง€ ์•Š๊ณ  ์‹๋ณ„์ž์˜ ์ผ๋ถ€๋กœ ํ—ˆ์šฉ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

์Œ - PowerShell์˜ ์ดˆ๊ธฐ ๊ธฐ๋ณธ ์–ธ์–ด๋Š” $?๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Posix Shell์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ข…๋ฃŒ ์ฝ”๋“œ qed '?' ๋”ฐ์˜ดํ‘œ ์—†์ด ๋ณ€์ˆ˜ ์ด๋ฆ„์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(์˜๋ฏธ์žˆ๊ฒŒ) ์ด์ „ ๋ฒ„์ „์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋ฌผ๋ก  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์˜๋ฏธ๋กœ ์˜๋ฏธ ์žˆ๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(๋„ ์กฐ๊ฑด๋ถ€ ์•ก์„ธ์Šค) - ๊ทธ๊ฒŒ ์ œ๊ฐ€ ๋งํ•˜๋ ค๋Š” ์ „๋ถ€์ž…๋‹ˆ๋‹ค.

์˜ˆ, ๊ท€ํ•˜์˜ ์˜ˆ์ œ๋Š” ํ˜„์žฌ ์ž‘๋™ํ•˜์ง€๋งŒ _๋‹ค๋ฅธ ์˜๋ฏธ๋กœ_ ( abc? _ ? _ ๋ณ€์ˆ˜ ์ด๋ฆ„์œผ๋กœ ๊ฐ„์ฃผ๋จ) - ๊ทธ๋Ÿฌ๋‚˜ ๋ช…์‹œ๋œ ์ด์œ ๋กœ ์ธํ•ด ์ด ์ฝ”๋„ˆ ์ผ€์ด์Šค๋Š” ?. ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

PowerShell์˜ ์ดˆ๊ธฐ ๊ธฐ๋ณธ ์–ธ์–ด๋Š” ์ข…๋ฃŒ ์ฝ”๋“œ์— $? ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Posix Shell์ด์—ˆ์Šต๋‹ˆ๋‹ค.

$? ๋Š” POSIX์™€ ๊ฐ™์€ ์‰˜์—์„œ _์˜ˆ์™ธ_์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ _์—†์Šต๋‹ˆ๋‹ค_:

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

(๊ทธ๋ฆฌ๊ณ  ๋ถ„๋ช…ํžˆ ์•„๋ฌด๋„ $? ๊ฐ€ PowerShell์—์„œ ํ์ง€๋˜๋„๋ก ์š”๊ตฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

๊ทธ๋ฆฌ๊ณ  ๋ฌผ๋ก  $? (์ฆ‰, $^ ๋ฐ $$ )์™€ ๊ฐ™์€ ๊ณต๊ฐ„์— ์žˆ๋Š” _๋‹ค๋ฅธ ๋ชจ๋“ _ ์ž๋™ ๋ณ€์ˆ˜๋Š” ๋ช…์‹œ์ ์œผ๋กœ ํŠน๋ณ„ํ•˜๋‹ค๋Š” ์ ์„ ์–ธ๊ธ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค $^ ํ† ํฌ๋‚˜์ด์ €์— ๋‹ด์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์‹ค $? ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋น„๋ก (ํ˜„์žฌ) ๊ทธ๋Ÿด ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋  ๋‹น์‹œ ? ๊ฐ€ ์œ ํšจํ•œ ์‹๋ณ„์ž ๋ฌธ์ž๊ฐ€ ์•„๋‹ ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒํ–ˆ๋˜ ๊ฒƒ์ด ๋ถ„๋ช…ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ณ€์ˆ˜ ์ด๋ฆ„ ๋์— ? ๋ฅผ ์‚ฌ์šฉํ•œ ์‚ฌ๋žŒ์„ ํ•œ ๋ช…๋งŒ ์•Œ๊ณ  ์žˆ๋Š”๋ฐ, ๋ฐ”๋กœ @StartAutomating์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฐ€ ์‹ค์ œ๋กœ ๊ทธ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ํ† ๋ก ์— ๊ทธ์˜ ๊ด€์‹ฌ์„ ๋Œ ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ @vexx32 , ํ† ํฌ๋‚˜์ด์ €์—์„œ $? ๊ฐ€ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋Š” ? ์‹œ์ž‘ํ•˜๋Š” ์ด๋ฆ„์œผ๋กœ ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด $??? = 'foo' ๋Š” ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ ์ด๋ฆ„์€ ์˜์ˆซ์ž ๋˜๋Š” ๋ฐ‘์ค„๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋ฉฐ ํ˜„์žฌ ์˜์ˆซ์ž, ๋ฐ‘์ค„ ๋˜๋Š” ๋ฌผ์Œํ‘œ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ?. ๊ฐ€ null ์กฐ๊ฑด๋ถ€ ๋ฉค๋ฒ„ ์•ก์„ธ์Šค ์—ฐ์‚ฐ์ž๋กœ ๊ตฌ๋ฌธ ๋ถ„์„๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ ? ๊ฐ€ ํ† ํฌ๋‚˜์ด์ €์—์„œ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ์ธ ์ด์œ ๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ์ฑ„ํŒ…์— ๊ด€์‹ฌ์„ ๊ฐ€์ ธ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์น˜ ์žˆ๋Š” ์ผ์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ด๋Ÿฌํ•œ ๋ณ€์ˆ˜๋Š” ๋“œ๋ฌผ์ง€๋งŒ, back-compat์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ค‘๋‹จํ•  ๋•Œ ์•„๋ฌด๋„ ๋‘๋”์ง€ ์žก๊ธฐ๋ฅผ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  2. ์•„์ฃผ ๊ดด์งœ์Šค๋Ÿฌ์šด ์‚ฌ๋žŒ๋“ค์€ ์ œ์ณ๋‘๊ณ  ${obj}?.Method() ๋˜๋Š” $obj?.Method()๊ฐ€ ์•ฝ๊ฐ„ ์ฆ๊ฐ€ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ์›น์—์„œ null์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ 10๋…„ ๊ฐ„์˜ ์ง€์นจ์ด ์žˆ์œผ๋ฉฐ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด if ($obj) { $obj.Method() } _v7 ๋Œ€์„ธ๋ฅผ ํƒ€๊ธฐ ์œ„ํ•ด ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.
  3. ๋˜ํ•œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ณ€์ˆ˜ ์ด๋ฆ„์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ ${} ๊ตฌ๋ฌธ์„ ๋ฐฐ์›๋‹ˆ๋‹ค(์ด๋ฏธ ๋ฐ‘์ค„๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ ์ค‘ํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค). "์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์‚ฌ๋žŒ"๊ณผ "${} ๊ตฌ๋ฌธ์„ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ"์˜ ๋ฒค ๋‹ค์ด์–ด๊ทธ๋žจ ๊ฒน์นจ์ด ๊ฑฐ์˜ 100%์ผ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.
  4. ์ด ๊ตฌ๋ฌธ์€ ์ „์ฒด ํ•˜์œ„ ํ‘œํ˜„์‹๋งŒํผ ๊ฐ•๋ ฅํ•˜์ง€ ์•Š๊ณ  ์ „์ฒด ํ•˜์œ„ ํ‘œํ˜„์‹์€ ์ฝ”์–ด์—์„œ ์ž‘๋™ํ•˜๊ฑฐ๋‚˜ ์ž‘๋™ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด ์•ž์œผ๋กœ๋„ ๊ณ„์† ์‚ฌ์šฉํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ˆ˜ํ•™์„ ์‹คํ–‰ํ•˜๋ฉด ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ _ํ•˜์ง€ ๋ง์•„์•ผ ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ตฌ์ฒด์ ์ธ ์ด์œ ์™€ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๋ชจํ˜ธํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(์ผ๋ถ€ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ๋” ์‰ฌ์šธ ์ˆ˜ ์žˆ์Œ). ์˜ ๋‚ฎ์€ ์œ ๋ณ‘๋ฅ ์„ ๊ฐ์•ˆํ•  ๋•Œ? ๋ณ€์ˆ˜ ์ด๋ฆ„์—์„œ ๋‹น์‹ ์€ ๋‹น์‹ ์ด ํ•ดํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์„ _์–ด์ฉŒ๋ฉด__ ๋„์šธ ์ˆ˜ ์žˆ์ง€๋งŒ ์ œ ์ƒ๊ฐ์—๋Š” ๊ทธ๊ฒƒ์€ ๋™์ „ ๋˜์ง€๊ธฐ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋™์ „ ๋˜์ง€๊ธฐ์˜ ์ž ์žฌ์ ์ธ ์ด์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ๋‚˜๋Š” Robert McNamara๋ฅผ "๋งŒ์•ฝ ์šฐ๋ฆฌ๊ฐ€ ํ•˜๋ฉด ๋งํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋งํ•  ๊ฒƒ์ด๊ณ , ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ํ•˜์ง€ ์•Š์œผ๋ฉด ๋งํ•  ๊ฒƒ์„ ์„ ํƒํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

$obj?.Method() ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ $<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-Boss, ์ด ํŠน์ • ๊ทœ์น™์— ๋Œ€ํ•ด ๋งŽ์€ ์˜ˆ์™ธ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ํŠน์ • ๊ทœ์น™์˜ ๊ฐ€์น˜์— ๋Œ€ํ•ด ๋‹ค์‹œ ์งˆ๋ฌธํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์งˆ๋ฌธ์€ "์šฐ๋ฆฌ๊ฐ€ ๊นจ๋œจ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜ ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด ์šฐ๋ฆฌ๊ฐ€ ๋ชจ๋ฅด๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?"์ž…๋‹ˆ๋‹ค.

ํ•ฉ์˜๊ฐ€ ์ด์— ๋Œ€ํ•œ ${...} ๊ตฌ๋ฌธ์„ ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด ์—ฌ๊ธฐ์—์„œ OptionalFeatures์— ๋Œ€ํ•œ ์ง€์›์„ ๋†’์ด ํ‰๊ฐ€ํ•  ๊ฒƒ์ด๋ฏ€๋กœ ์ด ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ๋‚˜ ๊ฐ™์€ ์‚ฌ๋žŒ๋“ค(์ €๋Š” ๋งŽ์ด ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค)์ด ๋…ธ์ด์ฆˆ๋ฅผ ์˜ตํŠธ์•„์›ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .

์—ฌ๊ธฐ์„œ ์˜์—ญํ•˜๊ธฐ ๋•Œ๋ฌธ์—:
"๋…ผ๋ฆฌ๋Š” ๋‹ค์ˆ˜์˜ ํ•„์š”๊ฐ€ ์†Œ์ˆ˜์˜ ํ•„์š”๋ฅผ ๋Šฅ๊ฐ€ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ถ„๋ช…ํžˆ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค." - ์ŠคํŒ

๋”ฐ๋ผ์„œ ์ˆ˜ํ•™์„ ์‹คํ–‰ํ•˜๋ฉด ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ _ํ•˜์ง€ ๋ง์•„์•ผ ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ตฌ์ฒด์ ์ธ ์ด์œ ์™€ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๋ชจํ˜ธํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(์ผ๋ถ€ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ๋” ์‰ฌ์šธ ์ˆ˜ ์žˆ์Œ).

@StartAutomating : ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ์œผ๋ฉฐ ๋ชจํ˜ธํ•˜์ง€ ์•Š๊ณ  ๊ตฌ์ฒด์ ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๊ฒƒ์˜ ๋ชฉํ‘œ ์ค‘ ํ•˜๋‚˜๋Š” ์ฝ”๋“œ ๋‹จ์ˆœ์„ฑ์ž…๋‹ˆ๋‹ค. {} ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๊ฐ์‹ธ์•ผ ํ•˜๋Š” ๊ฒƒ์€ ํ•ด๋‹น ๋ชฉํ‘œ์— ์ง์ ‘์ ์œผ๋กœ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” @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 ๊ธฐ๋ฐ˜ ๋™์ž‘ ๋ณ€๊ฒฝ์€ ์ €์žฅ๋œ ์Šคํฌ๋ฆฝํŠธ ์™ธ๋ถ€์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ˆ„๊ตฐ๊ฐ€ ํƒœ๊ทธ๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š๊ณ  ๊ธด ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ผ๋ถ€ ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ์ฆ‰์‹œ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

์ด๋Š” ์ด์ „ ๋ฒ„์ „์—์„œ ์ง€์›๋˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” _๋ชจ๋“ _ ์ฝ”๋“œ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์ด ์ตœ์šฐ์„  ๋ฌธ์ œ๋ผ๋ฉด ์ƒˆ๋กœ์šด ์–ธ์–ด ๊ธฐ๋Šฅ์ด๋‚˜ ์ƒˆ๋กœ์šด cmdlet/cmdlet ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ๋„์ž…๋˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(ํฌ๋ง์€, ์ด์ „์˜ ์ฝ”๋“œ์—์„œ ๋‹น์‹ ์€ ์ ์–ด๋„์ด Set-StrictMode -Version 1 ์ด ๊ฒฝ์šฐ ํšจ๊ณผ, $var?.foo ์— ์˜ํ•œ๋ผ๋Š” ์ด๋ฆ„์˜ ๋ณ€์ˆ˜์— ํฐ ์†Œ๋ฆฌ๋กœ ์‹คํŒจ๋ฅผ, var? ๊ธฐ์กด).

  1. ์ด๋ฆ„ ์ฃผ์œ„์— ์ค‘๊ด„ํ˜ธ๋ฅผ ๋„ฃ์„ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋Œ€์ฒด (...) ์œ„ํ•ด {...} ๋‹จ์ง€ ํ•œ๊ณ„ ๊ฐœ์„ ์ด๋‹ค.

์–ด๋–ค ์ถ”๊ฐ€ ๊ตฌ๋ฌธ์ด ์‚ฌ์šฉ๋˜๋“  ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๋Š” ์ž…๋ ฅ ํŽธ์˜์„ฑ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ _ํ•ฉ๋ฆฌ์ ์ธ ๊ธฐ๋Œ€_๋ฅผ ์ถฉ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•ด _์žˆ๋Š” ๊ทธ๋Œ€๋กœ_ ์ž‘๋™ํ•ด์•ผ ํ•˜๋Š” ์ถ”๊ฐ€ ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ _ํ•„์š”_์ž…๋‹ˆ๋‹ค.

  1. #requires ๊ธฐ๋ฐ˜ ๋™์ž‘ ๋ณ€๊ฒฝ์€ ์ €์žฅ๋œ ์Šคํฌ๋ฆฝํŠธ ์™ธ๋ถ€์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ˆ„๊ตฐ๊ฐ€ ํƒœ๊ทธ๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š๊ณ  ๊ธด ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ผ๋ถ€ ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ์ฆ‰์‹œ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

์ด๋Š” ์ด์ „ ๋ฒ„์ „์—์„œ ์ง€์›๋˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” _๋ชจ๋“ _ ์ฝ”๋“œ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์ด ์ตœ์šฐ์„  ๋ฌธ์ œ๋ผ๋ฉด ์ƒˆ๋กœ์šด ์–ธ์–ด ๊ธฐ๋Šฅ์ด๋‚˜ ์ƒˆ๋กœ์šด cmdlet/cmdlet ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ๋„์ž…๋˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ ์—ˆ์Šต๋‹ˆ๋‹ค. ๋” ๋‚˜์•„๊ฐ€ #requires ์ง€์ •๋œ pwsh 7์ธ ๊ฒฝ์šฐ ์ฒ˜๋ฆฌ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ œ์•ˆ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. #requires๋ฅผ ์ž…๋ ฅํ•œ ๊ฒฝ์šฐ์—๋งŒ ์ƒˆ๋กœ์šด ๋™์ž‘์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.์ข‹์ง€ ์•Š๋‹ค .

(ํฌ๋ง์€, ์ด์ „์˜ ์ฝ”๋“œ์—์„œ ๋‹น์‹ ์€ ์ ์–ด๋„์ด Set-StrictMode -Version 1 ์ด ๊ฒฝ์šฐ ํšจ๊ณผ, $var?.foo ์— ์˜ํ•œ๋ผ๋Š” ์ด๋ฆ„์˜ ๋ณ€์ˆ˜์— ํฐ ์†Œ๋ฆฌ๋กœ ์‹คํŒจ๋ฅผ, var? ๊ธฐ์กด).

๋‚ด ๊ฒฝํ—˜์ƒ 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 )์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์œ„์˜ ๋‚ด ์ œ์•ˆ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค( https://github.com/PowerShell/PowerShell/issues/11379#issuecomment-566756120 ).

@ExE-Boss ๋„ค, ์ œ๊ฐ€ #requires์— ๋”ฐ๋ผ ์ฒ˜์Œ์—๋Š” ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ๋งํ–ˆ์„ ๋•Œ ์–ธ๊ธ‰ํ•œ ๊ท€ํ•˜์˜ ์˜๊ฒฌ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์˜ˆ, ๊ธฐ์กด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ค‘๋‹จํ•˜๋ ค๋ฉด ์ฃผ์š” ๋ฒ„์ „์ด ๋ณ€๊ฒฝ๋  ๋•Œ์ด๋ฏ€๋กœ ์‹ ์†ํ•˜๊ฒŒ ์™„๋ฃŒํ•˜๊ฑฐ๋‚˜ V8์„ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ๋“ค์€ ์•„์ง ์‹คํ—˜์ ์ธ ๊ธฐ๋Šฅ์ด๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ RC-1์—์„œ ๊บผ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ๋ฐฐ์†ก ์ œํ’ˆ์— ๋Œ€ํ•ด ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋  ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ฐจ๋‹จ / ํŠน์ • ๋ฌธ์ž๋กœ ๋๋‚˜๋Š” ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ•  ๋•Œ ๊ฒฝ๊ณ ํ•œ๋‹ค - ์ฆ‰ ๋™์ž‘์ด ๋ณ€๊ฒฝ (๋˜๋Š” ๋‘ ๋ฒˆ์งธ ์‹คํ—˜ ๊ธฐ๋Šฅ์ด ๋ ) ์ˆ˜ ์žˆ๋„๋ก ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์„ ํ™œ์„ฑํ™”ํ•œ ๋‹ค์Œ ๋‚˜์—๊ฒŒ ์ฑ…์ž„์„ ์ง€์šฐ๋Š” ์ž˜๋ชป๋œ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ - ๋ฌผ๋ก  ๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ๋‹ค์šด๋กœ๋“œํ•œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ "์†์ƒ๋œ" ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ณ  "์‹คํ—˜์ " ๋ฐฐ๋„ˆ ์•„๋ž˜์—์„œ ๋” ๊ฒฌ๋”œ ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ์ง„์ง€ํ•œ PowerShell ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ฒ„๊ทธ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์— ์™”๊ณ  ์ด ๋ฌธ์ œ๋ฅผ ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ช…๋ น์ค„ ์Šคํฌ๋ฆฝํŒ…์˜ ๊ฒฝ์šฐ ์ฃผ๋กœ bash๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ์•„๋งˆ๋„ Microsoft๊ฐ€ PowerShell Core๋กœ ์ „ํ™˜ํ•˜๋„๋ก ์„ค๋“ํ•˜๋ ค๊ณ  ํ•˜๋Š” ์ธ๊ตฌ ํ†ต๊ณ„์— ์†ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. bash๋ณด๋‹ค ๊ณ ํ†ต์ด ๋œํ•œ ๋น ๋ฅธ ์Šคํฌ๋ฆฝํŒ… ์–ธ์–ด๊ฐ€ ํ•„์š”ํ•œ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค.

์ฃผ๋กœ PowerShell ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” PowerShell ๊ตฌ๋ฌธ๊ณผ ๊ด€๋ จ๋œ ๋งŽ์€ ๊ฒฐ์ •์ด ์ง๊ด€์ ์ด์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์ž์ฃผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ์‹ฌ๊ฐํ•œ ์ž‘์—…์— PowerShell์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ null ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž๊ฐ€ ์—†๊ฑฐ๋‚˜ ๋Œ€์‹  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๊ฐ€ ์—†๋‹ค๋Š” ์‚ฌ์‹ค์— ์†Œ๋ฆ„์ด ๋ผ์ณค์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ์ด ์ธ๊ธฐ ์žˆ๋Š” PowerShell ๋‹ต๋ณ€์„ Stack Overflow์— ๊ฒŒ์‹œํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ 2013๋…„์ด์—ˆ๊ณ , ๊ทธ ์ดํ›„๋กœ ๋‚ด๊ฐ€ ์ฃผ๋กœ PowerShell์„ ํ”ผํ•œ ์„ธ ๊ฐ€์ง€ ์ด์œ  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŒ… ์–ธ์–ด์˜ ์š”์ ์€ ์žฅํ™ฉํ•œ if-else ๋ฌธ์ด ์•„๋‹ˆ๋ผ ๋งŽ์€ ๊ตฌ๋ฌธ ์„คํƒ•์œผ๋กœ ๋น ๋ฅด๊ณ  ๋”๋Ÿฌ์šด ๊ฒƒ์„ ์›ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@StartAutomating ์€ ๋‹ค์Œ๊ณผ

์•„์ฃผ ๊ดด์งœ์Šค๋Ÿฌ์šด ์‚ฌ๋žŒ๋“ค์€ ์ œ์ณ๋‘๊ณ  ${obj}?.Method() ๋˜๋Š” $obj?.Method()๊ฐ€ ์•ฝ๊ฐ„ ์ฆ๊ฐ€ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ์›น์—์„œ null์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ 10๋…„ ๊ฐ„์˜ ์ง€์นจ์ด ์žˆ์œผ๋ฉฐ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด v7 ๋Œ€์„ธ๋ฅผ ํƒ€๊ธฐ ์œ„ํ•ด if ($obj) { $obj.Method() }์—์„œ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” n=1์ด์ง€๋งŒ PowerShell์ด โ€‹โ€‹์•„๋‹Œ ๊ฐœ๋ฐœ์ž๋กœ์„œ ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด? ๊ตฌ๋ฌธ์€ ๋ช‡ ๋‹ฌ์— ํ•œ ๋ฒˆ PowerShell์„ ๋งŒ์ง€๋Š” ์‚ฌ๋žŒ์ด๋ผ๋„ ๊ฝค ๋นจ๋ฆฌ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ฏธ๋ž˜์— ๋Œ€์•ˆ ๋Œ€์‹  PowerShell์„ ์‚ฌ์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์ด ํ™•์‹คํžˆ ๋†’์•„์ง‘๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ์ผ๋ถ€ ๋ฏธ์นœ {} ๊ตฌ๋ฌธ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜๋ฉด ๋ˆˆ์„ ๊ฐ๊ณ  ์ด๋ฏธ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋˜ ํ•ญ๋ชฉ์œผ๋กœ ๋Œ์•„๊ฐˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ๊ธฐ์„œ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์— ๋Œ€ํ•œ ๊ฐ•์กฐ๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. PowerShell Core๋Š” .NET Core์— ์—†๋Š” .NET์˜ ์ผ๋ถ€๋ฅผ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฏธ ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ์กด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ค‘๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. (๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. .NET Core๋Š” ํ›Œ๋ฅญํ•˜์ง€๋งŒ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์ค‘๋‹จํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ง€๊ธˆ์ด ๊ธฐํšŒ์ž…๋‹ˆ๋‹ค.)

์šฐ์„ , ์ œ ์ดˆ๊ธฐ ํ”ผ๋“œ๋ฐฑ์ด ์˜คํ•ด์˜ ์—ฌ์ง€๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๊ฐ€์ •์€ ${}๊ฐ€ _PowerShell ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๊ทธ๋ ‡๊ฒŒ ์ด์ƒํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ? ๋˜๋Š” ๋ฌธ์ž์—ด์— ๋ฐ‘์ค„์„ ๊ธ‹์Šต๋‹ˆ๋‹ค.

PowerShell์ด โ€‹โ€‹์•„๋‹Œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋Š” ์ด ๊ตฌ๋ฌธ์ด ์–ด์ƒ‰ํ•  ์ˆ˜ ์žˆ์Œ์„ ์•Œ๋ ค์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ํ”ผ๋“œ๋ฐฑ์˜ ๋‘ ๋ฒˆ์งธ ๋ถ€๋ถ„์€ ํ˜ผํ•ฉ์—์„œ ๊ธธ์„ ์žƒ์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. null ๋ณ‘ํ•ฉ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ๋Œ€์•ˆ์ด PowerShell์—์„œ ๋” ์˜ค๋žœ ์‹œ๊ฐ„ ๋™์•ˆ ์กด์žฌํ–ˆ๊ณ  ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ธฐ๋Šฅ์ด _๊ธฐ์กด PowerShell ์‚ฌ์šฉ์ž์™€ ํ•จ๊ป˜_ ์–ผ๋งˆ๋‚˜ ์ฆ๊ฐ€ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋“ค์–ด์™€์„œ "์ด๊ฒƒ์ด ๋‚ด๊ฐ€ PowerShell์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฒƒ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•˜๊ณ  ์‹ถ๊ณ , ๋‚˜๋Š” ๋‹น์‹ ์˜ ์˜๊ฒฌ์— ์ด์˜๋ฅผ ์ œ๊ธฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ •ํ†ต).

๋‚ด ํ”ผ๋“œ๋ฐฑ์˜ ์„ธ ๋ฒˆ์งธ ๋น„ํŠธ๋Š” ๋น„์œจ์— ๋งž์ง€ ์•Š๊ฒŒ ๋‚ ์•„๊ฐ„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. $IsThisRight? = Test-Something , ์ด ๋ณ€์ˆ˜ โ€‹โ€‹์ œํ•œ์— ๋Œ€ํ•œ ์ž ์žฌ์ ์ธ ์†Œ์‹์„ ๋“ค์€ ์ฒซ ๋ฒˆ์งธ ๋ฐ˜์‘์€ "์•„ ๊ธ€์Ž„์š”. ์ผ๋ถ€ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ๋ฐ”๊ฟ”์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๊ทธ๋ ‡๊ฒŒ ๋งŽ์€ ๊ฒƒ์„ ์–ป์ง€๋Š” ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค."

๋”ฐ๋ผ์„œ ์Šค๋ ˆ๋“œ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๊ณ  ์ข…๋ฃŒํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

  1. IMHO, ${}๋Š” ์•„๋งˆ๋„ _existing_ PowerShell ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ๊ตฌ๋ฌธ์ด ๊ทธ๋ ‡๊ฒŒ ์ด์ƒํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  2. ์ด ๊ธฐ๋Šฅ์ด ํ›Œ๋ฅญํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ๊ทธ๊ฒƒ์€ ์–ธ์–ด ์นœ์ˆ™๋„ ๊ด€๋ฌธ ์•ฝ๋ฌผ์ด๋ฉฐ ์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด if/foreaches/whiles ๋“ฑ์„ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  3. ์˜ํ–ฅ์„ ๋ฐ›์€ ์ €์ž ์ค‘ ํ•œ ๋ช…์œผ๋กœ์„œ ์ €๋Š” ? ๋‚ด ๋ณ€์ˆ˜์˜ ๋์—์„œ ๋‚ด ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

๋˜๋Š” ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ:

์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ด ๋ณ€๊ฒฝ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด ๊ฒฝ์ฃผ์— ์ž‘์€ ๋ง์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค๋ฉด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ๋ ค์„œ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์ง€์ •ํ•œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ? ๋”ฐ๋ผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ํ”ผ๋“œ๋ฐฑ์˜ ๋‘ ๋ฒˆ์งธ ๋ถ€๋ถ„์€ ํ˜ผํ•ฉ์—์„œ ๊ธธ์„ ์žƒ์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. null ๋ณ‘ํ•ฉ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ๋Œ€์•ˆ์€ PowerShell์—์„œ ๋” ์˜ค๋žœ ์‹œ๊ฐ„ ๋™์•ˆ ์กด์žฌํ–ˆ๊ณ  ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด PowerShell ์‚ฌ์šฉ์ž์—๊ฒŒ ์ด ๊ธฐ๋Šฅ์ด ์–ผ๋งˆ๋‚˜ ์ฆ๊ฐ€ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ™•์‹คํžˆ ๊ทธ๊ฒƒ์— ๋™์˜ํ•˜๊ณ  ๋‹น์‹ ์˜ ์˜๊ฒฌ์„ ๋ฌด์‹œํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ด๋ฏธ ์–ธ์–ด๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋Œ€์•ˆ์ด ์ง๊ด€์ ์ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋Ÿฌํ•œ ํš๊ธฐ์ ์ธ ๋ณ€๊ฒฝ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ๊ฐ€ ํ•ญ์ƒ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๋“ค์–ด์™€์„œ "์ด๊ฒƒ์ด ๋‚ด๊ฐ€ PowerShell์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฒƒ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•˜๊ณ  ์‹ถ๊ณ , ๋‚˜๋Š” ๋‹น์‹ ์˜ ์˜๊ฒฌ์— ์ด์˜๋ฅผ ์ œ๊ธฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ •ํ†ต).

๊ธ€์Ž„, ๋‚˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋น„ PowerShell ๊ฐœ๋ฐœ์ž๊ฐ€ ์‹ค์ œ๋กœ ์ด๋Ÿฌํ•œ ๋Œ€ํ™”์— ์ฐธ์—ฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋Š๋‚Œ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์šฐ์—ฐํžˆ ์ด๊ฒƒ์„ ๋ฐœ๊ฒฌํ•œ ๊ฒƒ์€ ์ˆœ์ˆ˜ํ•œ ์šฐ์—ฐ์˜ ์ผ์น˜์˜€์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ PowerShell์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์˜คํ”ˆ ์†Œ์Šค ๋„๊ตฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์‚ฌ๋žŒ๋“ค๊ณผ ๋งค์šฐ ๋‹ค๋ฅผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” PowerShell์„ ํ™”๋ คํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ์ด์ƒํ•œ ์ž‘์—…์„ ์™„๋ฃŒํ•˜๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ์˜ ๊ด€์ ์„ ์ œ๊ณตํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์˜๊ฒฌ์„ ๋ฌด์‹œํ•˜๋ ค๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์ž์ฃผ ๋ณผ ์ˆ˜ ์—†๋Š” ๊ด€์ ์—์„œ์˜ ๋˜ ๋‹ค๋ฅธ ์˜๊ฒฌ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

๋” ๋‚˜์€ null ์ฒ˜๋ฆฌ๋Š” ๋‚ด๊ฐ€ PowerShell์„ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ํ•œ ๊ฐ€์ง€๊ฐ€ ์•„๋‹ˆ๋ผ ๋‘ ๋ฒˆ์งธ์ž…๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์ง€์›์ด์—ˆ๊ณ , ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ๋ฉ€๋ฆฌ ์™”๋Š”์ง€์— ๋งค์šฐ ๊ฐ๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๊ตฌ๋ฌธ ์„คํƒ•์€ ์ฃผ์–ด์ง„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์–ธ์–ด๋ฅผ ์„ ํƒํ•  ๋•Œ ์ €์—๊ฒŒ ํฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์œ ์ง€ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ๋” ์žฅํ™ฉํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ด€๋ฆฌ ๋˜๋Š” devops ์ž‘์—…์„ ์œ„ํ•œ ๋น ๋ฅธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ null๊ณผ ๊ฐ™์€ ํ•ญ๋ชฉ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋น ๋ฅธ ๋ฐฉ๋ฒ•์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ํ”ผ๋“œ๋ฐฑ์˜ ์„ธ ๋ฒˆ์งธ ๋น„ํŠธ๋Š” ๋น„์œจ์— ๋งž์ง€ ์•Š๊ฒŒ ๋‚ ์•„๊ฐ„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. $IsThisRight? = Test-Something , ์ด ๋ณ€์ˆ˜ โ€‹โ€‹์ œํ•œ์— ๋Œ€ํ•œ ์ž ์žฌ์ ์ธ ์†Œ์‹์„ ๋“ค์€ ์ฒซ ๋ฒˆ์งธ ๋ฐ˜์‘์€ "์•„ ๊ธ€์Ž„์š”. ์ผ๋ถ€ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ๋ฐ”๊ฟ”์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๊ทธ๋ ‡๊ฒŒ ๋งŽ์€ ๊ฒƒ์„ ์–ป์ง€๋Š” ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค."

์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์„ ํ˜ธํ•˜๋Š” ๊ฒƒ์€ ํ•ญ์ƒ ์ •๋‹นํ•œ ์ฃผ์žฅ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์—๋Š” ์–ด์จŒ๋“  Core๋กœ์˜ ์ „ํ™˜์œผ๋กœ ์ธํ•ด ๋งŽ์€ PowerShell ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ค‘๋‹จ๋˜๊ธฐ ์ง์ „์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์ด ์ •๊ธฐ์ ์œผ๋กœ ์ค‘๋‹จ๋˜๋ฉด ๋‹ต๋‹ตํ•˜์ง€๋งŒ ๋ชจ๋“  ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํ•œ ๋ฒˆ์— ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜๋ฏ€๋กœ ์ง€๊ธˆ์ด ์ข‹์€ ์‹œ๊ธฐ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์™„์ „ํžˆ ์ƒˆ๋กœ์šด ์ธ๊ตฌ ํ†ต๊ณ„, ์ฆ‰ Windows ์ค‘์‹ฌ์ด ์•„๋‹Œ ๊ฐœ๋ฐœ์ž๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋ ค๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฒฝ์Ÿํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ํš๊ธฐ์ ์ธ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค๋ฉด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ๋ ค์„œ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์ง€์ •ํ•œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ? ๋”ฐ๋ผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ ๋ง์”€๋“œ๋ฆฌ์ž๋ฉด ์ด ๊ธฐ๋Šฅ์„ ์„ ํƒํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ PowerShell์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋ฐฉํ•ด๊ฐ€ ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋ฏธ ๋‚ด bash ์Šคํฌ๋ฆฝํŠธ์˜ ๋งจ ์œ„์— ๋งŽ์€ set ๋ช…๋ น์„ ํ•„์š”๋กœ ํ•˜๋Š” ๋ฐ ์ต์ˆ™ํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๋ฌธ์„œํ™”๋˜์–ด ์žˆ๋Š” ํ•œ PowerShell ์‚ฌ์šฉ ๊ฒฐ์ •์— ๊ฑฐ์˜ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ, ๊ตฌ๋ฌธ ์„คํƒ•์€ ์ฃผ์–ด์ง„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์–ธ์–ด๋ฅผ ์„ ํƒํ•  ๋•Œ ์ €์—๊ฒŒ ํฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ๋‹น์‹ ์€ ์˜ฌ๋ฐ”๋ฅธ ์–ธ์–ด์— ์™”์Šต๋‹ˆ๋‹ค! PowerShell์€ ๊ตฌ๋ฌธ ์„คํƒ•์ด ํฌํ•จ๋œ ๊ธ์ •์ ์ธ ์‚ฌ์นด๋ฆฐ์ž…๋‹ˆ๋‹ค.

๋ชจ๋ฅด๋Š” ์‚ฌ๋žŒ๋“ค์„ ๊ต์œกํ•˜๊ธฐ ์œ„ํ•ด PowerShell์—์„œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ "null ๋ณ‘ํ•ฉ"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
~$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 | ๊ฐœ์ฒด ์„ ํƒ - ์ฒ˜์Œ 1$TheAssigningForeachWay = foreach($null์˜ $item, 1, 2, $null, 3, 4) {if ($item -ne $null) { $item;



์ง€๊ธˆ์€ ๊ทธ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•˜์ง€๋งŒ ์–ธ์–ด ๊ตฌ๋ฌธ์ด ํ›จ์”ฌ ์œ ์—ฐํ•˜๋‹ค๋Š” ์ ์„ ์ฆ๋ช…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๋ฐ๋ชจ๋Š” PowerShell 1.0๊นŒ์ง€ ๋‹ค์‹œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์—๋Š” ์–ด์จŒ๋“  Core๋กœ์˜ ์ „ํ™˜์œผ๋กœ ์ธํ•ด ๋งŽ์€ PowerShell ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ค‘๋‹จ๋˜๊ธฐ ์ง์ „์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‹น์‹ ์ด ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค. Core์—๋Š” ์‹ค์ œ๋กœ ๊ตฌ๋ฌธ์„ ๊นจ๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๊ฑฐ์˜ ์—†์œผ๋ฉฐ ์ฝ”์–ด์—์„œ ์ž˜ ์ž‘๋™ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ๋ชจ๋“ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค(+- Linux ๋Œ€ Windows ๊ฒฝ๋กœ ์ง€์ •/์ค„ ๋ฐ”๊ฟˆ๊ณผ ๊ด€๋ จ๋œ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ). ๋ณด๋‹ค ์‹ค์šฉ์ ์ธ ์šฉ์–ด๋กœ, Windows ํ”Œ๋žซํผ๋ณ„ API ์ข…์†์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋ชจ๋“ˆ์ด Core์—์„œ ์ž‘๋™ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์ ์Šต๋‹ˆ๋‹ค(์˜ˆ: WPF ๋ž˜ํผ๊ฐ€ Linux์—์„œ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์ˆจ์„ ์ฐธ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค).

๊ตฌ๋ฌธ ๋ณ€๊ฒฝ์œผ๋กœ ์–ด๋Š ์ชฝ์ด๋“  ์—ฌ์ „ํžˆ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ ์ตœ๊ทผ ํšŒ์‹ ์— ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์žฅ์„ ํ•ด๊ฒฐํ•˜๊ณ  ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค.

Re: ๋ฌธ๋ฒ•์ ์ธ ์„คํƒ•, ๋‚ด ๋ƒ‰์†Œ์ ์ธ ๋งˆ์Œ์€ ์˜ํ™” "์Šค๋‚ด์น˜"๋ฅผ ์ธ์šฉํ•ฉ๋‹ˆ๋‹ค: "๋‚˜๋Š” ์ด๋ฏธ ์ถฉ๋ถ„ํžˆ ๋‹ฌ์ฝคํ•ฉ๋‹ˆ๋‹ค"
Re: Core์˜ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ ๊นจ๊ธฐ: ์ง€๊ธˆ์€ ๊ฑฐ์˜ ์—†๊ณ  ๊ฐ€๋Šฅํ•œ ํ•œ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•ฉ์‹œ๋‹ค.

@StartAutomating : ๋‚ด๊ฐ€ ์  ์ˆ˜ ์—†๋‹ค๋Š” ๋ง์ž…๋‹ˆ๊นŒ? ์•„์ง ์„คํƒ•์ด ๋” ๋“ค์–ด๊ฐˆ ๊ณณ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๐Ÿ˜œ

๋ชจ๋ฅด๋Š” ์‚ฌ๋žŒ๋“ค์„ ๊ต์œกํ•˜๊ธฐ ์œ„ํ•ด PowerShell์—์„œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ "null ๋ณ‘ํ•ฉ"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์•Œ์•„ ๋ƒˆ์ง€๋งŒ (๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ์“ด ๋‚ด ์ž์‹ ์˜ ๋Œ€๋‹ต์ž…๋‹ˆ๋‹ค), ๊ทธ๊ฒƒ์€ ๋ฉ์–ด๋ฆฌ์ฒ˜๋Ÿผ ๋Š๊ปด์กŒ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ๊ฐ€๋Šฅ์„ฑ์„ ๊ฐ€์ง„ ๋ฉ‹์ง„ ์•„์ด๋””์–ด์ง€๋งŒ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ ๋‹ต๋ณ€์— ๋Œ€ํ•œ ํ•œ ๋…ผํ‰์ž๊ฐ€ ์ง€์ ํ–ˆ๋“ฏ์ด ํ‰๊ฐ€๋Š” ๋‹จ๋ฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ?. ์—ฐ์‚ฐ์ž๋Š” ํ˜ธ์ถœ/์†์„ฑ์„ ์—ฐ๊ฒฐํ•  ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ ๋” ์ด์ƒ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ 2013๋…„์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋•Œ์—๋„ ์ด ์˜ˆ์ œ์—์„œ ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์€ ์ผ์ด ์ง„ํ–‰๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ“๊ธ€์—์„œ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ์—ฌ๊ฒผ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ๊ฐ€ ๊ธฐํ˜ธ๋ณ„๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์„ ์ •ํ™•ํžˆ ๋ถ„์„ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‹น์‹ ์ด ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค. Core์—๋Š” ์‹ค์ œ๋กœ ๊ตฌ๋ฌธ์„ ๊นจ๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๊ฑฐ์˜ ์—†์œผ๋ฉฐ ์ฝ”์–ด์—์„œ ์ž˜ ์ž‘๋™ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ๋ชจ๋“ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค(+- Linux ๋Œ€ Windows ๊ฒฝ๋กœ ์ง€์ •/์ค„ ๋ฐ”๊ฟˆ๊ณผ ๊ด€๋ จ๋œ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ). ๋ณด๋‹ค ์‹ค์šฉ์ ์ธ ์šฉ์–ด๋กœ, Windows ํ”Œ๋žซํผ๋ณ„ API ์ข…์†์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋ชจ๋“ˆ์ด Core์—์„œ ์ž‘๋™ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์ ์Šต๋‹ˆ๋‹ค(์˜ˆ: WPF ๋ž˜ํผ๊ฐ€ Linux์—์„œ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์ˆจ์„ ์ฐธ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค).

๋‚˜๋Š” ์‹ค์ œ๋กœ ์ ์ ˆํ•œ ํ†ต๊ณ„๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ์ˆ˜์ง‘ํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์ด์™€ ๊ด€๋ จํ•˜์—ฌ ๊ฒฝํ—˜์—์„œ ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด pre-Core์˜ ๊ฒฝ์šฐ [System.Web.Security.Membership]::GeneratePassword(32, 6) ์‚ฌ์šฉํ•˜์—ฌ ์•”ํ˜ธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ System.Web ๋Š” Core์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. (๋‚˜๋Š” ์•„๋งˆ๋„ ์ด์ „ System.Web.dll์„ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ, ๊ทธ๋Ÿด ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.) ์‹ค์ œ๋กœ ๊ตฌ๋ฌธ ๋ณ€๊ฒฝ์€ ๋ˆ„๋ฝ๋œ API๋ณด๋‹ค ํ•ด๊ฒฐํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. devkit์— ๋Œ€ํ•œ Docker ๋น„๋ฐ€์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋น ๋ฅธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ์— ์ข‹์€ ์žฅ์†Œ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ bash๋ณด๋‹ค PowerShell Core์—์„œ ๋†€๋ž๊ฒŒ๋„ ๋” ์žฅํ™ฉํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  bash์˜ ์†”๋ฃจ์…˜์€ ์ข…์ข… ๋ณด๊ธฐ ํ‰ํ•ฉ๋‹ˆ๋‹ค.

Re: ๋ฌธ๋ฒ•์ ์ธ ์„คํƒ•, ๋‚ด ๋ƒ‰์†Œ์ ์ธ ๋งˆ์Œ์€ ์˜ํ™” "์Šค๋‚ด์น˜"๋ฅผ ์ธ์šฉํ•ฉ๋‹ˆ๋‹ค: "๋‚˜๋Š” ์ด๋ฏธ ์ถฉ๋ถ„ํžˆ ๋‹ฌ์ฝคํ•ฉ๋‹ˆ๋‹ค"

๋•Œ์— ๋”ฐ๋ผ ๋‹ค๋ฅด์ง€. ๋•Œ๋กœ๋Š” PowerShell์ด โ€‹โ€‹๋งค์šฐ ์ฆ๊ฒ๋‹ค๊ณ  ๋Š๋‚๋‹ˆ๋‹ค. null์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์€ ๋‚ด๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ทธ๋ ‡๊ฒŒ ๋Š๋ผ์ง€ ์•Š๋Š” ํ•ต์‹ฌ ์˜์—ญ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๋น„๋ก ๋งŽ์€ ์–ธ์–ด์—์„œ ๋™์ผํ•˜๊ฒŒ ๋งํ•˜๊ฒ ์ง€๋งŒ์š”. ๋‚˜๋Š” ๋˜ํ•œ ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋‚˜ bash์˜ && ๋ฐ || ์—ฐ๊ฒฐ์— ๋น„ํ•ด ๊ธฐ์กด์˜ ์ธ๋ผ์ธ PowerShell if-else ๋ฌธ์ด ๋ฒˆ๊ฑฐ๋กญ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ช‡ ๋…„ ์ „ PowerShell์—์„œ ๋ฉ€์–ด์ง€๊ฒŒ ๋งŒ๋“  ์ฃผ์š” ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜์ด๋ฏ€๋กœ ์–ธ๊ธ‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— ์ €๋Š” ๋งค์ผ ๋‹ค์–‘ํ•œ ์–ธ์–ด๋ฅผ ๋‹ค๋ฃจ๋ฉฐ ๋ฌด์—‡์„ ์“ฐ๋“  ํ•ญ์ƒ "X ์–ธ์–ด๋กœ ํ•˜๋ฉด ํ›จ์”ฌ ์‰ฌ์šธ ๊ฑฐ์—์š”!"๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” X ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. "Y ์–ธ์–ด์—์„œ๋Š” ํ›จ์”ฌ ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค!"๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ํฐ ์†Œ๋ฆฌ๋กœ ๋งํ•  ๊ธฐํšŒ๊ฐ€ ์žˆ๊ณ  ์–ธ์–ด์˜ ๋ฐฉํ–ฅ์„ ํ”๋“ค ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ฐ›์•„๋“ค์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ €๋Š” ์—ฌ๊ธฐ์„œ ๋งˆ์Œ์„ ๋ฐ”๊พธ๋Š” ๋ฐ ์ •๋ง๋กœ ๊ด€์‹ฌ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‹จ์ง€ ๋‹ค๋ฅธ ๊ด€์ ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค.

@StartAutomating : ๋‚ด๊ฐ€ ์  ์ˆ˜ ์—†๋‹ค๋Š” ๋ง์ž…๋‹ˆ๊นŒ? ์•„์ง ์„คํƒ•์ด ๋” ๋“ค์–ด๊ฐˆ ๊ณณ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๐Ÿ˜œ

๋‚˜๋Š” ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ ์„คํƒ•์„ ์‚ฌ๋ž‘ํ•ฉ๋‹ˆ๋‹ค! ๋‚˜๋Š” ํ• ๋กœ์œˆ์— ์žฅ๋‚œ๊พธ๋Ÿฌ๊ธฐ ๋†€์ด๋ฅผ ํ•˜๋Š” ์•„์ด์ฒ˜๋Ÿผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

@Zenexer : ์ €๋Š” Powershell์„ ์ •๋ง ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ง์žฅ์—์„œ ๋งค์ผ PS๋ฅผ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ํ• ๋งŒํผ ์šด์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์œ ์—ฐ์„ฑ, ํŠนํžˆ .NET๊ณผ์˜ ๊ณต์ƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ๊ทธ ๋ฐฉํ–ฅ์— ๊ด€์‹ฌ์„ ๊ฐ–๋Š” ์ด์œ ์ด๋ฉฐ ${...}? ๊ตฌ๋ฌธ์ด ์ €์—๊ฒŒ ๋„ˆ๋ฌด ๋ฐ›์•„๋“ค์ด๊ธฐ ํž˜๋“  ์ด์œ ์ž…๋‹ˆ๋‹ค.

์ข‹์€ ์ง€์ ์ด์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ข‹๋“  ๋‚˜์˜๋“  ์ง€๊ธˆ๊นŒ์ง€ PowerShell์€ ์˜๋ฏธ ์ฒด๊ณ„ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
์ƒˆ๋กœ์šด ์ฃผ์š” ๋ฒ„์ „์€ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์— ๋Œ€ํ•œ ํ™•๊ณ ํ•œ ์•ฝ์†๊ณผ ํ•จ๊ป˜ _new_ ๊ธฐ๋Šฅ๋งŒ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.
์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด Core์— ์„œ์„œํžˆ ๋“ค์–ด์˜ค๊ธฐ ์‹œ์ž‘ํ–ˆ๋Š”๋ฐ, ๋ถ€๋ถ„์ ์œผ๋กœ๋Š” ํฌ๋กœ์Šค ํ”Œ๋žซํผ์œผ๋กœ ์ด๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
์ฃผ ๋ฒ„์ „ v7.0์€ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ _์ฆ๊ฐ€_๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, Windows PowerShell์— ๋Œ€ํ•œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋Œ€์ฒด๋ฅผ ์ œ๊ณตํ•˜๋ ค๋Š” ์‹œ๋„์ž…๋‹ˆ๋‹ค.

๋งŽ์€ ์—ญ์‚ฌ์  ๋ฌธ์ œ๋Š” ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์‹ฌ๊ฐํ•˜๊ฒŒ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š๊ณ  ๋Š” ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์„ ํƒ์ (์˜ตํŠธ์ธ) ๊ธฐ๋Šฅ์œผ๋กœ๋งŒ ์ œ๊ณต๋  ์ˆ˜ ์žˆ์ง€๋งŒ,
๋ฒ„ํ‚ท 3์˜ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ํ•ญ์ƒ ์„ ํƒ ์‚ฌํ•ญ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ค‘๋‹จํ•  _์ž ์žฌ์ _์ด ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์€ ์ˆ˜์ •/๊ฐœ์„ ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ท ํ˜•์—์„œ ์–ธ์–ด๋ฅผ ๊ฐœ์„ ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

OP์—์„œ ์ฃผ์žฅํ•œ ๋ฐ”์™€ ๊ฐ™์ด ๋‹น๋ฉดํ•œ ์‚ฌ๋ก€๋Š” ๋ฒ„ํ‚ท 3 ๋ณ€๊ฒฝ์œผ๋กœ ์ €๋ฅผ ๊ณต๊ฒฉํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” _์ผ๋ถ€_ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๊นจ์งˆ ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ (

๋“œ๋ฌธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋ณ€์ˆ˜ ์ด๋ฆ„์— ? ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ „ํ˜€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๋งŒ์•ฝ ๊ทธ๋ ‡๋‹ค๋ฉด _without {...} _: ๋‹ค์Œ ๋ชจ๋“  ๊ฒƒ์ด ๋‹ค์Œ๊ณผ ํ•จ๊ป˜๋งŒ ์ž‘๋™ํ•œ๋‹ค๋ฉด {...} , ์™œ ? ๋Œ€ํ•ด ๋‹ค๋ฅผ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๊นŒ?: . , ; ( : ๋Š” ํ•ญ์ƒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ด์„๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ „ํ˜€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋“œ๋ผ์ด๋ธŒ ๋ถ„๋ฆฌ๊ธฐ)

{...} ๋„ ์š”๊ตฌํ•˜์ง€ ์•Š๊ณ  $var? ๋˜๋Š” $va?r ์™€ ๊ฐ™์€ ์ด๋ฆ„์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๋ฅผ ์š”๊ตฌํ•˜๋Š” ๋ฐฉ์ž„์ด์—ˆ๊ณ  ๋ฌธ์ œ๊ฐ€ ๋„์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ์–ธ์–ด.

C#์—์„œ ์˜๊ฐ์„ ๋ฐ›์€ 3๊ฐ€์ง€ ์ƒˆ๋กœ์šด ๊ด€๋ จ ๊ธฐ๋Šฅ(์ ์–ด๋„ ๊ตฌ๋ฌธ ํ˜•์‹์œผ๋กœ ๊ด€๋ จ๋จ)์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์‚ผํ•ญ ์กฐ๊ฑด - 7.0์˜ ์ง„์ •ํ•œ ๊ธฐ๋Šฅ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

  • Null-coalescing ์—ฐ์‚ฐ์ž - 7.0์˜ ์ง„์ •ํ•œ ๊ธฐ๋Šฅ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    • $var ?? 'default' ๋ฐ $var ??= 'default'

  • Null ์กฐ๊ฑด๋ถ€ ์—ฐ์‚ฐ์ž - ๋‹น๋ฉดํ•œ ๋ฌธ์ œ - 7.0์˜ _์‹คํ—˜_ ๊ธฐ๋Šฅ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    • $possiblyNull?.ToString()

๊ทธ๋“ค ๋ชจ๋‘๋Š” ๊ตฌ๋ฌธ์˜ ์ผ๋ถ€๋กœ ? ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ?. ๊ฐ€์žฅ ๋ถ„๋ช…ํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ธฐ์กด $var? ๊ตฌ๋ฌธ ๋ถ„์„์˜ ๋ถ€๋‹ด์— ์˜ํ–ฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.

  • $var?1:0 ์™€ ๊ฐ™์€ ๊ฒƒ์€ ์ฝ”๋”ฉ ๊ณจํผ์—๊ฒŒ๋งŒ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๊ณ  ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ? ์— ๊ตฌ๋ฌธ ๊ธฐ๋Šฅ์ด ์žˆ์œผ๋ฉด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ? ์•ž์— _space_๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

  • ๋Œ€์กฐ์ ์œผ๋กœ, ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ $var??='bar' (์•„๋งˆ๋„ $baz = $foo??$bar ๋ณด๋‹ค ์ ์Œ)๋ฅผ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๋˜ํ•œ ๊ณต๋ฐฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, $var? ์˜ ํ˜„์žฌ ๊ตฌ๋ฌธ ๋ถ„์„์„ ๊ณ ์ˆ˜ํ•˜๋ฉด _์„ธ ๊ฐ€์ง€_ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ(์ •๋„๋Š” ๋‹ค์–‘ํ•˜์ง€๋งŒ)์„ ๋ฐฉํ•ดํ•˜๊ฒŒ ๋˜๋ฉฐ, ๊ทธ ์ค‘ 2๊ฐœ๋Š” ์ด๋ฏธ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค(์‹คํ—˜์šฉ ์•„๋‹˜).

{...} ๋ฅผ ์š”๊ตฌํ•˜๋Š” ๋ฌธ์ œ๋Š” ํƒ€์ดํ•‘์˜ ๋ถˆํŽธํ•จ์ด _์•„๋‹™๋‹ˆ๋‹ค_: ์ฒ˜์Œ์—๋Š” _ํ•„์š”์„ฑ์„ ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š๊ณ _ ๋‚˜์ค‘์— _ํ•„์š”์„ฑ์„ ์žŠ๋Š”_(์ž ์žฌ์ ์œผ๋กœ ๋ฏธ๋ฌ˜ํ•œ ์˜ค์ž‘๋™๊ณผ ํ•จ๊ป˜) - ์™œ๋ƒํ•˜๋ฉด ๋„ˆ๋ฌด ๋ฐ˜ ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค.

@ExE-Boss, ๋ฒ„์ „ ์กฐ๊ฑด๋ถ€ ๋™์ž‘์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” @jhoneill์˜ ์˜๊ฒฌ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ ํŠน์ˆ˜ ์ผ€์ด์Šค๋กœ ์—”์ง„์„ ๋ฐฉํ•ดํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@ mklement0 : ๊ทธ๊ฒƒ์€ ์ž์—ฐ์Šค๋Ÿฌ์šด / ์ง๊ด€ / ๋‹น์‹  ์ด๋ฆ„ - ๊ทธ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€๊ด„ํ˜ธ๋Š” ๋‹จ๋‹จํ•˜๊ณ  ์ค‘๊ด„ํ˜ธ๋Š” ํ›จ์”ฌ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@mklement0 ์ดํ›„ ํ•ฉ์˜๊ฐ€

์ €๋Š” ์•„์ง PowerShell์— C# ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์™„์ „ํžˆ ์„ค๋“ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ํ‚ค๋ณด๋“œ์— ๊ธฐํ˜ธ๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์ด๋ฏธ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ">" "๋ณด๋‹ค ํผ" ๋˜๋Š” "๋กœ ๋ฆฌ๋””๋ ‰์…˜"์ž…๋‹ˆ๊นŒ? "=" ํ• ๋‹น ๋˜๋Š” ํ…Œ์ŠคํŠธ ๊ฐ™์Œ(๋‹ค๋ฅธ ์–ธ์–ด๋Š” ํ• ๋‹น์„ ์œ„ํ•ด :=๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๊ฐ™์Œ์„ ์œ„ํ•ด == ์‚ฌ์šฉ) ์–ธ์–ด ์‚ฌ์ด๋ฅผ ์ด๋™ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ -eq ๋˜๋Š” -gt ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์žŠ์–ด๋ฒ„๋ฆด ๊ฒƒ์ด๊ณ  ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์— ์ง‘์ฐฉํ•ฉ๋‹ˆ๋‹ค... Is + ์‚ฐ์ˆ  ๋ง์…ˆ, ๋˜๋Š” ๋ฌธ์ž์—ด/๋ฐฐ์—ด ์—ฐ๊ฒฐ. *๋Š” ๊ณฑ์…ˆ๊ณผ ์™€์ผ๋“œ ์นด๋“œ์ž…๋‹ˆ๋‹ค. %๋Š” ๋ชจ๋“ˆ๋กœ์ด๊ณ  forEach-object. ์˜ ๋ณ„์นญ์ž…๋‹ˆ๋‹ค.

๊ฐ€๋‚œํ•œ ? Where-Object. ์˜ ๋ณ„์นญ์ด๋ฉฐ ์ž๋™ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Get-Alias ? ๋˜๋Š” Get-Variable ? ... ๋ฅผ ์‹œ๋„ํ•˜๋ฉด ์™€์ผ๋“œ ์นด๋“œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Get-PSdrive ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด "๋ณ€์ˆ˜" ๋“ฑ์˜ ์ด๋ฆ„ ๋์— ":"๊ฐ€ ์—†๊ณ  ์ด๋ฆ„์— ํ•˜๋‚˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋“œ๋ผ์ด๋ธŒ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก ํ•˜์ง€ ์•Š๋Š” ํ•œ ๋‹น์‹ ์ด ์“ด ์ฐธ์กฐ "$drive="C" ํ•˜๊ณ  ๊ทธ๊ฒƒ์„ ๋”ฐ๋ผ "$drive:temp" '๊ทธ๋“ค์ด ์•Œ๊ณ  ๋‹นํ™ฉํ•œ๋‹ค (๊ทธ๋“ค์€ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜์ง€ ์•Š์„๊ณผ ์˜ค๋ž˜๋œ ์†) PowerShell์„ ์ƒˆ๋กœ์šด ์‚ฌ๋žŒ ๋ฐฉ๊ธˆ ๋ช…๋ช…๋œ โ€‹โ€‹๋ฒ”์œ„ "๋“œ๋ผ์ด๋ธŒ"๋ฅผ ๋ฐœ๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด์— ๋Œ€ํ•ด ... '":" ๋ฐ "?"๋ฅผ ์ถ”๊ฐ€๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ๊ตฌ๋ฌธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ์ •์‹ ์ด์—์š”?'
IIRC, ํŠธ์œ„ํ„ฐ @Brucey ๋Š” ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋ฅผ "๋ณ„๋กœ

๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ $PSEdition.length -gt 2 ์“ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ $PSEdition. length-gt2 ๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค(๋‘ ๋ฐ˜์ชฝ ์‚ฌ์ด์— ์ค„ ๋ฐ”๊ฟˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.) "." "ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ", "์ด ๋ฒ”์œ„์—์„œ ์‹คํ–‰" ๋ฐ "๊ตฌ์„ฑ์›" ์—ญํ• ๋„ ํ•˜๋Š” ์˜ค๋ฒ„๋กœ๋“œ๋˜์ง€๋งŒ PS V1-V5์—์„œ๋Š” ์„ ํ–‰ ๊ณต๋ฐฑ์ด ํ•„์š”ํ•œ ์—ฐ์‚ฐ์ž๋ฅผ ์ƒ๊ฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. "." ํ•˜๋‚˜๊ฐ€ _is_ ์žˆ์œผ๋ฉด ๊นจ๋Š” ๊ฒƒ์ด ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ตฌ๋ฌธ ๋ถ„์„์„ ์œ„ํ•ด ์‚ผํ•ญ ์—ฐ์‚ฐ์ž _might_๋Š” ์„ ํ–‰ ๊ณต๋ฐฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
$host.debuggerEnabled?0:1 ๋Š” "?"์ด๊ธฐ ๋•Œ๋ฌธ์— OK์ž…๋‹ˆ๋‹ค. ์†์„ฑ์˜ ์ผ๋ถ€๋กœ ๊ฐ€์ • _not_
$IsCoreCLR?0:1 ๋Š” "?" ๋•Œ๋ฌธ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ ์ด๋ฆ„์˜ ์ผ๋ถ€๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

null ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.
$null?? "default" ์—๋Š” ๊ณต๋ฐฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. $true.length?? "default" ์—๋Š” ๊ณต๋ฐฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ์˜ ๋งจ ์œ„์— ์žˆ๋˜ ์›๋ž˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ž ์‹œ ํ•œ์ชฝ์œผ๋กœ ์น˜์›Œ๋‘ก๋‹ˆ๋‹ค. ์œ„์˜ ๊ฒฝ์šฐ๋Š” ๋ฌด์–ธ๊ฐ€๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ ์ด๋ฆ„์— "?"๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค. "."๊ฐ€ ํฌํ•จ๋œ ์ด๋ฆ„์ฒ˜๋Ÿผ ์ค‘๊ด„ํ˜ธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” "+" ๋˜๋Š” ":" ๋ฐ @StartAutomating ์ด "?"์˜ ์ฃผ์š” ์‚ฌ์šฉ์ž์ž…๋‹ˆ๋‹ค. in names๋Š” ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” _break_๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋„ ๋ฉค๋ฒ„์— ์ด๋ฅด๊ธฐ๋„ ์ „์— '์ด๋ฏธ ํ•  ๋ฐฉ๋ฒ•์„ ์ฐพ์œผ์‹ญ์‹œ์˜ค'์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ํ•„์š”๋กœํ•˜๋Š” ์‹คํ—˜์ ์ธ ๊ธฐ๋Šฅ์— ๋„ฃ์–ด ์งง์€ ์‹œ๊ฐ„ ์ฐฝ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ? ์ด๋ฆ„์„ ์ค‘๊ด„ํ˜ธ๋กœ ๋ฌถ๊ณ  ํ•ด๋‹น ๊ธฐ๋Šฅ์ด ์ผœ์ ธ ์žˆ๋Š” ๊ฒฝ์šฐ - ์ด๊ฒƒ์ด ๊ธฐ๋ณธ๊ฐ’์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค - ๋ชจ๋‘ ์ƒˆ๋กœ์šด ? ์—ฐ์‚ฐ์ž๋Š” ๊ทธ์— ๋”ฐ๋ผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ธฐ๋Šฅ์ด ๊บผ์ ธ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ํŒŒ์„œ์— ์ด๋Ÿฌํ•œ ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ๋Š” ๊ณต๋ฐฑ์ด๋‚˜ ์ค‘๊ด„ํ˜ธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๋ฉฐ, ์˜ต์…˜์ด ์„ค์ •๋˜์ง€ ์•Š์€ ํ•œ ์ผ๋ถ€ ์Šคํฌ๋ฆฝํŠธ(์ •๋Ÿ‰ํ•  ์ˆ˜ ์—†๋Š” ์ž‘์€ ์ˆซ์ž)๋Š” ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค(๋ณ€์ˆ˜ ์ด๋ฆ„์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด $IsIt์„ ๋ฐฉ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ?.tostring()์€ ์Šคํฌ๋ฆฝํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ์˜ค๋ฅ˜์ด๋ฏ€๋กœ ์Šคํฌ๋ฆฝํŠธ๋Š” ์œ„ํ—˜ํ•˜๊ฒŒ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ์‹คํŒจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” ํฌ์ธํŠธ ๋ฆด๋ฆฌ์Šค์—์„œ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค(PowerShell์ด โ€‹โ€‹์‹ค์ œ๋กœ sem-ver๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์€ ๋งž์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์ข‹์€ ์›์น™์ž…๋‹ˆ๋‹ค)

{...}๋ฅผ ์š”๊ตฌํ•˜๋Š” ๋ฌธ์ œ๋Š” ํƒ€์ดํ•‘์˜ ๋ถˆํŽธํ•จ๋งŒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ๊ทธ ํ•„์š”์„ฑ์„ ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š๊ณ  ๋‚˜์ค‘์— ํ•„์š”์„ฑ์„ ์žŠ์–ด๋ฒ„๋ฆฌ๋Š” ๊ฒƒ(์ž ์žฌ์ ์œผ๋กœ ๋ฏธ๋ฌ˜ํ•œ ์˜ค์ž‘๋™๊ณผ ํ•จ๊ป˜)์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋ฐ˜ ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ข‹์€ ์ง€์ ์ด๋ฉฐ ์‹ค์ œ๋กœ ${...?} ์— ๋Œ€ํ•ด ๋‚˜๋ฅผ ์งœ์ฆ๋‚˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. {} ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋”๋ผ๋„ ๊ฒฐ๊ตญ ์žŠ์–ด๋ฒ„๋ฆด ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๋ฉฐ, ์ด๋Š” ์•„๋งˆ๋„ ๊ตฌ๋ฌธ์ ์œผ๋กœ ์—ฌ์ „ํžˆ ์œ ํšจํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ์—๋Š” ๋ถ„๋ช…ํ•˜์ง€ ์•Š์€ ๋ฏธ๋ฌ˜ํ•œ ๋ฒ„๊ทธ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. $var??='bar' ๋Š” ์ข‹์€ ์˜ˆ์ด์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ„๊ฒฉ์— ๋Œ€ํ•ด ๋งค์šฐ ์กฐ์‹ฌํ•ฉ๋‹ˆ๋‹ค.

@jhoneill๋‹˜ , ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. PowerShell์—์„œ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๊ธฐํ˜ธ๊ฐ€ ์ด์ค‘(์‚ผ์ค‘, ...) ์—ญํ• ์„ ํ•˜๋Š”์ง€ ์ž˜ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ๋ชจ๋“  ์šฉ๋„๋ฅผ ์•Œ๊ณ  ๋‚˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ(์˜ˆ: ์—ฐ์‚ฐ์ž๋กœ * ๋Œ€ ์™€์ผ๋“œ์นด๋“œ ๋ฌธ์ž๋กœ * )

    • ? ๋Œ€ํ•œ ๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ์—๋Š” ํŠน์ • ์ˆ˜์ค€์˜ ์ถ”์ƒํ™”์—์„œ ์‹ค์ œ๋กœ ๊ณตํ†ต์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Get-ChildItem | ? Target , $var?.Target , $? ์—์„œ ? ๋ฅผ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. $? , $var ?? 'none' ๋ชจ๋‘ ์ผ์ข…์˜ _์งˆ๋ฌธ_ ๋ฐ ๋”ฐ๋ผ์„œ _ํ…Œ์ŠคํŠธ_ ๋˜๋Š” _์กฐ๊ฑด๋ถ€ ํ–‰๋™_์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

  • ํ•ฉ๋ฆฌ์ ์ธ ๋‹คํ˜•์„ฑ ๋™์ž‘(์˜ˆ: + ๋ฌธ์ž์—ด๊ณผ ์—ฐ๊ฒฐ ์ˆ˜ํ–‰).

๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์˜ˆ๋Š” & (ํ˜ธ์ถœ ์—ฐ์‚ฐ์ž ๋Œ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์—ฐ์‚ฐ์ž)์ด๋ฉฐ, ์ด๋Š” _position_์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์˜๋ฏธ๋กœ ๋™์ผํ•œ ์ปจํ…์ŠคํŠธ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ณ€์ˆ˜ ์ด๋ฆ„์— "?"๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค. "."๊ฐ€ ํฌํ•จ๋œ ์ด๋ฆ„์ฒ˜๋Ÿผ ์ค‘๊ด„ํ˜ธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” "+" ๋˜๋Š” ":"

์‚ฌ์‹ค, ๊ทธ๋ฆฌ๊ณ  ๋ฐ˜๋ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ ์ด๋ฆ„์— ? ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์‚ฌ๋ผ์ง€์ง€ ์•Š์ง€๋งŒ ์•ž์œผ๋กœ {...} ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ${var?} = @{ foo=1 }; ${var?}?.foo

๋‹น์‹ ์ด ์ฆ๋ช…ํ•˜๋“ฏ์ด, ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ? ๊ฐ€ ์œ ํšจํ•œ ๋ฌธ์ž๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒํ•˜์ง€ _์•„๋‹Œ_ ํ˜„๋ช…ํ•˜๊ฒŒ ๊ด€์ ์—์„œ. ์ด๋Ÿฌํ•œ ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•ด ์–ธ์–ด๋ฅผ (์ƒํ™ฉ์ ์œผ๋กœ) ๊ณต๋ฐฑ์— ๋ฏผ๊ฐํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. PowerShell์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ณต๋ฐฑ์„ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—(์ตœ์†Œํ•œ ํ•œ ์ค„์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. . ๋Š” ์ •๋‹นํ•œ ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค. ? ๋Š” Where-Object ๋’ค์— ๊ณต๋ฐฑ์ด ํ•„์š”ํ•œ gci|?target ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Œ) ๋ช…๋ น ์ด๋ฆ„ _do_๋Š” ๊ณต๋ฐฑ์œผ๋กœ ์ธ์ˆ˜์™€ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

. ์™€ ๋ฉค๋ฒ„ ์ด๋ฆ„( $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 ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ; .foo ๋Š” _command_์˜ ์ด๋ฆ„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@KirkMunro ์˜ ์—ฌ๋Ÿฌ ์ค„ ์—ฐ์† RFC๋Š” _commands_๊ฐ€ ์—ฌ๋Ÿฌ ์ค„์— ๊ฑธ์ณ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘๋ฉด์„œ ๋‹ค์Œ์œผ๋กœ ์ตœ์ƒ์˜ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค( https://github.com/PowerShell/PowerShell-RFC/pull/179#issuecomment -498734875 ์ฐธ์กฐ).

๊ธฐ๋ณธ์ ์œผ๋กœ ์ผœ์ ธ ์žˆ๋Š” ์‹คํ—˜ ๊ธฐ๋Šฅ์— ๊ด€ํ•ด์„œ: ๋‹คํ–‰ํžˆ๋„ _preview_ ๋ฆด๋ฆฌ์Šค - ๋ฆด๋ฆฌ์Šค ํ›„๋ณด๊ฐ€ ์•„๋‹˜ - ์ด์ œ ๊ธฐ๋ณธ์ ์œผ๋กœ _๋ชจ๋“ _ ์‹คํ—˜ ๊ธฐ๋Šฅ์„ ์ผญ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Enable-ExperimentalFeature ๋ฅผ _without_ -Scope ๋˜๋Š” -Scope CurrentUser ์—์„œ ํ™œ์„ฑํ™”ํ•œ ๊ธฐ๋Šฅ๊ณผ ํ•จ๊ป˜ ์‹คํ–‰ํ•œ ์ ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ด๋Š” ์ง€์†์ ์œผ๋กœ ๋ฌด์‹œ๋œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค.

@mklement0 ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ทธ ๋ชจ๋“  ๊ฒƒ์— ๋™์˜ํ•˜์ง€๋งŒ, ๋‹น์‹ ์ด ๊ฑฐ๊ธฐ์— ์žˆ๋Š” ์—ฌ๋ถ„์˜ ๋น„ํŠธ์™€ ์กฐ๊ฐ์œผ๋กœ ์ธํ•ด ์ด ํŠน์ • ํ† ๋ก ์„ ์•ฝ๊ฐ„

๋‚˜๋Š” ? ๋ฅผ ์ผ๋ฐ˜ ๋ณ€์ˆ˜ ์ด๋ฆ„ ๋ฌธ์ž๋กœ ๊ณ„์† ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ธฐ๊ปํ•ด์•ผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ทน๋„๋กœ ํ˜ผ๋ž€์Šค๋Ÿฝ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ‘์ž๊ธฐ ๊ณต๋ฐฑ์ด ๋ฏผ๊ฐํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์—ญ์‚ฌ์ ์œผ๋กœ ์ ์–ด๋„ ๋ณ€์ˆ˜ ์ด๋ฆ„์—๋Š” _ever_๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ์—๋Š” ๊ณต๋ฐฑ์„ ๊ตฌ๋ถ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ๋ชจํ˜ธ์„ฑ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ ๋ณ€๊ฒฝ์„ ํ•˜๊ณ  ? ๊ฐ€ ๋ณ€์ˆ˜ ์ด๋ฆ„์— ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ํฐ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ†ตํ•ด ์ž‘์„ฑ์ž์—๊ฒŒ ๊ตฌ๋ฌธ์ด ๋” ์ด์ƒ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Œ์„ ๊ฒฝ๊ณ ํ•˜๋Š” PSSA ๊ทœ์น™์„ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ๋ฐ˜๋Œ€๋Š” ๊ทธ๋ ‡๊ฒŒ ์‰ฝ๊ฒŒ ์‚ฌ์‹ค์ด ์•„๋‹ˆ๋ฉฐ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊ณผ ๋‹ฌ๋ฆฌ ๋ฐ˜๋“œ์‹œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์ด ํ•˜๊ณ  ์žˆ๋Š” ์ผ์„ ๋ชจ๋ฅธ ์ฑ„ ์‹ค์ˆ˜๋กœ ์ž˜๋ชป๋œ ๋ณ€์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งค์šฐ ์‰ฝ๊ฒŒ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@PowerShell/powershell-committee์—์„œ ์ด์— ๋Œ€ํ•ด ๋…ผ์˜ํ–ˆ์œผ๋ฉฐ ์Šคํฌ๋ฆฝํŠธ์˜ PowerShell ์ฝ”ํผ์Šค๋ฅผ ๋ถ„์„ํ–ˆ์œผ๋ฉฐ ๋ฌผ์Œํ‘œ๋กœ ๋๋‚˜๋Š” ๋ณ€์ˆ˜ ์ด๋ฆ„์ด ๊ฝค ๋งŽ์ด ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ PowerShell ๋ณ€์ˆ˜ ์ด๋ฆ„ ์ฃผ์œ„์˜ ์ค‘๊ด„ํ˜ธ๋ฅผ ๋Š์„ ์ˆ˜๋Š” ์—†์œผ๋ฉฐ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๋‹ค๋ฅธ ๋ฌธ์ž(์˜ˆ: ๋ฌธ์ž์—ด ๋‚ด)์™€ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์กด ์–ธ์–ด ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์Šคํฌ๋ฆฝํŠธ์˜ PowerShell ๋ง๋ญ‰์น˜๋ฅผ ๋ถ„์„ํ–ˆ๊ณ  ๋ฌผ์Œํ‘œ๋กœ ๋๋‚˜๋Š” ๋ณ€์ˆ˜ ์ด๋ฆ„์˜ ์‚ฌ์šฉ์ด ๊ฝค ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

@SteveL-MSFT ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ ๊ณต์œ ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์˜ˆ, ์ผ๋ถ€ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ตฌ์„ฑ์›์ด ์ž์ฒด ๋ถ„์„์„ ์ˆ˜ํ–‰ํ–ˆ์ง€๋งŒ ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ๊ฒฐ๊ณผ์— ๊ทผ์ ‘ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์ค‘ ์ผ๋ถ€๋ฅผ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์‚ฌ์šฉ๋œ ๊ฒฐ๊ณผ์™€ ๋ฐฉ๋ฒ•์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์–ด์ ฏ๋ฐค ๋‚ด ์ปดํ“จํ„ฐ์—์„œ ์™„๋ฃŒํ•˜๋Š” ๋ฐ ๊ฑฐ์˜ 6์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋˜ AST๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ PowerShell Corpus ์— ๋Œ€ํ•œ ์ž์ฒด ๋ถ„์„์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. 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

์ˆ˜ํ•™์‹œ๊ฐ„์— '์ž‘ํ’ˆ ๋ณด์—ฌ์ฃผ์„ธ์š”' ๋ผ๋Š” ๋ง์ฒ˜๋Ÿผ ๐Ÿ˜„

ํ›Œ๋ฅญํ•œ ํƒ์ • ,

๋‚œ ๋‹น์‹ ์ด ์ž ์žฌ์  ํ˜•ํƒœ๋กœ ์ฃผ์–ด์ง„, ๋” ๋งŽ์€ ๊ฒฝ์šฐ๋ฅผ ์ œ๊ฑฐ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ ${...} ์ œ์•ˆ ๋œ ๋ณ€๊ฒฝ๊ณผ ํ•จ๊ป˜ ๊ณ„์† ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค - ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ทธ๊ฒƒ์€ ๋‹จ์ง€์˜ $isAwesome? ์šฐ๋ฆฌ๊ฐ€ํ•˜์ง€์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ${isAwesome?}

์˜ˆ์ œ ํŒŒ์ผ:

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

์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์„ ์–ป์Šต๋‹ˆ๋‹ค.

$isAwesome?
$isabc?
$adce?

์ฆ‰, ${def?} ๋ฐ ${is a bad var name?} ๋Š” ๊ณ ๋ คํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ถ”์‹ : $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%๋ฅผ

๋งํฌ๋œ ๋Œ“๊ธ€์„ ๋ณด๋ฉด _์ด๋ฆ„ ์— ? ์žˆ๋Š” ๋ชจ๋“  ๋ณ€์ˆ˜ ์ค‘_ 62%๊ฐ€ ์ด๋ฆ„์˜ _last_ ๋ฌธ์ž๋กœ ? ๊ฐ€ ์žˆ๋‹ค๊ณ  @adityapatwardhan ์ด ๋งํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋Œ€์กฐ์ ์œผ๋กœ (์ค‘๊ด„ํ˜ธ๊ฐ€ ์—†๋Š”) ? ๋ณ€์ˆ˜์˜ ์‹ค์ œ ๋ณด๊ธ‰๋ฅ (์ „์ฒด ๋ณ€์ˆ˜ ์‚ฌ์šฉ ๋น„์œจ)์— ๋Œ€ํ•œ ๋ถ„์„์ด ํ›จ์”ฌ ๋” ์ ์ ˆํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—์„œ ์œ„์›ํšŒ๋Š” "์šฐ๋ฆฌ๋Š” ์›ํ•˜์ง€ ์•Š๋Š”๋‹ค"๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๊ธฐ๋Šฅ์ด ๊ฒฐ๊ณผ์ ์œผ๋กœ ํˆฌ๋ฐ•ํ•˜๊ณ  ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๋ฉด ์™œ ์ด ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@ThomasNieto ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์™€ ๊ด€๋ จํ•˜์—ฌ ์–ด๋”˜๊ฐ€์—์„œ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ–ˆ์œผ๋ฉฐ ๋น„์Šทํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

@mburszley ๋ถ„์„ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ž‘๋…„์— ์–ป์€ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•(ast vs regex)์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

@mburszley , ํ•˜์ง€๋งŒ ๋‹ค์‹œ:

์œ„์›ํšŒ๋Š” ๋‹จ์ง€ "์šฐ๋ฆฌ๋Š” ์›ํ•˜์ง€ ์•Š๋Š”๋‹ค"๊ณ  ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค

์ด๊ฒƒ์ด ์‹ค์ œ๋กœ _๋ช…๋ชฉ_ ๊ฒฐ์ •์ด๋ผ๋ฉด(์‹ค์ œ ์‚ฌ์šฉ ๋ถ„์„์— ๊ทผ๊ฑฐํ•˜์ง€ ์•Š์€) ํŠนํžˆ _๋ช…์‹œ๋œ_ ์ด์œ ๊ฐ€ ๊ทธ๋Ÿฌํ•œ ๋ถ„์„์˜ ๊ทผ๊ฑฐ๋ผ๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ „์ฒด์— ์ข‹์€ ์ง•์กฐ๊ฐ€ ์•„๋‹ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ์œ„์›ํšŒ์— ๊ฒฐ์ •์˜ ๊ธฐ๋ฐ˜์ด ๋œ ์‹ค์ œ ์‚ฌ์šฉ ๋ถ„์„์„ ๋ณด์—ฌ์ฃผ๊ฑฐ๋‚˜ ๋ถ„์„์ด ๋ฏธํกํ–ˆ์Œ์„ ์ธ์‹ํ•˜๊ณ  ๊ฒฐ์ •์„ ์žฌ๊ณ ํ•  ๊ธฐํšŒ๋ฅผ ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/PowerShell/PowerShell/issues/11379#issuecomment-566756120 ์—์„œ ๋‚ด ์ œ์•ˆ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

$obj?.Method() ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ $<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๋Š” ์ด๊ฒƒ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด strict ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•„์ฃผ ์ ์€ ๋น„์œจ์˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๊นจ์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ?. ์‚ฌ์šฉ์— ์‹คํŒจํ•˜๋„๋ก ์„ค์ •ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„์— ๋Œ€ํ•ด ๋ฏธ์นœ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธด ํ•œ๋ฐ, ๊ทน์†Œ์ˆ˜๋ผ๋„ ์‚ฌ๋žŒ์„ ํ•ด์น˜์ง€ ์•Š์œผ๋ ค๋Š” ๋งˆ์Œ์€ ์ถฉ๋ถ„ํžˆ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

PowerShell์—๋Š” ๋” ์ด์ƒ ์‹คํ—˜์  ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ ๊ธฐ๋ณธ์  ์œผ๋กœ ์ผค ์ค€๋น„๊ฐ€ ๋˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด Enable-ExperimentalFeature Enable-PSFeature ์— ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. $?.GetType() ์™€ ๊ฐ™์€ ์ฝ”๋“œ๋กœ ์‹คํ–‰๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ์˜ ๊ฒฝ์šฐ ์•ž์œผ๋กœ ์ด๊ฒƒ์ด ์ค‘๋‹จ๋  ๊ฒƒ์ด๋ฉฐ ๋Œ€์‹  ${?}.GetType() ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒฝ๊ณ ๋ฅผ ๋ฐฉ์ถœํ•˜๊ธฐ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ์Šคํฌ๋ฆฝํŠธ๋Š” #requires -version 7.1 -feature PSNullConditionalOperators ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด PS 8์ด ์ถœ์‹œ๋  ๋•Œ๋งˆ๋‹ค ์ด ๊ธฐ๋Šฅ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@rkeithhill ์˜ ์˜ˆ์‹œ๋Š” ๋ฐ”๋กœ ๋ณธ๋ก ์œผ๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค.
ํ˜„์žฌ PowerShell ์ž‘๋™ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ์ž ์‹œ ์žŠ์œผ์‹ญ์‹œ์˜ค. ๋‹น์‹ ์ด ๋ณผ ๋•Œ

PS> $res?.Length

_name, operator, name_์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.
์–ด๋Š ์ชฝ์ด ๋” ์ดํ•ด๊ฐ€ ๋ ๊นŒ์š”? _"?" operator_ ๋˜๋Š” _"์˜ ์ผ๋ถ€์ž…๋‹ˆ๊นŒ?" name-element_ ์˜ ์ผ๋ถ€์ž…๋‹ˆ๊นŒ?
์ด๋Ÿฌํ•œ ์—ฐ์‚ฐ์ž๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ(๊ทธ๋ฆฌ๊ณ  "PowerShelly๊ฐ€ ์•„๋‹Œ" ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•จ) ์ž˜๋ชป ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ๊ณผ ์•ฝ๊ฐ„์˜ ํŒŒ์† ์‚ฌ์ด์—์„œ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

๋ณ€์ˆ˜ ์ด๋ฆ„์— ํŠน์ • [ํ•ฉ๋ฒ•] ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋‚˜์œ ์Šคํƒ€์ผ์ด๋ผ๊ณ  ๋งํ•˜๊ธฐ ์œ„ํ•ด psScriptAnalyzer _now_์— ๊ทœ์น™์„ ์ ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” Enable-feature ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์Šคํฌ๋ฆฝํŠธ์— ๋„ฃ๊ณ  ์ƒˆ ์Šคํฌ๋ฆฝํŠธ ๋‹ค์Œ์— ์‹คํ–‰ํ•˜๋ฉด ์ด์ „ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ค‘๋‹จ๋˜์ง€๋งŒ ๋‚˜๋จธ์ง€ ์‹œ๊ฐ„์—๋Š” ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. Y๊ฐ€ ์—„๊ฒฉ ๋ชจ๋“œ๋ฅผ ์ผœ๊ณ  X๊ฐ€ ๊บผ์ง์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— _ํƒ€์‚ฌ ์Šคํฌ๋ฆฝํŠธ X๊ฐ€ ์Šคํฌ๋ฆฝํŠธ Y_๋ฅผ ์‹คํ–‰ํ•œ ํ›„ ์‹คํŒจํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋‘ ์Šคํฌ๋ฆฝํŠธ์˜ ์ €์ž๋Š” ๋‚ด ๋‚˜์œ ์ฑ…์— ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณ€์ˆ˜ ์ด๋ฆ„์— ํŠน์ • [ํ•ฉ๋ฒ•] ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š์€ ์Šคํƒ€์ผ์ด๋ผ๊ณ  ๋งํ•˜๊ธฐ ์œ„ํ•ด ์ด์ œ psScriptAnalyzer์— ๊ทœ์น™์„ ์ ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. PowerShell์ด โ€‹โ€‹๋ณ€์ˆ˜๋ฅผ ํ† ํฐํ™”ํ•˜๋Š” ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•˜๋ฉด PSScriptAnalyzer์—์„œ๋„ ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค. $res? ์™€ ๊ฐ™์€ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ดํŽด๋ด…๋‹ˆ๋‹ค.

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

๋‹น์‹ ์—๊ฒŒ ์ค€๋‹ค

res?

๊ทธ๋Ÿฌ๋‚˜ PowerShell์ด โ€‹โ€‹๊ตฌ๋ฌธ ๋ถ„์„๋˜๋Š” ๋ฐฉ์‹(์˜ˆ: 7.2)์„ ๋ณ€๊ฒฝํ•˜๋ฉด


์ด์ œ PSScriptAnalyzer๋Š” ? ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด๊ฒƒ์€ ๋” ์ด์ƒ ๋ณ€์ˆ˜ ์ด๋ฆ„์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(์ •์˜์ƒ, ํ…Œ์ŠคํŠธํ•˜๋ ค๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๊ธฐ ๋•Œ๋ฌธ์—). ์ด๋Š” PSScriptAnalyzer๊ฐ€ PowerShell ๋ชจ๋“ˆ์ด๊ณ  PowerShell์—์„œ ์ œ๊ณต๋˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ํŒŒ์„œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์™„์ „ํžˆ ์œ ์ง€ ๊ด€๋ฆฌํ•  ์ˆ˜ ์—†๊ณ  ์žฌ์•™์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

๋™์ผํ•œ ์ง„๋‹จ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด 7.2 ๋…ผ๋ฆฌ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด PSScriptAnalyzer๋ฅผ ์กฐ๊ฑด๋ถ€๋กœ ์ปดํŒŒ์ผํ•˜๊ณ  ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค์†Œ ๋ฏธํ•™์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๊ณณ์—์„œ ๋ณต์žก์„ฑ์„ ์ฆ๊ฐ€์‹œ์ผฐ์Šต๋‹ˆ๋‹ค(๋˜๋Š” ํ…Œ์ŠคํŠธ ํ‘œ๋ฉด์„ ์ค„์˜€์Šต๋‹ˆ๋‹ค).

์„ค์ƒ๊ฐ€์ƒ์œผ๋กœ AST์— ์˜์กดํ•˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ๋„๊ตฌ๋Š” PSScriptAnalyzer๊ฐ€ ์žˆ๋”๋ผ๋„ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๋ณต์žก์„ฑ์„ ์œ ์ง€ํ•  ๋Šฅ๋ ฅ์ด ์—†์Šต๋‹ˆ๋‹ค. AST ๋Œ€์ƒ ๋„๊ตฌ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ ์™„๋ฒฝํ•œ ์ •ํ™•์„ฑ์„ ์œ„ํ•ด PowerShell์˜ ๊ฐœ๋ณ„ ๋ถ€ ๋ฒ„์ „์— ๋Œ€ํ•ด ์ปดํŒŒ์ผํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์•„๋งˆ๋„ ์–ด๋–ค ๋ฒ„์ „์—์„œ๋„ ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Ÿฌํ•œ ์ž‘์€ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์•Œ์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ•œ ํ–‰๋™์ด ์กฐ์šฉํžˆ ๋‹ค๋ฅธ ํ–‰๋™์œผ๋กœ ๋ฐ”๋€Œ๋Š” ๊ฐ€์žฅ ๊ตํ™œํ•œ ํ˜•ํƒœ์˜ ๋ณ€ํ™”์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด์™€ ๊ฐ™์€ ํŒŒ์„œ/ํ† ํ‚ค๋‚˜์ด์ € ์ˆ˜์ค€์˜ ๋ณ€๊ฒฝ์„ ๋” ์œ„ํ—˜ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. PSScriptAnalyzer์กฐ์ฐจ๋„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„œ๋น„์Šคํ•˜๊ธฐ ์œ„ํ•ด ๋’ค๋กœ ๊ตฌ๋ถ€๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ด๋Ÿฌํ•œ ๋ฒˆ๊ฑฐ๋กœ์šด ๋ณ€๊ฒฝ์— ๋Œ€ํ•ด ๋ฌด๊ฒŒ๋ฅผ ๋‹ฌ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@rjmholt , ์ €๋Š” ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ์ด์™€ ๊ฐ™์€ ๋ณ€๊ฒฝ์ด _์›์น™์ ์œผ๋กœ_ ์–ผ๋งˆ๋‚˜ ๊นŒ๋‹ค๋กœ์šด์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ์ด ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์—๋Š” _์‹ค์ œ๋กœ๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ PSSA ๊ทœ์น™์ด ํ•„์š”ํ•˜์ง€๋„ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • @ThomasNieto ์˜ ๋ถ„์„ ์— ๋”ฐ๋ฅด๋ฉด - ๋ง๋ญ‰์น˜๊ฐ€ ๋ชจ๋“  PowerShell ์ฝ”๋“œ๋ฅผ ๋Œ€ํ‘œํ•œ๋‹ค๊ณ  ๋ฏฟ๋Š”๋‹ค๋ฉด _๊ฑฐ์˜ ์•„๋ฌด๋„ ์ด๋ฆ„์ด ? ๋๋‚˜๋Š” ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค _.

  • ๋‚ด๊ฐ€ ์ถ”์ธกํ•œ๋‹ค๋ฉด, ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ ๊ทธ๋Ÿฌํ•œ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ _์ƒ๊ฐ_ํ•˜์ง€๋„ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๋“ค์€ (์ €๋ฅผ ํฌํ•จํ•ด์„œ) ๊ทธ๋“ค์ด ์ž‘๋™ํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๊ณ  ์•„๋งˆ๋„ ์ž๋™ $? ๋ณ€์ˆ˜๋Š” ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค(์ด๋ฆ„์ด bash ์™€ ๊ฐ™์€ POSIX ํ˜ธํ™˜ ์‰˜์—์„œ ๋™์ผํ•˜๊ฒŒ ์˜ˆ์™ธ์ž„).

    • ์‹ค์ œ๋กœ @ThomasNieto ์˜ ๋ถ„์„์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด ๋‚˜์—ด๋œ 8 ํŒŒ์ผ ์ค‘์—์„œ ๋‹ค์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

      • 5 ์—๋Š” _false positives_๋งŒ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰ "Are you sure you want to kill $vParam?" ์™€ ๊ฐ™์€ _strings_ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ณ€์ˆ˜ - ์‹ค์ œ๋กœ ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ์€ _๊นจ์ ธ_ ์žˆ์œผ๋ฉฐ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ์ž๊ฐ€ ? ๋ฅผ ๊ธฐ๋Œ€ํ•˜์ง€ _ํ•˜์ง€_ ์•Š์•˜์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ ์ด๋ฆ„์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

      • ํ•ด๋‹น ํŒŒ์ผ ์ค‘ 2 ๋Š” ๋” ์ด์ƒ ๊ณต๊ฐœ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

      • ๊ทธ ์ค‘ _1_๋งŒ ? - $key1? ) ๋กœ ์„ ์˜์˜ ์‚ฌ์šฉ์ด๋ฉฐ , ๋”ฐ๋ผ์„œ ์ œ์ณ๋‘๊ณ  ๋ฉค๋ฒ„ ์•ก์„ธ์Šค ์—ฐ์‚ฐ์ž์™€ _not_ ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค. , . /cc @stevenayers.

์œ„์˜ ๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉด ์ด๊ฒƒ์€ ๊ต๊ณผ์„œ์ ์ธ ๋ฒ„ํ‚ท 3: ๊ฐ€๋Šฅ์„ฑ์ด ์—†๋Š” ํšŒ์ƒ‰ ์˜์—ญ ๋ณ€๊ฒฝ์œผ๋กœ ์ƒ๊ฐ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ _์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ๋Š”_ - ๊ทธ๋ฆฌ๊ณ  ์ด ๋ณ€๊ฒฝ์˜ _์ด์ _์ด ์„ค๋“๋ ฅ ์žˆ๊ฒŒ ๋…ผ์˜๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

_๋ฌธ์„œํ™”_ ํ–‰๋™์˜ ๋ณ€ํ™”(์ด์œ ๊ฐ€ ์žˆ๋Š”)๋กœ ์ถฉ๋ถ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก ์ด์•ผ:

  1. ์ด๊ฒƒ์€ (a) ๋ถ„์„์ด ์ •ํ™•ํ•˜๊ณ  (b) ๊ณต๊ฐœ์ ์œผ๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•œ ๋ง๋ญ‰์น˜๊ฐ€ ๋Œ€ํ‘œ์„ฑ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ „์ œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

  2. "๋ฌผ์Œํ‘œ๋กœ ๋๋‚˜๋Š” ๋ณ€์ˆ˜ ์ด๋ฆ„์ด ๊ฝค ๋งŽ์ด ์‚ฌ์šฉ๋˜์—ˆ๋‹ค"๋Š” ์œ„์›ํšŒ์˜ ์ฃผ์žฅ๊ณผ ์™„์ „ํžˆ ์ƒ๋ฐ˜๋ฉ๋‹ˆ๋‹ค(๋ฌผ๋ก  ์ด๋Ÿฌํ•œ ๋ณ€์ˆ˜ ์ด๋ฆ„์ด {...} ๋ฌถ์ด์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋งŒ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค).

1.์ด ์‚ฌ์‹ค์ด๋ผ๋Š” ๊ฐ€์ •ํ•˜์— ์ง„ํ–‰ํ•˜๋ฉด(2๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์„ ๋“ฃ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.) ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฐด๋“œ ์›์กฐ๋ฅผ ๋ฒ—์–ด ๋ฒ„๋ฆฌ๊ณ  ๋‹จ์ˆœํžˆ ํ—ˆ์šฉ ? ๋กœ ๋ฌถ์—ฌ ์•Š๋Š” ๋ณ€์ˆ˜ ์ด๋ฆ„์˜์ด ํ–ฅํ›„ {...} (์˜ ๋ช…๋ฐฑํ•œ ์ œ์™ธํ•˜๊ณ  $? ) - ์ด๊ฒƒ์€ ํ•˜๊ณ ์„œ์„ ๊นฐ ๊ฒƒ ํ˜„์žฌ ๊ทธ๊ฒƒ์— ์˜์กดํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ์˜ ๋น„์œจ.

    • ์ฆ‰, . ๋‚˜ ? ( $key1??'else' ) ๋˜๋Š” ์‚ผํ•ญ ํ‘œํ˜„์‹( $key1?1:0 )์ด ๋’ค๋”ฐ๋ฅด์ง€ ์•Š๋Š” $key1? ์™€ ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค $key1??'else' _parser error_๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

      • null-coalescing ๋ฐ 3ํ•ญ ์—ฐ์‚ฐ์ž ์˜ˆ์ œ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์ด ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ํ˜œํƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ _space_ - $key1 ?1:0 / $key1 ??'else' - ๋˜๋Š” {...} - ${key1}?1:0 / ${key1}??'else'

    • _expandable strings_ ๋‚ด๋ถ€์—์„œ ? ๋Š” ๋” ์ด์ƒ (๋น„ {...} -enclosed) ๋ณ€์ˆ˜ ์ด๋ฆ„์˜ ์ผ๋ถ€๋กœ ๊ฐ„์ฃผ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์‹ค์ œ๋กœ "Are you sure you want to kill $vParam?" ์™€ ๊ฐ™์€ ๋ฌธ์ž์—ด์„ ์ž˜๋ชป ์‚ฌ์šฉํ•œ ๊ธฐ์กด ์Šคํฌ๋ฆฝํŠธ๋ฅผ _์ˆ˜์ •_ํ•ฉ๋‹ˆ๋‹ค
  • ์šฐ๋ฆฌ๊ฐ€ ์ •๋ง๋กœ ๊ธฐ์กด ์Šคํฌ๋ฆฝํŠธ์˜ ์•„์ฃผ ์ž‘์€ ๋ถ€๋ถ„์„ ๊นจ๋œจ๋ฆฌ๋Š” ๊ฒƒ์„ ํ”ผํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋Š๋‚€๋‹ค๋ฉด @ExE-Boss๊ฐ€ ์ œ์•ˆํ•œ ๋…ผ๋ฆฌ๋ฅผ _๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์ง€๋งŒ

@SteveL-MSFT

9์›” ์ปค๋ฎค๋‹ˆํ‹ฐ ์ฝœ(https://aka.ms/PSCommunityCall, ์ด ๊ธ€์„ ์“ฐ๋Š” ํ˜„์žฌ)์—์„œ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. https://github.com/PowerShell/PowerShell-RFC/issues/260 ์—์„œ ํ† ๋ก  ์ฃผ์ œ์— ๋Œ€ํ•œ ์‚ฌ์ „ ์š”์ฒญ์—์„œ @ThomasNieto ์˜ ์ œ์•ˆ์„ ๊ธฐ๋ฐ˜์œผ๋กœ 46:00๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

(๋…น์Œ์˜ ๊ด€๋ จ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์ง์ ‘ ๋งํฌ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์—ˆ์ง€๋งŒ YouTube์— ๊ฒŒ์‹œ๋˜๊ณ  https://aka.ms/PSCommunityCall์— ๋งํฌ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.)

๋…น์Œ ๋‚ด์šฉ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์˜๊ฒฌ์„ ๋ฐ”ํƒ•์œผ๋กœ:

  • ์ด ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•  ์˜์‚ฌ๊ฐ€ ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์—ด๊ณ  Review - Committee ๋กœ ๋‹ค์‹œ ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•˜์‹ญ์‹œ์˜ค.

  • ์ค‘๊ด„ํ˜ธ๋กœ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๋ฌถ๋Š” ๊ฒƒ์€ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋ฉฐ ์‚ฌ๋žŒ๋“ค์€ _๋ฏธํ•™์ _ ์ด์œ ๋กœ ์ด ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

    • ์—ฌ๊ธฐ ์žˆ๋Š” ๋ˆ„๊ตฌ๋„ {...} _๊ฐ€๋Šฅํ•˜๊ณ _ ๋•Œ๋กœ๋Š” _๋ฐ˜๋“œ์‹œ_ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์„ _๋ชจ๋ฅด๋Š”__ ์‚ฌ๋žŒ์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๊ฒƒ์€ ๋˜ํ•œ _๋ฏธํ•™์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ _์ด ๊ฒฝ์šฐ์— {...} ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— _์กฐ์šฉํžˆ ์‹คํŒจํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ _์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์„ ์–ป์ง€ ๋ชปํ•˜๋Š”_์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ๋ฌธ์ œ๋Š” ํƒ€์ดํ•‘์˜ ๋ถˆํŽธํ•จ์ž…๋‹ˆ๋‹ค.
๊นƒํ—ˆ๋ธŒ
PowerShell ์—์ฝ”์‹œ์Šคํ…œ์˜ ์„ค๊ณ„ ๋ณ€๊ฒฝ ๋ฐ ๊ฐœ์„  ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ ํ”ผ๋“œ๋ฐฑ์„ ์œ„ํ•œ RFC(Request for Comments) ๋ฌธ์„œ - PowerShell/PowerShell-RFC
๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ ํŒ€์ฆˆ

๋‚˜๋Š” ์ด ๋ฌธ์ œ(์ง€๊ธˆ์€ ํ์‡„๋œ ์ƒํƒœ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค)๊ฐ€ ๊ท ์—ด์„ ํ†ตํ•ด ๋–จ์–ด์งˆ๊นŒ ์šฐ๋ คํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ #14025๋ฅผ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•˜๋„๋ก ์ƒ๊ธฐ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์—ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ด€์‹ฌ์ด ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๊ฑฐ๊ธฐ์—์„œ ์ง€์›์„ ํ‘œ์‹œํ•˜๋„๋ก ์ดˆ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰