#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 ์ ๋ถ์์ ๋ ํ์คํ ์ฆ๊ฑฐ๋ฅผ ์ ๊ณตํฉ๋๋ค .
?
(๋ฐ !
)๋ง ํ์ฉํ๊ณ _method_ ์๋ณ์๋ง ํ์ฉํ๋ฉฐ, ๋๋ถ๋ถ์ Ruby ์ฌ์ฉ์๋ ๋ค๋ฅธ ์ธ์ด๊ฐ ์ง์ํ๋ค๊ณ ๊ฐ์ _ํ์ง_ ๋ง์์ผ ํ๋ค๋ ๊ฒ์ ์๊ณ ์์ ๊ฒ์
๋๋ค. ๋๊ฐ์ ๊ฒ.๋ฐ๋ผ์ ์ค์ฉ์ ์ผ๋ก ๋งํ๋ฉด:
๊ธฐ์กด ์ฝ๋์ ๋๋ถ๋ถ์ ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค. $var?.foo
์ ๊ฐ์ ํ ํฐ์ ๋จ์ํ ๋ฐ์ํ์ง ์์ต๋๋ค.
์ ์๋ฏธ ์ฒด๊ณ๋ก $var?.foo
๋ฅผ ์์ฑํ๋ฉด ์, ์ด์ ๋ฒ์ ์์ ์คํํ๋ฉด ์ด๋ค ์๊ฒฉ ๋ชจ๋๊ฐ ์ ์ฉ๋๋์ง์ ๋ฐ๋ผ ๋ค๋ฅธ ๋์(๋ช
๋ฐฑํ ๋ฐฉ์์ผ๋ก ์ค๋จ๋๋ ๊ฒ์ด ์๋๋ผ)์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ _๋น์ ์ ํญ์ ์ด์จ๋ ์๋ํ ๋๋ก ์ฝ๋๋ฅผ ์คํํ๋ ๋ฐ ํ์ํ ์ต์ ๋ฒ์ ์ ์ ์ฉํฉ๋๋ค_ ( #requires -Version
, ๋ชจ๋ ๋งค๋ํ์คํธ ํค).
์ ๋ฐ์ ์ผ๋ก ๋์๊ฒ ์ด๊ฒ์ ๋ฒํท 3 ๋ณ๊ฒฝ์ ๋ถ๋ช ํ ์ฌ๋ก์ ๋๋ค. ๊ธฐ์ ์ ์ผ๋ก ํ๊ธฐ์ ์ธ ๋ณ๊ฒฝ์ผ๋ก ๊ธฐ์กด ์ฝ๋๋ฅผ ๊ฑฐ์ ์์์ํค์ง ์์ผ๋ฉด์ ์ค์ง์ ์ธ ์ด์ ์ ์ ๊ณตํฉ๋๋ค(๋๋ ๋ฐ๋๋ก ์๊ธฐ์น ์์ ๋์์ผ๋ก ์ธํ ์ง์์ ์ธ ๋ํต์ ํผํจ).
๋ช ํํ ํ์๋ฉด, ์ด์ ํ๋ ํ์ด ํผ๋๋ฐฑ์ ๊ธฐ๋ฐ์ผ๋ก ๋ ผ์ํด์ผ ํ๋ ๊ฒ์ด์ง ์ด ๋ณ๊ฒฝ์ ์ํํ๊ธฐ ์ํด ์ต์ ์ ๋คํ๋ค๋ ์๋ฏธ๊ฐ ์๋๋๋ค.
@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 ์กฐ๊ฑด๋ถ ๋ฉค๋ฒ ์ก์ธ์ค ์ฐ์ฐ์๋ก ๊ตฌ๋ฌธ ๋ถ์๋์ด์ผ ํ๋ค๋ ๋ฐ ๋์ํ์ง๋ง ?
๊ฐ ํ ํฌ๋์ด์ ์์ ํน์ํ ๊ฒฝ์ฐ์ธ ์ด์ ๋ฅผ ๋ช
ํํ ํ๊ณ ์ถ์์ต๋๋ค.
์ด ์ฑํ ์ ๊ด์ฌ์ ๊ฐ์ ธ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๊ฐ์น ์๋ ์ผ์ ๋ํด ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์๊ฐ์ด ์์ต๋๋ค.
๋ฐ๋ผ์ ์ํ์ ์คํํ๋ฉด ์ด ์์ ์ ์ํํ์ง _ํ์ง ๋ง์์ผ ํ๋ ๋ช ๊ฐ์ง ๊ตฌ์ฒด์ ์ธ ์ด์ ์ ์ด๋ฅผ ์ํํด์ผ ํ๋ ๋ชจํธํ ์ด์ ๊ฐ ์์ต๋๋ค(์ผ๋ถ ์ฌ์ฉ์์๊ฒ๋ ๋ ์ฌ์ธ ์ ์์). ์ ๋ฎ์ ์ ๋ณ๋ฅ ์ ๊ฐ์ํ ๋? ๋ณ์ ์ด๋ฆ์์ ๋น์ ์ ๋น์ ์ด ํดํ๋ ๊ฒ๋ณด๋ค ๋ ๋ง์ ์ฌ๋๋ค์ _์ด์ฉ๋ฉด__ ๋์ธ ์ ์์ง๋ง ์ ์๊ฐ์๋ ๊ทธ๊ฒ์ ๋์ ๋์ง๊ธฐ์ ๋๋ค.
์ด๋ฌํ ๋์ ๋์ง๊ธฐ์ ์ ์ฌ์ ์ธ ์ด์ ์ ๊ฐ์ํ ๋ ๋๋ 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
- ๋ํ, ์์์น ๋ชปํ ๋ณ์ ์ด๋ฆ์ ๋ฌธ์ ๊ฐ ์๋ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ${} ๊ตฌ๋ฌธ์ ๋ฐฐ์๋๋ค( ์ด๋ฏธ ๋ฐ์ค๋ก ์์ฐ์ค๋ฝ๊ฒ ์ ์คํ์ ๊ฒ์ ๋๋ค ). "์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๋ ์ฌ๋"๊ณผ "${} ๊ตฌ๋ฌธ์ ์ด๋ฏธ ์๊ณ ์๋ ์ฌ๋"์ ๋ฒค ๋ค์ด์ด๊ทธ๋จ ๊ฒน์นจ์ด ๊ฑฐ์ 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]?
์ ๊ฐ์ ๊ฒ์ ์ผํญ ์ฐ์ฐ์์ ํผ๋์ ์ผ์ผํฌ ๊ฒ์
๋๋ค)
๊น๋ํ ํด๊ฒฐ์ฑ ์ ์์ต๋๋ค.
(dir *.ps2)?.count
๋ฐ (dir *.ps1)?.count
๋ ํผ์ฐ์ฐ์๊ฐ ๋ณ์์ผ ํ์๊ฐ ์์์ ๋ณด์ฌ์ค๋๋ค.($Host)?.toString()
/ ($null)?.toString()
๋ ์ด๋ฆ ์ฃผ์์ ์ค๊ดํธ๋ฅผ ๋ฃ์ ํ์๊ฐ ์์ต๋๋ค. ์ฌ์ ํ ์ถ๊ฐ ํค ์
๋ ฅ์ด์ง๋ง ๋ ๋
ผ๋ฆฌ์ ์ด๊ณ ๋ ๋ณด๊ธฐ ํํฉ๋๋ค.
- #requires ๊ธฐ๋ฐ ๋์ ๋ณ๊ฒฝ์ ์ ์ฅ๋ ์คํฌ๋ฆฝํธ ์ธ๋ถ์์ ์๋ํ์ง ์์ผ๋ฉฐ ๋๊ตฐ๊ฐ ํ๊ทธ๋ฅผ ์ค์ ํ์ง ์๊ณ ๊ธด ์คํฌ๋ฆฝํธ์์ ์ผ๋ถ ์ฝ๋๋ฅผ ๋ณต์ฌํ๋ ์ฆ์ ์คํจํฉ๋๋ค.
์ด๋ ์ด์ ๋ฒ์ ์์ ์ง์๋์ง ์๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ _๋ชจ๋ _ ์ฝ๋์ ์ ์ฉ๋ฉ๋๋ค.
์ด๊ฒ์ด ์ต์ฐ์ ๋ฌธ์ ๋ผ๋ฉด ์๋ก์ด ์ธ์ด ๊ธฐ๋ฅ์ด๋ ์๋ก์ด cmdlet/cmdlet ๋งค๊ฐ ๋ณ์๊ฐ ๋์
๋์ง ์์์ ๊ฒ์
๋๋ค.
(ํฌ๋ง์, ์ด์ ์ ์ฝ๋์์ ๋น์ ์ ์ ์ด๋์ด Set-StrictMode -Version 1
์ด ๊ฒฝ์ฐ ํจ๊ณผ, $var?.foo
์ ์ํ๋ผ๋ ์ด๋ฆ์ ๋ณ์์ ํฐ ์๋ฆฌ๋ก ์คํจ๋ฅผ, var?
๊ธฐ์กด).
- ์ด๋ฆ ์ฃผ์์ ์ค๊ดํธ๋ฅผ ๋ฃ์ ํ์๊ฐ ์์ต๋๋ค.
๋์ฒด (...)
์ํด {...}
๋จ์ง ํ๊ณ ๊ฐ์ ์ด๋ค.
์ด๋ค ์ถ๊ฐ ๊ตฌ๋ฌธ์ด ์ฌ์ฉ๋๋ ์ฌ๊ธฐ์ ๋ฌธ์ ๋ ์ ๋ ฅ ํธ์์ฑ๋ฟ๋ง ์๋๋ผ _ํฉ๋ฆฌ์ ์ธ ๊ธฐ๋_๋ฅผ ์ถฉ์กฑ์ํค๊ธฐ ์ํด _์๋ ๊ทธ๋๋ก_ ์๋ํด์ผ ํ๋ ์ถ๊ฐ ๊ตฌ๋ฌธ์ ๋ํ _ํ์_์ ๋๋ค.
- #requires ๊ธฐ๋ฐ ๋์ ๋ณ๊ฒฝ์ ์ ์ฅ๋ ์คํฌ๋ฆฝํธ ์ธ๋ถ์์ ์๋ํ์ง ์์ผ๋ฉฐ ๋๊ตฐ๊ฐ ํ๊ทธ๋ฅผ ์ค์ ํ์ง ์๊ณ ๊ธด ์คํฌ๋ฆฝํธ์์ ์ผ๋ถ ์ฝ๋๋ฅผ ๋ณต์ฌํ๋ ์ฆ์ ์คํจํฉ๋๋ค.
์ด๋ ์ด์ ๋ฒ์ ์์ ์ง์๋์ง ์๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ _๋ชจ๋ _ ์ฝ๋์ ์ ์ฉ๋ฉ๋๋ค.
์ด๊ฒ์ด ์ต์ฐ์ ๋ฌธ์ ๋ผ๋ฉด ์๋ก์ด ์ธ์ด ๊ธฐ๋ฅ์ด๋ ์๋ก์ด cmdlet/cmdlet ๋งค๊ฐ ๋ณ์๊ฐ ๋์ ๋์ง ์์์ ๊ฒ์ ๋๋ค.
๊ทธ๊ฒ์ ๋ด๊ฐ ์๋ฏธํ๋ ๊ฒ์ด ์๋ ์์ต๋๋ค. ๋ ๋์๊ฐ #requires ์ง์ ๋ pwsh 7์ธ ๊ฒฝ์ฐ ์ฒ๋ฆฌ๊ฐ ๋ค๋ฅผ ์ ์๋ค๋ ์ ์์ด ์์์ต๋๋ค. #requires๋ฅผ ์
๋ ฅํ ๊ฒฝ์ฐ์๋ง ์๋ก์ด ๋์์ ํ์ฑํํฉ๋๋ค.
(ํฌ๋ง์, ์ด์ ์ ์ฝ๋์์ ๋น์ ์ ์ ์ด๋์ด
Set-StrictMode -Version 1
์ด ๊ฒฝ์ฐ ํจ๊ณผ,$var?.foo
์ ์ํ๋ผ๋ ์ด๋ฆ์ ๋ณ์์ ํฐ ์๋ฆฌ๋ก ์คํจ๋ฅผ,var?
๊ธฐ์กด).๋ด ๊ฒฝํ์ Set-Strictmode๋ฅผ ๋ง์ด ์ฌ์ฉํ์ง ์์ต๋๋ค. (a) ๊ธฐ๋ณธ ์ค์ ์ด "์ณ๋ค"๊ณ ๊ฐ์ ํ๊ณ (b) ํด์ ์ ์์กดํ๋ ์ฌ์ฉ ๋น๋๊ฐ ๋๋ฌด ๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ฌํ ์ฐ์ฐ์์ ์ผ๋ฐ์ ์ธ ์ฉ๋์ ๋๋ค. ์ด์จ๋ ๋ฌธ์ ๋ $var? ์กด์ฌํ๊ณ foo ์์ฑ์ด ์์ง๋ง ์ด์ ์ฝ๋๋ $var๋ฅผ ์ฐพ์ต๋๋ค... $var๊ฐ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ strictmode๊ฐ ์ค์ ๋ ๊ฒฝ์ฐ ์๋ก์ด ์ฒ๋ฆฌ๋ก ์ธํด ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค....
- ์ด๋ฆ ์ฃผ์์ ์ค๊ดํธ๋ฅผ ๋ฃ์ ํ์๊ฐ ์์ต๋๋ค.
๋์ฒด
(...)
์ํด{...}
๋จ์ง ํ๊ณ ๊ฐ์ ์ด๋ค.์. ($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 , ์ด ๋ณ์ โโ์ ํ์ ๋ํ ์ ์ฌ์ ์ธ ์์์ ๋ค์ ์ฒซ ๋ฒ์งธ ๋ฐ์์ "์ ๊ธ์์. ์ผ๋ถ ๋ณ์์ ์ด๋ฆ์ ๋ฐ๊ฟ์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค. ์ด์จ๋ ๊ทธ๋ ๊ฒ ๋ง์ ๊ฒ์ ์ป์ง๋ ๋ชปํ์ต๋๋ค."
๋ฐ๋ผ์ ์ค๋ ๋๋ฅผ ๋ค์ ์์ฑํ๊ณ ์ข ๋ฃํ๋ ค๋ฉด ๋ค์์ ์ํํ์ญ์์ค.
๋๋ ๊ฐ๋จํ ๋งํด์:
์ํ๋ ๊ฒฝ์ฐ ์ด ๋ณ๊ฒฝ์ ์ํํฉ๋๋ค. ๋๋ ์ด ๊ฒฝ์ฃผ์ ์์ ๋ง์ด ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค๋ฉด ๋ณ๊ฒฝ ์ฌํญ์ ๋ช ํํ๊ฒ ์๋ ค์ ๋ณ์ ์ด๋ฆ์ ์ง์ ํ ๋ค๋ฅธ ์ฌ๋์ด ? ๋ฐ๋ผ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
๋ด ํผ๋๋ฐฑ์ ๋ ๋ฒ์งธ ๋ถ๋ถ์ ํผํฉ์์ ๊ธธ์ ์์์ ์ ์์ต๋๋ค. 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๊ฐ์ง ์๋ก์ด ๊ด๋ จ ๊ธฐ๋ฅ(์ ์ด๋ ๊ตฌ๋ฌธ ํ์์ผ๋ก ๊ด๋ จ๋จ)์ด ์์ต๋๋ค.
(Get-Date).Second % 2 ? 'odd' : 'even'
$var ?? 'default'
๋ฐ $var ??= 'default'
$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 ํธํ ์์์ ๋์ผํ๊ฒ ์์ธ์).
8
ํ์ผ ์ค์์ ๋ค์์ ์ ์ ์์ต๋๋ค.5
์๋ _false positives_๋ง ํฌํจ๋ฉ๋๋ค. ์ฆ "Are you sure you want to kill $vParam?"
์ ๊ฐ์ _strings_ ๋ด๋ถ์์ ์ฌ์ฉํ๋ ๋ณ์ - ์ค์ ๋ก ์ด๋ฌํ ์ฌ์ฉ์ _๊นจ์ ธ_ ์์ผ๋ฉฐ ์คํฌ๋ฆฝํธ ์์ฑ์๊ฐ ?
๋ฅผ ๊ธฐ๋ํ์ง _ํ์ง_ ์์์์ ๋ํ๋
๋๋ค. ๋ณ์ ์ด๋ฆ์ ์ผ๋ถ์
๋๋ค.2
๋ ๋ ์ด์ ๊ณต๊ฐ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.?
- $key1?
) ๋ก ์ ์์ ์ฌ์ฉ์ด๋ฉฐ , ๋ฐ๋ผ์ ์ ์ณ๋๊ณ ๋ฉค๋ฒ ์ก์ธ์ค ์ฐ์ฐ์์ _not_ ๊ฒฐํฉ๋ฉ๋๋ค. , .
/cc @stevenayers.์์ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉด ์ด๊ฒ์ ๊ต๊ณผ์์ ์ธ ๋ฒํท 3: ๊ฐ๋ฅ์ฑ์ด ์๋ ํ์ ์์ญ ๋ณ๊ฒฝ์ผ๋ก ์๊ฐ๋ฉ๋๋ค. ๋ฐ๋ผ์ _์์ฉํ ์ ์๋_ - ๊ทธ๋ฆฌ๊ณ ์ด ๋ณ๊ฒฝ์ _์ด์ _์ด ์ค๋๋ ฅ ์๊ฒ ๋ ผ์๋์๋ค๊ณ ์๊ฐํฉ๋๋ค.
_๋ฌธ์ํ_ ํ๋์ ๋ณํ(์ด์ ๊ฐ ์๋)๋ก ์ถฉ๋ถํด์ผ ํฉ๋๋ค.
๋ฌผ๋ก ์ด์ผ:
์ด๊ฒ์ (a) ๋ถ์์ด ์ ํํ๊ณ (b) ๊ณต๊ฐ์ ์ผ๋ก ์ด์ฉ ๊ฐ๋ฅํ ๋ง๋ญ์น๊ฐ ๋ํ์ฑ์ด ์๋ค๋ ๊ฒ์ ์ ์ ๋ก ํฉ๋๋ค.
"๋ฌผ์ํ๋ก ๋๋๋ ๋ณ์ ์ด๋ฆ์ด ๊ฝค ๋ง์ด ์ฌ์ฉ๋์๋ค"๋ ์์ํ์ ์ฃผ์ฅ๊ณผ ์์ ํ ์๋ฐ๋ฉ๋๋ค(๋ฌผ๋ก ์ด๋ฌํ ๋ณ์ ์ด๋ฆ์ด {...}
๋ฌถ์ด์ง ์์ ๊ฒฝ์ฐ์๋ง ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค).
1.์ด ์ฌ์ค์ด๋ผ๋ ๊ฐ์ ํ์ ์งํํ๋ฉด(2๋ฅผ ์ง์ํ๋ ๊ฒ์ ๋ฃ์ง ๋ชปํ์ต๋๋ค.) ๋ ๊ฐ์ง ์ต์ ์ด ์์ต๋๋ค.
๋ฐด๋ ์์กฐ๋ฅผ ๋ฒ์ด ๋ฒ๋ฆฌ๊ณ ๋จ์ํ ํ์ฉ ?
๋ก ๋ฌถ์ฌ ์๋ ๋ณ์ ์ด๋ฆ์์ด ํฅํ {...}
(์ ๋ช
๋ฐฑํ ์ ์ธํ๊ณ $?
) - ์ด๊ฒ์ ํ๊ณ ์์ ๊นฐ ๊ฒ ํ์ฌ ๊ทธ๊ฒ์ ์์กดํ๋ ์คํฌ๋ฆฝํธ์ ๋น์จ.
.
๋ ?
( $key1??'else'
) ๋๋ ์ผํญ ํํ์( $key1?1:0
)์ด ๋ค๋ฐ๋ฅด์ง ์๋ $key1?
์ ๊ฐ์ ๊ฒ์
๋๋ค $key1??'else'
_parser error_๊ฐ ๋ฐ์ํฉ๋๋ค.$key1 ?1:0
/ $key1 ??'else'
- ๋๋ {...}
- ${key1}?1:0
/ ${key1}??'else'
?
๋ ๋ ์ด์ (๋น {...}
-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๋ฅผ ๋ค์ ๋ฐฉ๋ฌธํ๋๋ก ์๊ธฐ์ํค๊ธฐ ์ํด ์ด์์ต๋๋ค. ๊ด์ฌ์ด ์๋ ๋ชจ๋ ์ฌ๋์ด ๊ฑฐ๊ธฐ์์ ์ง์์ ํ์ํ๋๋ก ์ด๋ํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@rjmholt , ์ ๋ ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ์ด์ ๊ฐ์ ๋ณ๊ฒฝ์ด _์์น์ ์ผ๋ก_ ์ผ๋ง๋ ๊น๋ค๋ก์ด์ง ์ ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง, ์ด ํน๋ณํ ๊ฒฝ์ฐ์๋ _์ค์ ๋ก๋ ์ค์ํ์ง ์์ผ๋ฉฐ PSSA ๊ท์น์ด ํ์ํ์ง๋ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@ThomasNieto ์ ๋ถ์ ์ ๋ฐ๋ฅด๋ฉด - ๋ง๋ญ์น๊ฐ ๋ชจ๋ PowerShell ์ฝ๋๋ฅผ ๋ํํ๋ค๊ณ ๋ฏฟ๋๋ค๋ฉด _๊ฑฐ์ ์๋ฌด๋ ์ด๋ฆ์ด
?
๋๋๋ ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค _.๋ด๊ฐ ์ถ์ธกํ๋ค๋ฉด, ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ๊ทธ๋ฌํ ๋ณ์ ์ด๋ฆ์ ์ฌ์ฉํ๋ ๊ฒ์ _์๊ฐ_ํ์ง๋ ์์ ๊ฒ์ ๋๋ค. ์๋ํ๋ฉด ๊ทธ๋ค์ (์ ๋ฅผ ํฌํจํด์) ๊ทธ๋ค์ด ์๋ํ ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํ์ง ์์ ๊ฒ์ด๊ณ ์๋ง๋ ์๋
$?
๋ณ์๋ ๊ตฌ์ฑ๋ฉ๋๋ค(์ด๋ฆ์ดbash
์ ๊ฐ์ POSIX ํธํ ์์์ ๋์ผํ๊ฒ ์์ธ์).8
ํ์ผ ์ค์์ ๋ค์์ ์ ์ ์์ต๋๋ค.5
์๋ _false positives_๋ง ํฌํจ๋ฉ๋๋ค. ์ฆ"Are you sure you want to kill $vParam?"
์ ๊ฐ์ _strings_ ๋ด๋ถ์์ ์ฌ์ฉํ๋ ๋ณ์ - ์ค์ ๋ก ์ด๋ฌํ ์ฌ์ฉ์ _๊นจ์ ธ_ ์์ผ๋ฉฐ ์คํฌ๋ฆฝํธ ์์ฑ์๊ฐ?
๋ฅผ ๊ธฐ๋ํ์ง _ํ์ง_ ์์์์ ๋ํ๋ ๋๋ค. ๋ณ์ ์ด๋ฆ์ ์ผ๋ถ์ ๋๋ค.2
๋ ๋ ์ด์ ๊ณต๊ฐ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.?
-$key1?
) ๋ก ์ ์์ ์ฌ์ฉ์ด๋ฉฐ , ๋ฐ๋ผ์ ์ ์ณ๋๊ณ ๋ฉค๋ฒ ์ก์ธ์ค ์ฐ์ฐ์์ _not_ ๊ฒฐํฉ๋ฉ๋๋ค. ,.
/cc @stevenayers.์์ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉด ์ด๊ฒ์ ๊ต๊ณผ์์ ์ธ ๋ฒํท 3: ๊ฐ๋ฅ์ฑ์ด ์๋ ํ์ ์์ญ ๋ณ๊ฒฝ์ผ๋ก ์๊ฐ๋ฉ๋๋ค. ๋ฐ๋ผ์ _์์ฉํ ์ ์๋_ - ๊ทธ๋ฆฌ๊ณ ์ด ๋ณ๊ฒฝ์ _์ด์ _์ด ์ค๋๋ ฅ ์๊ฒ ๋ ผ์๋์๋ค๊ณ ์๊ฐํฉ๋๋ค.
_๋ฌธ์ํ_ ํ๋์ ๋ณํ(์ด์ ๊ฐ ์๋)๋ก ์ถฉ๋ถํด์ผ ํฉ๋๋ค.
๋ฌผ๋ก ์ด์ผ:
์ด๊ฒ์ (a) ๋ถ์์ด ์ ํํ๊ณ (b) ๊ณต๊ฐ์ ์ผ๋ก ์ด์ฉ ๊ฐ๋ฅํ ๋ง๋ญ์น๊ฐ ๋ํ์ฑ์ด ์๋ค๋ ๊ฒ์ ์ ์ ๋ก ํฉ๋๋ค.
"๋ฌผ์ํ๋ก ๋๋๋ ๋ณ์ ์ด๋ฆ์ด ๊ฝค ๋ง์ด ์ฌ์ฉ๋์๋ค"๋ ์์ํ์ ์ฃผ์ฅ๊ณผ ์์ ํ ์๋ฐ๋ฉ๋๋ค(๋ฌผ๋ก ์ด๋ฌํ ๋ณ์ ์ด๋ฆ์ด
{...}
๋ฌถ์ด์ง ์์ ๊ฒฝ์ฐ์๋ง ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค).1.์ด ์ฌ์ค์ด๋ผ๋ ๊ฐ์ ํ์ ์งํํ๋ฉด(2๋ฅผ ์ง์ํ๋ ๊ฒ์ ๋ฃ์ง ๋ชปํ์ต๋๋ค.) ๋ ๊ฐ์ง ์ต์ ์ด ์์ต๋๋ค.
๋ฐด๋ ์์กฐ๋ฅผ ๋ฒ์ด ๋ฒ๋ฆฌ๊ณ ๋จ์ํ ํ์ฉ
?
๋ก ๋ฌถ์ฌ ์๋ ๋ณ์ ์ด๋ฆ์์ด ํฅํ{...}
(์ ๋ช ๋ฐฑํ ์ ์ธํ๊ณ$?
) - ์ด๊ฒ์ ํ๊ณ ์์ ๊นฐ ๊ฒ ํ์ฌ ๊ทธ๊ฒ์ ์์กดํ๋ ์คํฌ๋ฆฝํธ์ ๋น์จ..
๋?
($key1??'else'
) ๋๋ ์ผํญ ํํ์($key1?1:0
)์ด ๋ค๋ฐ๋ฅด์ง ์๋$key1?
์ ๊ฐ์ ๊ฒ์ ๋๋ค$key1??'else'
_parser error_๊ฐ ๋ฐ์ํฉ๋๋ค.$key1 ?1:0
/$key1 ??'else'
- ๋๋{...}
-${key1}?1:0
/${key1}??'else'
?
๋ ๋ ์ด์ (๋น{...}
-enclosed) ๋ณ์ ์ด๋ฆ์ ์ผ๋ถ๋ก ๊ฐ์ฃผ๋์ง ์์ผ๋ฏ๋ก ์ค์ ๋ก"Are you sure you want to kill $vParam?"
์ ๊ฐ์ ๋ฌธ์์ด์ ์๋ชป ์ฌ์ฉํ ๊ธฐ์กด ์คํฌ๋ฆฝํธ๋ฅผ _์์ _ํฉ๋๋ค์ฐ๋ฆฌ๊ฐ ์ ๋ง๋ก ๊ธฐ์กด ์คํฌ๋ฆฝํธ์ ์์ฃผ ์์ ๋ถ๋ถ์ ๊นจ๋จ๋ฆฌ๋ ๊ฒ์ ํผํด์ผ ํ๋ค๊ณ ๋๋๋ค๋ฉด @ExE-Boss๊ฐ ์ ์ํ ๋ ผ๋ฆฌ๋ฅผ _๊ณ ๋ คํ ์ ์์ง๋ง