native.exe
์์ฑnative.exe "`"a`""
ARGV [1] == "a"
ARGV [1] == a
Windows 10 x64
Name Value
---- -----
PSVersion 5.1.14393.0
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.14393.0
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
"\"a\""
์ด ์์๋๋ ๋์์ด๋ผ๊ณ ์๊ฐํ๋ ์ด์ ๋ ๋ฌด์์
๋๊น? PowerShell ์ด์ค์ผ์ดํ์ ๋ํ ๋์ ์ดํด์ ๋ฐ๋ฅด๋ฉด ์ค์ ๋์์ ์ ํํ๊ณ ์์๋๋ ๋์์
๋๋ค. "
"a ""
๋ a
๋๋ฌ์ผ ์ด์ค์ผ์ดํ ๋ ๋ฐ์ดํ ์์ ๋๋ฌ์ผ ๋ฐ์ดํ ์์ด๋ฏ๋ก PowerShell์ ์ธ๋ถ ์ด์ค์ผ์ดํ๋์ง ์์ ์์"this is a string argument "๋ก ํด์ํ๊ณ ๊ทธ๋์ ๊ทธ๊ฒ๋ค์ ์ญ์ ํ ๋ค์ ์ด์ค์ผ์ดํ ๋ ์์ ์ด์ค์ผ์ดํ ๋ ๋ฐ์ดํ๋ก ํด์ํ์ฌ "a"
๋จ๊ฒจ ๋ก๋๋ค. ๋ฌธ์์ด์ \
์ถ๊ฐ๋์ง ์์์ต๋๋ค.
Bash๊ฐ \
๋ฅผ ์ด์ค์ผ์ดํ ๋ฌธ์๋ก ์ฌ์ฉํ๋ค๋ ์ฌ์ค์ ๊ด๋ จ์ด ์์ต๋๋ค. PowerShell์์ ์ด์ค์ผ์ดํ ๋ฌธ์๋ ๋ฐฑํฑ์
๋๋ค. PowerShell ์ด์ค์ผ์ดํ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
๋ฌธ์ ๊ทธ๋๋ก "\"a\""
์ ๋ฌํ๋ ค๋ฉด ๋ค์์ ์ฌ์ฉํฉ๋๋ค.
> echo `"\`"a\`"`"
"\"a\""
๋ฟก๋ฟก
์, ์ด์ค์ผ์ดํ๋ ๋ด๋ถ โโcmdlet์ ๋ํด ์ ์๋ํ์ง๋ง ํนํ Windows์์ ๊ธฐ๋ณธ ๋ฐ์ด๋๋ฆฌ ์ ํต์ ํ ๋ ์ํฉ์ด ์ด์ํด์ง๋๋ค.
native.exe "
"a ""
์คํํ ๋ ARGV [1]๋
"a"
(3 ์)
๋์ ์
(ํ ๋ฌธ์).
ํ์ฌ native.exe
๊ฐ ๋ ๊ฐ์ ๋ฐ์ดํ์ a
๋ฌธ์๊ฐ์๋ ARGV๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์์ ํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ด์ํ ํธ์ถ์ ์ฌ์ฉํด์ผํฉ๋๋ค.
native.exe "\`"a\`""
์, ์๊ฒ ์ต๋๋ค. ์ฌ๊ฐ.
ํธ๊ธฐ์ฌ์ด ์ฌํด์ # 1639๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๋ฅผ ์๋ํ๋ฉด ์ด๋ป๊ฒ ๋๋์?
@andschwa ๋์ผํฉ๋๋ค. PowerShell๊ณผ CommandLineToArgvW
๋ชจ๋ ๋ง์กฑ ์ํค๋ ค๋ฉด ๋ ๋ฒ ์ด์ค์ผ์ดํํด์ผํฉ๋๋ค. ์ด ์ค :
native.exe "`"a`""
StartProcess๊ฐ cmd์ ๊ฐ์
native.exe ""a""
@ be5invis @douglaswth ๋ https://github.com/PowerShell/PowerShell/pull/2182 ๋ฅผ ํตํด ํด๊ฒฐ
์๋์, ๋ฐฑํฑ ์ด์ค์ผ์ดํ ์ฒ๋ฆฌ ๋ ํฐ ๋ฐ์ดํ ์์ ๋ฐฑ ์ฌ๋์๋ฅผ ์ถ๊ฐํด์ผํฉ๋๊น? ์ด์ค ์ด์ค์ผ์ดํ ๋ฌธ์ ๋ ํด๊ฒฐ๋์ง ์์ต๋๋ค. (์ฆ, PowerShell๊ณผ CommandLineToArgvW ๋ชจ๋์ ๋ํด ํฐ ๋ฐ์ดํ๋ฅผ ์ด์ค์ผ์ดํํด์ผํฉ๋๋ค.)
"
"a ""
๋ '"a"'
์ ๊ฐ์ผ๋ฏ๋ก "
native.exe '"a"'
๊ฒฐ๊ณผ๊ฐ "\"a\""
๋์ด์ผํ๋ค๊ณ ์ ์ํ์ญ๋๊น?
์ด๋ ๊ตฌํ ๋ ๊ฒฝ์ฐ ํ์ํ ์ด์ค ์ด์ค์ผ์ดํ๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ์กด์ ๋ง์ PowerShell ์คํฌ๋ฆฝํธ๋ฅผ ์์์ํฌ ์์๋ ๊ธฐ๋ฅ ์์ฒญ์ฒ๋ผ ๋ณด์ด๋ฏ๋ก ๋ชจ๋ ์๋ฃจ์ ์ ๋ํด ์ธ์ฌํ์ฃผ์๊ฐ ํ์ํฉ๋๋ค.
@vors ์.
@douglaswth ์ด์ค ์ด์ค์ผ์ดํ๋ ์ ๋ง ์ด๋ฆฌ ์์ต๋๋ค. DOS ์๋์ ๋ง๋ค์ด์ง "๋ด๋ถ"์ด์ค์ผ์ดํ๊ฐ ํ์ํ ์ด์ ๋ ๋ฌด์์
๋๊น?
ํธ์ ๋ด์ ๊ฐ๊ธฐ
GetCommandLineW ๋ฐ CommandLineToArgvW ๊ฒฐ๊ณผ๋ฅผ ํ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ C ์ฝ๋์
๋๋ค.
#include <stdio.h>
#include <wchar.h>
#include <Windows.h>
int main() {
LPWSTR cmdline = GetCommandLineW();
wprintf(L"Command Line : %s\n", cmdline);
int nArgs;
LPWSTR *szArglist = CommandLineToArgvW(cmdline, &nArgs);
if (NULL == szArglist) {
wprintf(L"CommandLineToArgvW failed\n");
return 0;
} else {
for (int i = 0; i < nArgs; i++) {
wprintf(L"argv[%d]: %s\n", i, szArglist[i]);
}
}
LocalFree(szArglist);
}
๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
$ ./a "a b"
Command Line : "Z:\playground\ps-cmdline\a.exe" "a b"
argv[0]: Z:\playground\ps-cmdline\a.exe
argv[1]: a b
$ ./a 'a b'
Command Line : "Z:\playground\ps-cmdline\a.exe" "a b"
argv[0]: Z:\playground\ps-cmdline\a.exe
argv[1]: a b
$ ./a 'a"b'
Command Line : "Z:\playground\ps-cmdline\a.exe" a"b
argv[0]: Z:\playground\ps-cmdline\a.exe
argv[1]: ab
$ ./a 'a"b"c'
Command Line : "Z:\playground\ps-cmdline\a.exe" a"b"c
argv[0]: Z:\playground\ps-cmdline\a.exe
argv[1]: abc
$ ./a 'a\"b\"c'
Command Line : "Z:\playground\ps-cmdline\a.exe" a\"b\"c
argv[0]: Z:\playground\ps-cmdline\a.exe
argv[1]: a"b"c
@ be5invis ์ ๋ ์ด์ค ์ด์ค์ผ์ดํ๊ฐ ์ฑ๊ฐ์ ๊ฒ์ ๋ํด ๋์ํ์ง ์์ง๋ง, ์ด๊ฒ์ ๋ํ ๋ณ๊ฒฝ์ ๊ธฐ์กด PowerShell ์คํฌ๋ฆฝํธ๊ฐ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ์ญ ํธํ๋์ด์ผํ๋ค๋ ๊ฒ์ ๋๋ค.
์ผ๋ง๋ ๋ง์๊ฐ์? ๊ทธ๋ฐ ํฐ ๋ฐ์ดํ์ ๋ํด ์๊ณ ์๋ ์คํฌ๋ฆฝํธ ์์ฑ์๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ธฐ๋ฅ์ด ์๋๋ผ ๋ฒ๊ทธ์ด๋ฉฐ ๋ฌธ์ํ๋์ง ์์์ต๋๋ค.
???? ์์ดํฐ
? 2016? 9? 21 ?? 01 : 58? Douglas Thrift < [email protected] [email protected] > ???
@ be5i nvishttps : //github.com/be5invis ์ด์ค ์ด์ค์ผ์ดํ๊ฐ ์ฑ๊ฐ์ ๊ฒ์ ๋ํด ๋์ํ์ง ์์ง๋ง, ์ด์ ๋ํ ๋ณ๊ฒฝ์ ๊ธฐ์กด PowerShell ์คํฌ๋ฆฝํธ๊ฐ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ์ญ ํธํ๋์ด์ผํ๋ค๋ ๊ฒ์ ๋๋ค.
๋น์ ์ด ์ธ๊ธ ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ Gi tHubhttps : //github.com/PowerShell/PowerShell/issues/1995#issuecomment -248381045์์ ํ์ธํ๊ฑฐ๋ https://github.com/notifications/unsubscribe-auth/AAOp20f_W0mTl2YiJKi_flQBJUKaeAnLks5qsB7ZgaJpZM4JpVin.
PowerShell์ 9 ๋ ๋์ ์ฌ์ฉ๋์ด ์์ผ๋ฏ๋ก ๋ง์ ์์ ์คํฌ๋ฆฝํธ๊ฐ์์ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค. ํ์์ ๋ฐ๋ผ StackOverflow ๋ฐ ๊ธฐํ ์์ค์์ ์ด์ค ์ด์ค์ผ์ดํ๊ฐ ํ์ํ์ง์ ๋ํ ๋ง์ ์ ๋ณด๋ฅผ ์ฐพ์์ผ๋ฏ๋ก ๊ทธ ํ์์ฑ์ ๋ํด ์๋ฌด๋ ๋ชจ๋ฅด๊ฑฐ๋ ๋ฌธ์ํ๋์ง ์์๋ค๋ ๊ทํ์ ์ฃผ์ฅ์ ๋์ํ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. .
์ถ๊ฐ ์ปจํ
์คํธ๋ฅผ ์ํด ๊ตฌํ์ ๋ํด ์กฐ๊ธ ์ด์ผ๊ธฐํ๊ณ ์ถ์ต๋๋ค.
PowerShell์ .NET API๋ฅผ ํธ์ถํ์ฌ Windows์์ Win32 API๋ฅผ ํธ์ถํ๋ ์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํฉ๋๋ค.
์ฌ๊ธฐ์ PS๋ ๋ค์์ ์ฌ์ฉํ๋ StartProcessInfo๋ฅผ ์์ฑํฉ๋๋ค.
https://github.com/PowerShell/PowerShell/blob/master/src/System.Management.Automation/engine/NativeCommandProcessor.cs#L1063
์ ๊ณต๋ API๋ ์ธ์์ ๋ํด ๋จ์ผ ๋ฌธ์์ด์ ์ทจํ ๋ค์ ์คํ์ ์ํํ๊ธฐ ์ํด ์ธ์ ๋ฐฐ์ด๋ก ๋ค์ ํ์ฑ๋ฉ๋๋ค.
์ด ์ฌ๋ถ์ ๊ท์น์ PowerShell์ ์ํด ์ ์ด๋์ง ์์ต๋๋ค. ์ด๋ Win32 API์
๋๋ค (๋คํํ๋ dotnet ์ฝ์ด ๋ฐ ์ ๋์ค ๊ท์น์์ ์ผ๊ด์ฑ์ด ์์).
ํนํ์ด ๊ณ์ฝ์ \
๋ฐ "
๋์์ ์ค๋ช
ํฉ๋๋ค.
PowerShell์ ๋ ๋๋ํ๊ณ ๋ ์ข์ ํ๊ฒฝ์ ์ ๊ณตํ๋ ค๊ณ ํ ์ ์์ง๋ง ํ์ฌ ๋์์ cmd ๋ฐ bash์ ์ผ์นํฉ๋๋ค. ๊ธฐ๋ณธ ์คํ ์ค์ ๋ณต์ฌํ์ฌ powershell์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๋์ผํ๊ฒ ์๋ํฉ๋๋ค.
@ be5invis ๊นจ์ง์ง ์๋ ๋ฐฉ์์ผ๋ก ๊ฒฝํ์ ํฅ์์ํค๋ ๋ฐฉ๋ฒ์ ์๊ณ ์๋ค๋ฉด ์ธ๋ถ ์ฌํญ์ ์ ๋ ฌํ์ญ์์ค. ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฒฝ์ฐ https://github.com/PowerShell/PowerShell/blob/master/docs/dev-process/breaking-change-contract.md์ ์ค๋ช ๋๋๋ก RFC ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค.
์ด๊ฒ์ Windows์ ์ ์ฉ๋์ง๋ง Linux ๋๋ Unix์์ ๋ช ๋ น์ ์คํํ ๋ ์ด์ค ์ด์ค์ผ์ดํ ๋ฐ์ดํ๊ฐ ํ์ํ๋ค๋ ๊ฒ์ด ์ด์ํฉ๋๋ค.
Linux์์ ํ๋ก์ธ์ค์๋ ๋จ์ผ ๋ช
๋ น ์ค์ด ์๋๋ผ ์ธ์ ๋ฐฐ์ด์ด ์์ต๋๋ค.
๋ฐ๋ผ์ powershell์ ์ธ์๋ ๋ชจ๋ ์ธ์๋ฅผ ๋ณํฉ ํ ๋ค์ ๋ค์ ๋ถํ ํ๋ ๋์ ์คํ ํ์ผ์ ์ ๋ฌ๋๋ ์ธ์์ ๋์ผํด์ผํฉ๋๋ค.
์ฐฝ์์๋ ํ์ฌ ๋์์ ์ผ๊ด๋์ง ์์ต๋๋ค.
์ธ์์ ๊ณต๋ฐฑ์ด ์์ผ๋ฉด ๋ณ๊ฒฝ๋์ง ์๊ณ ์ ๋ฌ๋ฉ๋๋ค.
์ธ์์ ๊ณต๋ฐฑ์ด ํฌํจ ๋ ๊ฒฝ์ฐ ๋ฐ์ดํ๋ก ๋ฌถ์ด๋ฉด CommandLineToArgvW
ํธ์ถ์ ํตํด ํจ๊ป ์ ์งํฉ๋๋ค. => CommandLineToArgvW
์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๋๋ก ์ธ์๊ฐ ๋ณ๊ฒฝ๋์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ธ์์ ๋ฐ์ดํ๊ฐ ํฌํจ๋์ด ์์ผ๋ฉด ์ด์ค์ผ์ดํ๋์ง ์์ต๋๋ค. => CommandLineToArgvW
์๋ ์ธ์๊ฐ ํ์ํ์ง๋ง ์ธ์๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
์ธ์๋ ์ ๋ ๋ณ๊ฒฝ๋์ง ์๊ฑฐ๋ CommandLineToArgvW
์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๊ธฐ ์ํด ํญ์ ๋ณ๊ฒฝ๋์ด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ณ์ฝ ํ๊ธฐ ๊ด๋ จ :
์ด์ค ์ด์ค์ผ์ดํ์ ๋ํ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐพ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ "๋ฒํท 2 : ํฉ๋ฆฌ์ ์ธ ํ์ ์์ญ"๋ฒ์ฃผ๋ก ๊ฐ์ฃผ ํ ๊ฒ์ด๋ฏ๋ก์ด๋ฅผ ๋ณ๊ฒฝํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๊น, ์๋๋ฉด ์ ๊ฐ ํ๋ ธ์ต๋๊น?
@vors ์ธ์๊ฐ ๋ณ์์ด๊ฑฐ๋ ๋ค๋ฅธ
"์๋ ์ด์ค์ผ์ดํ"์ฐ์ฐ์๊ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ^"a
" " -> "a\
" "`์ฒ๋ผ
๋๋ @TSlivede ๊ฐ ํ๋์ ๋ถ์ผ์น๋ก ์ณ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ธ์๋ ์ ๋ ๋ณ๊ฒฝ๋์ง ์๊ฑฐ๋ CommandLineToArgvW ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๊ธฐ ์ํด ํญ์ ๋ณ๊ฒฝ๋์ด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฒํท์ ๋ํด ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง "๋ถ๋ช
ํ ์ค์ํ ๋ณ๊ฒฝ ์ฌํญ"๋ฒํท๋ ์ ์ฌ์ ์ผ๋ก ๋ณ๊ฒฝ ๋ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ PowerShell์ ๋ ์ข๊ฒ ๋ง๋ค๊ณ ์ถ์ง๋ง ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ฐ๋ฆฌ์ ์ต์ฐ์ ์์ ์ค ํ๋์
๋๋ค. ๊ทธ๊ฒ์ด ๊ทธ๋ ๊ฒ ์ฝ์ง ์์ ์ด์ ์
๋๋ค.
์ฐ๋ฆฌ๋ ํ๋ฅญํ ์ปค๋ฎค๋ํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ํฉ์๋ฅผ ์ฐพ์ ์ ์๋ค๊ณ ํ์ ํฉ๋๋ค.
๋๊ตฌ๋ ์ง RFC ํ๋ก์ธ์ค๋ฅผ ์์ํ๊ณ ์ถ์ต๋๊น?
PowerShell์ด โโ์ธ์์ ๋ฐ์ดํ๋ฅผ ์ถ๊ฐ ํ ํ์๊ฐ์๋ ๊ฒฝ์ฐ ํ๋ก์ธ์ค๋ฅผ ์์ํ๊ธฐ ์ํด .Net ๋์ P / Invoke๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@lzybkr ๋ด๊ฐ ๋งํ ์์๋ ํ PInvoke๋ ๋์์ด๋์ง ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ Unix์ Windows API๊ฐ ๋ค๋ฅธ ๊ณณ์
๋๋ค.
https://msdn.microsoft.com/en-us/library/20y988d2.aspx (๊ณต๋ฐฑ์ ๊ตฌ๋ถ ๊ธฐํธ๋ก ์ฒ๋ฆฌ)
https://linux.die.net/man/3/execvp (๊ณต๋ฐฑ์ ๊ตฌ๋ถ ๊ธฐํธ๋ก ์ทจ๊ธํ์ง ์์)
Windows ๊ตฌํ ๋ณ๊ฒฝ์ ์ ์ํ์ง ์์์ต๋๋ค.
์ฌ๊ธฐ์ ํ๋ซํผ ๋ณ ๋์์ ํผํ๋ ค๊ณ ํฉ๋๋ค. ์คํฌ๋ฆฝํธ ์ด์์ฑ์ด ์์๋ฉ๋๋ค.
๋๋ ์ฐ๋ฆฌ๊ฐ ๊นจ์ง์ง ์๋ ๋ฐฉ์์ผ๋ก ์ฐฝ ๋์์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๊ณ ๋ คํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฆ, ์ ํธ ๋ณ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ๋ค๋ฅธ ๊ธฐ๋ณธ๊ฐ์ ๊ฐ์ง ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ธ๋ถ ๋ช ๋ น์ ํธ์ถํ๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค-์ด์จ๋ ๋ค์ ํ๋ซํผ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
์, Windows์ Linux๋ ์คํ ํ์ผ์ ํธ์ถํ๋ ๋ฐฉ๋ฒ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก ํ๋ซํผ ๋
๋ฆฝ์ ์ผ ์๋ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. Linux์์๋ ํ๋ก์ธ์ค๊ฐ ์ธ์ ๋ฐฐ์ด์ ๊ฐ์ ธ ์ค๋ ๋ฐ๋ฉด Windows์์๋ ํ๋ก์ธ์ค๊ฐ ๋จ์ผ ๋ช
๋ น ์ค (ํ๋์ ๋ฌธ์์ด) ๋ง ๊ฐ์ ธ์ต๋๋ค.
(๋ ๊ธฐ๋ณธ์ ์ธ ๋น๊ต
CreateProcess
-> ๋ช
๋ น ์ค (https://msdn.microsoft.com/library/windows/desktop/ms682425)
๊ณผ
execve
-> ๋ช
๋ น ๋ฐฐ์ด (https://linux.die.net/man/2/execve)
)
Powershell์ด โโ์ธ์์ ๊ณต๋ฐฑ์ด์์ ๋ ์ด๋ฌํ ๋ฐ์ดํ๋ฅผ ์ถ๊ฐํจ์ ๋ฐ๋ผ powershell์ ** ๋ฐฉ์์ผ๋ก ์ธ์๋ฅผ ์ ๋ฌํ๋ ค๊ณ ์๋ํ๊ณ CommandLineToArgvW
๋ช
๋ น ์ค์ ์๋ powershell์์ ์ ๊ณต๋ ์ธ์๋ก ๋ถํ ํฉ๋๋ค. (์ด๋ ๊ฒํ๋ฉด ์ผ๋ฐ์ ์ธ c ํ๋ก๊ทธ๋จ์ powershell ํจ์๊ฐ $ args๋ก ๊ฐ์ ธ ์ค๋ ๊ฒ๊ณผ ๋์ผํ ์ธ์๋ฅผ argv ๋ฐฐ์ด์์ ๊ฐ์ ธ์ต๋๋ค.)
์ด๊ฒ์ (p / invoke๋ฅผ ํตํด ์ ์ ๋๋๋ก) Linux ์์คํ
ํธ์ถ์ ์ธ์๋ฅผ ์ ๋ฌํ๋ ๊ฒ๊ณผ ์๋ฒฝํ๊ฒ ์ผ์นํฉ๋๋ค.
** (๋ฐ์ดํ๋ฅผ ์ด์ค์ผ์ดํํ์ง ์๊ธฐ ๋๋ฌธ์ ์คํจ ํจ)
PS : RFC ํ๋ก์ธ์ค๋ฅผ ์์ํ๋ ค๋ฉด ๋ฌด์์ด ํ์ํฉ๋๊น?
์ ํํ-PowerShell์ CommandLineToArgvW
๊ฐ ์ฌ๋ฐ๋ฅธ ๋ช
๋ น์ ์์ฑํ๊ณ _after_ PowerShell์ด โโ์ด๋ฏธ ๊ตฌ๋ฌธ ๋ถ์ ํ ๋ด์ฉ์ ๋ค์ ๊ตฌ๋ฌธ ๋ถ์ํ๋๋ก ์๋ํฉ๋๋ค.
์ด๊ฒ์ Windows์์ ์ค๋ซ๋์ ๊ณ ํต ์ค๋ฌ์ ๋ ์ ์ด์์ต๋๋ค. ๋๋ ๊ทธ ์ด๋ ค์์ * nix์ ๊ฐ์ ธ ๊ฐ์ผ ํ ์ด์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋์๊ฒ ์ด๊ฒ์ RFC๊ฐ ์ค์ ๋ก ํ์ํ์ง ์์ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ฒ๋ผ ๋๊ปด์ง๋๋ค. Windows PowerShell์์ ๋์์ ๋ณ๊ฒฝํ๋ฉด RFC๊ฐ ๋ณด์ฅ ๋ ์ ์์ง๋ง ์ฌ๋ฐ๋ฅธ ๋ณ๊ฒฝ์ (์ํ ํ ์์๋) ๋ฒ๊ทธ ์์ ์ผ๋ก ๊ฐ์ฃผ ๋ ์ ์์ต๋๋ค.
์, ๋ํ Linux์์ ์ง์ ์์คํ ํธ์ถ์ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝํ๋ฉด ๋ชจ๋ ์ฌ๋์ด ๋ ํ๋ณตํ๊ฒ ๋๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ฌ์ ํ ์ฐฝ๋ฌธ์์๋ ๋ณ๊ฒฝํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
(์ด์ฉ๋ฉด ์คํฌ๋ฆฝํธ๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ถ์ง ์์ ์ฌ๋๋ค์ ์ํด ํ๊ฒฝ ์ค์ ๋ณ์๋ฅผ ์ถ๊ฐํ์ฌ)
์ง๊ธ์ ํ ๋ ธ๊ธฐ ๋๋ฌธ์ ๋ฒ๊ทธ์
๋๋ค. ์ด๊ฒ์ด ์์ ๋์๋ค๋ฉด, ์ด๋ค ์ธ์๋ ๋ณ๊ฒฝ๋์ง ์๊ณ ๋ค์ ํ๋ก์ธ์ค์ ๋๋ฌ ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ฆฌ๋
์ค์์ ์ง์ syscall์ด ํ์ํ์ง ์์ ๊ฒ์
๋๋ค.
๊ทธ๋ฌ๋ CommandLineToArgvW
์ ํธํ๋์ง ์๋ ๋ฐฉ์์ผ๋ก ๋ช
๋ น ์ค์ ๋ถํ ํ๋ ์คํ ํ์ผ์ด ์์ผ๋ฏ๋ก @ be5invis ์ ์ธ์ ์ฐ์ฐ์์ ๋ํ ์์ด๋์ด๊ฐ
์ด ๋ฌธ์ ๋ ๋๊ตฐ๊ฐ PowerShell์์ ๋ค์ ๋ช ๋ น์ ์๋ํ๊ณ ์๋ํ์ง ์์์ง๋ง CMD๊ฐ ์๋ํ์ ๋ PowerShell์ dissingํ์ ๋ ๋ฐฉ๊ธ ๋ฐ์ํ์ต๋๋ค.
wmic useraccount where name='username' get sid
PSCX echoargs์์ wmic.exe๋ ๋ค์์ ํ์ธํฉ๋๋ค.
94> echoargs wmic useraccount where name='tso_bldadm' get sid
Arg 0 is <wmic>
Arg 1 is <useraccount>
Arg 2 is <where>
Arg 3 is <name=tso_bldadm>
Arg 4 is <get>
Arg 5 is <sid>
Command line:
"C:\Users\hillr\Documents\WindowsPowerShell\Modules\Pscx\3.2.2\Apps\EchoArgs.exe" wmic useraccount where name=tso_bldadm get sid
๊ทธ๋ ๋ค๋ฉด CMD.exe๋ ํ๋ก์ธ์ค๋ฅผ ํธ์ถํ๊ณ ๋ช ๋ น ์ค์ ๊ตฌ์ฑํ๋ ๋ฐ ์ด๋ค API๋ฅผ ์ฌ์ฉํฉ๋๊น? ๊ทธ ๋ฌธ์ ์ ๋ํด-%๋์ด ๋ช ๋ น์ ์๋์ํค๊ธฐ ์ํด ๋ฌด์์ํฉ๋๊น?
@rkeithhill CreateProcessW
. ์ง์ ์ ํ. ์ ๋ง.
Powershell์ด์ด ๋ ์ํฉ์์ ๋ค๋ฅด๊ฒ ์๋ํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ํนํ, ๊ณต๋ฐฑ์ ํฌํจํ๋ ์ธ์๋ฅผ ํฐ ๋ฐ์ดํ๋ก ๋ฌถ์ด ์ผ๊ด์ฑ์์ด ๋ํํฉ๋๋ค.
# Desired argv[1] is 4 characters: A, space, double-quote, B
$ .\echoargs.exe 'A \"B'
<"C:\test\echoargs.exe" "A \"B">
<A "B>
# Correct!
# Desired argv value is 4 characters: A, double-quote, space, B
$ .\echoargs.exe 'A\" B'
<"C:\test\echoargs.exe" A\" B>
<A"> <B>
# Wrong...
์ด์จ์ด๋ ์ด์ ๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฒซ ๋ฒ์งธ ์ํฉ์์๋ ๋ด ์ธ์๋ฅผ ํฐ ๋ฐ์ดํ๋ก ๊ฐ์ธ์ง ๋ง ๋ ๋ฒ์งธ ์ํฉ์์๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ๋๋ ๋ ์ ํํ ์ ํ์๊ฐ ๋ด๊ฐ ์๋์ผ๋ก ์คํฌ๋ฆฝํธ (์ฌ๋ถ) ํฌ์ฅ ํ ์ ์๋๋ก ํฐ ๋ฐ์ดํ๋ก ํฌ์ฅํ์ง ์์ต๋๋ค.
.echoargs.exe๋ cl echoargs.c
๋ค์์ ์ปดํ์ผํ์ฌ ์์ฑ๋ฉ๋๋ค.
// echoargs.c
#include <windows.h>
#include <stdio.h>
int wmain(int argc, WCHAR** argv) {
wprintf(L"<%ls>\n", GetCommandLineW());
for(int i = 1; i < argc; i++) {
wprintf(L">%s< ", argv[i]);
}
wprintf(L"\n");
}
ํธ์ง : ๋ค์์ ๋ด $ PSVersionTable์ ๋๋ค.
Name Value
---- -----
PSVersion 5.1.15063.296
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.15063.296
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
๋ฐ์ดํ์ ๊ดํ ๋์์ด ์ฌ๋ฌ ๋ฒ ๋ณ๊ฒฝ๋์์ผ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
ํธ์ง : ์๋ ์
๋ฐ์ดํธ ๋ ์์
๊ตฌ ๋ฒ์ :
# call helper
function Run-Native($command) {
$env:commandlineargumentstring=($args | %{'"'+ ($_ -replace '(\\*)"','$1$1\"' -replace '(\\*)$','$1$1') + '"'}) -join ' ';
& $command --% %commandlineargumentstring%
}
# some test cases
Run-Native .\echoargs.exe 'A "B' 'A" B'
Run-Native .\echoargs.exe 'A "B'
Run-Native .\echoargs.exe 'A" B'
Run-Native .\echoargs.exe 'A\" B\\" \'
์ฐ์ถ:
<"C:\test\echoargs.exe" "A \"B" "A\" B">
<A "B> <A" B>
<"C:\test\echoargs.exe" "A \"B">
<A "B>
<"C:\test\echoargs.exe" "A\" B">
<A" B>
<"C:\test\echoargs.exe" "A\\\" B\\\\\" \\">
<A\" B\\" \>
์ฒซ ๋ฒ์งธ -replace
๋ ๋ฐ์ดํ ์์ ๋ฐฑ ์ฌ๋์๋ฅผ ์ด์ค์ผ๋กํ๊ณ qoute๋ฅผ ์ด์ค์ผ์ดํํ๊ธฐ ์ํด ๋ฐฑ ์ฌ๋์๋ฅผ ํ๋ ๋ ์ถ๊ฐํฉ๋๋ค.
๋ ๋ฒ์งธ -replace
๋ ์ธ์ ๋์ ๋ฐฑ ์ฌ๋์๋ฅผ ์ด์ค์ผ๋ก ํ์ํ์ฌ ๋ซ๋ ๋ฐ์ดํ๊ฐ ์ด์ค์ผ์ดํ๋์ง ์๋๋กํฉ๋๋ค.
์ด๊ฒ์ --%
(PS v3 ์ด์)๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์ด๋ AFAIK๊ฐ ๋ค์ดํฐ๋ธ ์คํ ํ์ผ์ ๋ฐ์ดํ๋ฅผ ์ ๋ฌํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์
๋๋ค.
Run-Native
์ ์
๋ฐ์ดํธ ๋ ๋ฒ์ , ์ด์ Invoke-NativeCommand
( ์ ์๋๋ก )
function Invoke-NativeCommand() {
$command, [string[]] $argsForExe = $args
if($argsForExe.Length -eq 0){
& $command
} else {
$env:commandlineargumentstring=($argsForExe | %{
if($_ -match '^[\w\d\-:/\\=]+$'){
$_ #don't quote nonempty arguments consisting of only letters, numbers, or one of -:/\=
} else {
$_ <# double backslashes in front of quotes and escape quotes with backslash #> `
-replace '(\\*)"','$1$1\"' `
<# opening quote after xxx= or after /xxx: or at beginning otherwise #> `
-replace '^([\w\d]+=(?=.)|[/-][\w\d]+[:=](?=.)|^)','$1"' `
<# double backslashes in front of closing quote #> `
-replace '(\\*)$','$1$1' `
<# add closing quote #> `
-replace '$','"'
}
}) -join ' ';
& $command --% %commandlineargumentstring%
}
}
( iep ์์ ์๊ฐ์
""
๋ฅผ ์ด์ค์ผ์ดํ ๋ "
ํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ .bat
๋๋ msiexec ์ธ์์ ํฌํจ ๋ ๋ฐ์ดํ์ ๋ํด์๋ ์ฌ์ ํ ์๋ํ์ง ์์ต๋๋ค.๊ฐ์ฌํฉ๋๋ค. --%
๋ํด ๋ชฐ๋์ต๋๋ค. ํ๊ฒฝ ๋ณ์๋ฅผ ๊ธฐ๋ณธ ํ๋ก์ธ์ค์ ์ ์ถํ์ง ์๊ณ ์ํ ํ ์์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? (๋ฐ ํธ์ถ ํ ์์๋ ๋ชจ๋ ํ๋ก์ธ์ค)
๋ชจ๋ ์ฌ๋์ด ์ฌ์ฉํ ์์๋ Run-Native
Cmdlet์ ๊ตฌํํ๋ PowerShell ๋ชจ๋์ด ์์ต๋๊น? ์ด๊ฒ์ Powershell Gallery์ ์์ด์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค. ์ถฉ๋ถํ๋ค๋ฉด RFC์ ๊ธฐ์ด๊ฐ ๋ ์ ์์ต๋๋ค.
"๋์"๋ ๋ณด์์ ๋ํด ์ฐ๋ คํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ช
๋ น ์ค์ ์ด์จ๋ ์์ ํ๋ก์ธ์ค์ ํ์๋ฉ๋๋ค. (์ : Windows์ ๊ฒฝ์ฐ gwmi win32_process |select name,handle,commandline|Format-Table
ps -f
, Linux์ ๊ฒฝ์ฐ
๊ทธ๋๋ ํ๊ฒฝ ๋ณ์๋ฅผ ํผํ๊ณ ์ถ๋ค๋ฉด invoke-expression์ ์ฌ์ฉํ์ฌ ๋ฌด์ธ๊ฐ๋ฅผ ์์ฑ ํ ์ ์์ต๋๋ค.
RFC ๊ด๋ จ :
๋๋ ๊ทธ๋ฌํ ์ปค๋งจ๋ ๋ ์ด ํ์ํ๋ค๊ณ ์๊ฐํ์ง ์๊ณ ๋์ ์ด๊ฒ์ด ๊ธฐ๋ณธ ๋์์ด์ด์ผํฉ๋๋ค.
PowerShell์ ๊ธฐ๋ณธ ๋์์ ์์ ํด์ผํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ ๋๋ฌธ์ ๊ฒฐ์ฝ ๋ณํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ๋น๊ด์ ์ผ๋ก ์๊ฐํ๊ณ ์์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์์ฑ์ ์ ์ํ์ต๋๋ค. ๊ทธ๋ฌ๋ RFC์์ ์ด์ ์ด์ค์ผ์ดํ ๋์์ ๊ธฐ๋ณธ ์ค์ ๋ณ์๋ฅผ ํตํด ๋ค์ ํ์ฑํ ํ ์์๋ ๋ฐฉ์์ด ์ ๋ง ๋ง์์ ๋ญ๋๋ค.
์ ์ ํ ์๊ฒฌ์ผ๋ก ํ ๋ก ์ ์์ฝํ๊ฒ ์ต๋๋ค.
์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ ๋ฌธ์ ๊ฐ ์์์ด ๋ถ๋ช ํ๋ฏ๋ก ์ด์ ๋์์ ๊ณ์ ์ฌ์ฉํ ์ ์์ด์ผํฉ๋๋ค.
@TSlivede ์ RFC ์ ์ ์ _ ๋ฏธ๋๋ก๊ฐ๋ ๊ธธ _์ ์นญ์ฐฌ ํ ๋งํ๊ฒ ๊ฐ๋ฆฌํค๋ฉด์์ด๋ฅผ ์ค๋ช
ํฉ๋๋ค.
์ํ๊น๊ฒ๋ ๊ทธ์ ์ ์์์ด ๊ธ์ ์ฐ๋ ์์ ์์ _PR_๋ก ํ์๋๊ณ ์์ผ๋ฉฐ ์์ง RFC _draft_๋ก ์น์ธ๋์ง๋ ์์์ต๋๋ค.
_ ๋ฏธ๋ _๋ ๋ค์์ ์๋ฏธํฉ๋๋ค.
PowerShell์ ๊ณง cmd.exe
๊ด๋ จ ์ํ๋ฌผ์ ์ ๊ฑฐ ํ ์์ฒด ์
ธ์ด๋ฏ๋ก ์ธ๋ถ ์ ํธ๋ฆฌํฐ (์ผ๋ฐ์ ์ผ๋ก ์ฝ์ / ํฐ๋ฏธ๋ ์ ํ๋ฆฌ์ผ์ด์
์ธ ์คํ ํ์ผ)๋ฅผ ํธ์ถ ํ ๋ ๊ณ ๋ คํด์ผ ํ ์ ์ผํ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. :
์ ๋ฌํ ์ธ์๋ _PowerShell_์ ์ธ์ ๋ชจ๋ ๊ตฌ๋ฌธ ๋ถ์ _only_์ ๊ท์น์ ๋ฐ๋ผ ์ง์ ๋์ด์ผํฉ๋๋ค.
ํด๋น ํ๋ก์ธ์ค์ _literals_ ๊ฒฐ๊ณผ๋ _individual_ ์ธ์๋ก ๋์ ์คํ ํ์ผ์ _as-is_๋ก ์ ๋ฌ๋์ด์ผํฉ๋๋ค.
์ฆ, ์ฌ์ฉ์๋ก์ ์ง์คํด์ผ ํ ๊ฒ์ _PowerShell_์ ๊ตฌ๋ฌธ ๋ถ์ ๊ฒฐ๊ณผ๊ฐ ๋ฌด์์ธ์ง, ๊ทธ๋ฆฌ๊ณ PowerShell์ด โโ๋ชจ๋ ๋ฐฐํ๋ฅผ ์ฒ๋ฆฌํ์ฌ ์ ๋ฌ๋๋ ๊ฒฐ๊ณผ์ ์์กด ํ ์์๋ ๊ฒ์ ๋๋ค. -์ฅ๋ฉด ์ธ์ฝ๋ฉ-ํ์ํ ๊ฒฝ์ฐ.
_ ๊ตฌํ _ ๋ฏธ๋ :
_Windows_์์ :
_historical_ ์ด์ ๋ก Windows๋ ๋์ ์คํ ํ์ผ์ _ ๋ฆฌํฐ๋ด ๋ฐฐ์ด๋ก ์ธ์๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ํ์ฉํ์ง _ ์์ต๋๋ค _. ๋์ _pseudo ์ ๊ตฌ๋ฌธ _์ ์ฌ์ฉํ์ฌ _all_ ์ธ์๋ฅผ ์ธ์ฝ๋ฉํ๋ _single_ ๋ฌธ์์ด์ด ํ์ํฉ๋๋ค. ๋ ๋์ ๊ฒ์ ๋จ์ผ ๋ฌธ์์ด์ ํด์ํ๊ณ ์ธ์๋ก ๋ถํ ํ๋ ๊ฒ์ ๊ถ๊ทน์ ์ผ๋ก ๊ฐ๋ณ ๋์ ์คํ ํ์ผ์ ๋ฌ๋ ค ์๋ค๋ ๊ฒ์ ๋๋ค.
PowerShell์ด โโํ ์์๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋ช ๋ น ์ค์ _predictable, ํ์คํ ๋ ๋ฐฉ์์ผ๋ก _own_ ๊ฐ๋ณ ์ธ์๋ก ๋ถํ ํ ํ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋จ์ผ ๋ฌธ์์ด์ ํ์ฑํ๋ ๊ฒ์ ๋๋ค.
@TSlivede ์ RFC ์ ์ ์ PowerShell ์ด ๊ตฌ๋ฌธ ๋ถ์์ ์ํ ํ ๋ Windows C / C ++ ๋ฐํ์์ด ์ ๋ ฅ ์ธ์๋ฅผ์๋ ๊ทธ๋๋ก ๋ณต๊ตฌํ๋๋ก ํ๋ ๋ฐฉ์์ผ๋ก ์์ฌ ์ ธ ๋ช ๋ น ์ค์ ํฉ์ฑํ๋๋ก ์ ์ํจ์ผ๋ก์จ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํฉ๋๋ค.
๋ช ๋ น ์ค์ ํด์ํ๋ ๊ฒ์ด ๊ถ๊ทน์ ์ผ๋ก ๊ฐ ๋์ ์คํ ํ์ผ์ ๋ฌ๋ ค ์๋ค๋ ์ ์ ๊ฐ์ํ ๋, ์ด๊ฒ์ด ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ ํ ๊ฒ์ด๋ผ๋ _ ๋ณด์ฅ _์ ์์ง๋ง _most_ ๊ธฐ์กด ์ ํธ๋ฆฌํฐ๊ฐ ์ด๋ฌํ ๊ท์น์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๊ท์น์ด ๊ฐ์ฅ ํฉ๋ฆฌ์ ์ธ ์ ํ์ ๋๋ค.
์ ์ผํ๊ฒ ์ฃผ๋ชฉํ ๋งํ ์์ธ๋ RFC ์ ์์์ ์ ์ํ๋๋ก ํน์ ์ฒ๋ฆฌ๋ฅผ๋ฐ์ ์์๋ _batch files_์ ๋๋ค.
_Unix_ ํ๋ซํผ :
์๋ฐํ ๋งํ๋ฉด, ํ๋ซํผ ๋ค์ดํฐ๋ธ๊ฐ ์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๊ธฐ์ํ _ ์ธ์๋ฅผ ๋ฆฌํฐ๋ด ๋ฐฐ์ด๋ก ํ์ฉ _-PowerShell์ด โโ_own_ ํ์ฑ์ ์ํ ํ ํ ๋๋๋ ์ธ์๋ _as-is_์ ์ ๋ฌ๋์ด์ผํ๊ธฐ ๋๋ฌธ์ Windows ์ธ์ ๊ตฌ๋ฌธ ๋ถ์์ ๊ดด๋กญํ๋ ๋ฌธ์ ๋ _ ์ ๋ ๋ฐ์ํ์ง ์์ต๋๋ค _. .
@lzybkr ์ ์ธ์ฉ
์ฌํ๊ฒ๋ .NET Core (CoreFX)์ ํ์ฌ ์ ํ์ผ๋ก ์ธํด ์ด๋ฌํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. CoreFX API๊ฐ _Windows_ ์ธ์์ ๋ฌด์ ๋ถ ์ํ๋ฅผ Unix ์ธ๊ณ๋ก ์ ๋ฌํ๋๋ก ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ์ ๋์ค.
์ ๋ ์ด CoreFX ์ด์ ๋ฅผ ๋ง๋ค์ด ๊ทธ ๋ฌธ์ ๊ฐ
๊ทธ ๋์ CoreFX๊ฐ ์์์ ์ธ๊ธ ํ C / C ++ ๊ท์น์ ๊ธฐ๋ฐ์ผ๋ก ์์ฌ ๋ช ๋ น ์ค์ ๋ค์ ์ธ์๋ก ๋ถํ ํ๋ฏ๋ก @TSlivede ์ ์ ์์ Unix ํ๋ซํผ์์๋ ์๋ํด์ผํฉ๋๋ค.
https://github.com/PowerShell/PowerShell/issues/4358 ์ด ์ด๊ฒ์ ์ค๋ณต์ผ๋ก ์ข ๋ฃ๋์์ผ๋ฏ๋ก ์ฌ๊ธฐ์ ํด๋น ๋ฌธ์ ์ ๋ํ ๊ฐ๋จํ ์์ฝ์ด ์์ต๋๋ค.
ํํ ๋ฐฑ ์ฌ๋์๊ฐ์๋ ์ธ๋ถ ์คํ ํ์ผ์ ์ธ์์ ๊ณต๋ฐฑ์ด ํฌํจ ๋ ๊ฒฝ์ฐ ํ์ฌ ์์งํ๊ฒ ์ธ์ฉ๋ฉ๋๋ค (์ธ์ ์๋ค์ ์ธ์ฉ ๋ถํธ ์ถ๊ฐ). ์ผ๋ฐ์ ์ธ ๊ท์น ์ ๋ฐ๋ฅด๋ ๋ชจ๋ ์คํ ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ด ํด์๋ฉ๋๋ค.
@ mklement0 ์ ์๊ฒฌ์์ :
์์ ์ค๋
".\test 2\"
์ ๋ ๋ฒ์งธ"
๋ ์ด์ค์ผ์ดํ ๋ "๋ก ํด์๋์ด ๋ฌธ์์ด์ ๋๋จธ์ง ๋ถ๋ถ์ด ๋ฐ์ํฉ๋๋ค. ๋ ผ์.
์:
( @akervinen ์ ์ฝ๋ฉํธ์์ )
PS X:\scratch> .\ps-args-test.exe '.\test 2\'
์ธ์ ์ธ์ :.\test 2"
PSReadLine์ ๋๋ ํ ๋ฆฌ์ ์๋ ์์ฑ์ ํํ ๋ฐฑ ์ฌ๋์๋ฅผ ์ถ๊ฐํ๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋งค์ฐ ์์ฃผ ๋ฐ์ํฉ๋๋ค.
corefx๋ ์ฐ๋ฆฌ๊ฐ ํ์๋กํ๋ API๋ฅผ ์์ฑํ๋ ๋ฐ ์ด๋ ค์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฏ๋ก ์ด๊ฒ์ 6.1.0์ผ๋ก ์ฐ๊ธฐํฉ๋๋ค. 6.0.0์ ๊ฒฝ์ฐ # 4358์ ์์ ํ ์ ์๋์ง ํ์ธํ๊ฒ ์ต๋๋ค.
@TSlivede ํจ์๋ฅผ ๊ฐ์ ธ ์์ Invoke-NativeCommand
๋ก ์ด๋ฆ์ ๋ฐ๊พธ๊ณ ( Run
๋ ์ ํจํ ๋์ฌ๊ฐ ์๋๋ฏ๋ก) ๋ณ์นญ ^
ํ๊ณ PowerShellGallery์ ๋ชจ๋๋ก ๊ฒ์ํ์ต๋๋ค.
install-module NativeCommand -scope currentuser
^ ./echoargs 'A "B' 'A" B'
@ SteveL-MSFT :
์์ ๋ฐฉํธ์ ๊ฐ๋ ๊ฒ์ ์ข์ง๋ง, CoreFX ์๋ฃจ์ ์ ๊ธฐ๋ค๋ฆฌ๋ ๋์ @TSlivede ์ RFC ์ ์์ ๋ฏธ๋ฆฌ
\"
๋ฌธ์ ๋ง ์์ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฐ๋จํ ์๋๋ฆฌ์ค์์๋ ์ธ์ ์ ๋ฌ์ด ๊ทผ๋ณธ์ ์ผ๋ก ์ค๋จ๋ฉ๋๋ค.
PS> bash -c 'echo "hi there"'
hi # !! Bash sees the following tokens: '-c', 'echo hi', 'there'
์ด ์์ ์์ ํ๋์ด ๋ฌด์์ธ์ง์ ๋ํ ์ถฉ๋ถํ ๋์๊ฐ ์๋ค๊ณ ์๊ฐํ๋ฏ๋ก ์ ์ฒด RFC ํ๋ก์ธ์ค๊ฐ ํ์ํ์ง ์์ต๋๋ค.
์ ์ผํ๊ฒ ๋ฐ์ด๋ ๊ฒฐ์ ์ _Windows_์์ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
@ mklement0 @ SteveL-MSFT
์ฐ๋ฆฌ๋ ์ด๋ฏธ ํธํ์ฑ์ ๊นจ๊ณ ์์ต๋๊น?
์ ์ผํ ๋ฐ์ด๋ ๊ฒฐ์ ์ Windows์์ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
๊ทธ๋,ํ์ง๋ง ๊ทธ๊ฒ ์ด๋ ค์ด ๋ถ๋ถ์ด์ง?
@ be5invis "์ด๋ฏธ ํธํ์ฑ์ด ๊นจ์ก๋ค"๋ ์๋ฏธ๋ ๋ฌด์์ ๋๊น?
๋ํ CoreFX๊ฐ ๋ ์ด์ด์์ ์์ ์ด ์๋ฐํ ๊ฒฝ์ฐ ๋ ์ด์ด์ ์์ ๊ณต๊ฐ์ ๋ง๋ค์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋๊ตฐ๊ฐ๊ฐ ์ค๋ ๋์์ ์์์ ๋งํ๋ฏ์ด ์ด๊ฒ์ ์ฑ๊ฐ์ ์ผ์ด์ง๋ง ์ปค๋ฎค๋ํฐ์์ ๊ฝค ์ ๋ฌธ์ํ๋์ด ์์ต๋๋ค. ๋ค์ ๋ ๋ฒ์ ๋ฆด๋ฆฌ์ค์์ ๋ ๋ฒ ์ค๋จํด์ผํ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@joeyaiello :
# 4358์ ๋ํ ์์ ์ ์ต์ข
\
๋ฅผ ๋ ๋ฐฐ๋ก ๋๋ฆผ์ผ๋ก์จ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ ์ฌ๋๋ค์๊ฒ ์ด๋ฏธ ํฐ ๋ณํ๊ฐ ์๋๊ฐ? ์ : "c:\tmp 1\\"
? ์ฆ,์ด ์์ ์ฌํญ์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ ์ ํํ๋ฉด _two_ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ณด์ฅ๋ฉ๋๋ค.์ด ๋ณ๊ฒฝ ์ฌํญ์ ์ง๊ธ ๋น์ฅ, ๋์ค์ CoreFx API๋ก ์ ํ ํ ํ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ง๊ธ ์์ ํ ์์ ๋ฐฉํธ์ด ๊ตฌํ๋๋ค๋ฉด ๊ทธ _ ๊ฐ๋ฅ _ ํจ _์ด ์ผ์ด๋ ์ ์์ง๋ง, ์ฐ๋ฆฌ๊ฐ์ด ๋ค๊ฐ์ค๋ ๋ณํ์ ๋ํด ์๊ณ ์๋ ๊ฒ์ ๊ฐ์ํ ๋ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์ต๋๋ค.
๋ฐ๋๋ก, ๋ค์๊ณผ ๊ฐ์ ์ผ๋ฐ์ ์ธ ์ธ์ฉ ์๋๋ฆฌ์ค์ ๊ฒฝ์ฐ Unix์์์ ์ฑํ์ ๋ฐฉํด ํ ์ ์์ต๋๋ค.
bash -c 'echo "hi there"'
์ด ์ ๋๋ก ์๋ํ์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ ๊ณ ์น๋ ๊ฒ์ด ํจ์ฌ ๋ ํฐ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
@ PowerShell / powershell-committee๋ ์ด์ ๋ํด ๋
ผ์ํ๊ณ ์ต์ํ --%
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐ์ดํ๊ฐ ์ด์ค์ผ์ดํ๋์ด ๋ค์ดํฐ๋ธ ๋ช
๋ น์ด ์์ ํ๋๋ก bash์ ๋์ผํ ๋์์ ๊ฐ์ ธ์ผํ๋ค๋ ๋ฐ ๋์ํ์ต๋๋ค. ํ ๋ก ์ ์ํด ์์ง ์ด๋ ค์๋ ๊ฒ์ ์ด๊ฒ์ด --%
์ฌ์ฉํ์ง ์๊ณ ๊ธฐ๋ณธ ๋์์ด์ด์ผํ๋์ง ์ฌ๋ถ์
๋๋ค.
๋ ธํธ :
_Windows_์์ ์ผ์ด๋๋ ์
ธ ๋์์ _emulate_ํ๋ ค๋ ๊ฒ๊ณผ๋ ๋ฐ๋๋ก _Unix_์์ --%
๋ฅผ ์ฌ์ฉํ ๋ ์ค์ ์
ธ ์คํ ํ์ผ์ ๋ํ ํธ์ถ์ด ํ์ํ๋ค๊ณ ๊ฐ์ ํ๊ณ ์์ต๋๋ค. ์๋ฎฌ๋ ์ด์
์ Windows์์ ์ด๋ ต์ง ์์ง๋ง ์๋ฎฌ๋ ์ด์
์ด ํ์ํ ๋ ๋ง์ ๊ธฐ๋ฅ์ ๊ณ ๋ คํ ๋ Unix์์๋ ํจ์ฌ ๋ ์ด๋ ต์ต๋๋ค.
์ค์ ์
ธ์ ์ฌ์ฉํ๋ฉด ์ด๋ค ์
ธ์ ์ฌ์ฉํ ์ง์ ๋ํ ์ง๋ฌธ์ด ์ ๊ธฐ๋ฉ๋๋ค. bash
์ ์ด๋์๋ ์์ง๋ง ๊ธฐ๋ณธ ๋์์ POSIX์ ํธํ๋์ง ์์ผ๋ฉฐ POSIX์์ ํ์ํ์ง๋ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด์์ฑ์ ์ํด ๋ค๋ฅธ ์คํฌ๋ฆฝํ
์ธ์ด๋ ๋ค์์ ํธ์ถํฉ๋๋ค. /bin/sh
, POSIX์์ ์ ์ธ ํ ์ ์คํ ํ์ผ (ํธํ์ฑ ๋ชจ๋ (์ : macOS)์์ ์คํ์ค์ธ Bash ์ผ ์ ์์ง๋ง ๋ฐ๋์ ๊ทธ๋ด ํ์๋ ์์ต๋๋ค (์ : Ubuntu์ Dash)).
ํ๋ฆผ์์ด ์ฐ๋ฆฌ๋ /bin/sh
๋ ํ๊นํ
ํด์ผํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ Bash ๊ธฐ๋ฅ (ํนํ ์ค๊ดํธ ํ์ฅ, ํน์ ์๋ ๋ณ์ ๋ฑ)์ ์ฌ์ฉํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
--%
์๋ ์์ ๋ก echoargs --% 'echo "hi there"'
๋ช
๋ น์ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
๋ฐ์ดํ๊ฐ ์ด์ค์ผ์ดํ๋์ด ๋ค์ดํฐ๋ธ ๋ช ๋ น์ด ์์ ํ๋ค๋ ์ ์์ bash์ ๋์ผํ ๋์์ ๋๋ค.
CoreFX API๊ฐ ํ์ฅ๋๋ฉด _ ํฅํ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ์ด์ค์ผ์ดํ๋ฅผ ์ ํ ์ํํ์ง ์๊ณ ๋์ ๋ค์์ ์ํํ๋ ๊ฒ์ ๋๋ค.
/bin/sh
์คํ ํ์ผ๋ก, (ํจ๊ณผ์ ์ผ๋ก) ProcessStartInfo.FileName
ํ ๋น๋ฉ๋๋ค.ProcessStartInfo.ArgumentList
์ ๊ฐ์ _literal_, _individual_ ์ธ์ ํ ํฐ์ ๋ค์ ๋ฐฐ์ด :-c
echoargs 'echo "hi there"'
-์ฆ, ์๋ ๋ช
๋ น ์ค์ --%
๊ฐ ์ ๊ฑฐ ๋ ๊ฒ์ ์ ์ธํ๊ณ ์ง์ ๋๋๋ก _literally_๋ฅผ ์ฌ์ฉํ์ต๋๋ค.์ค์ ๋ก ๋ช ๋ น ์ค์ _as-is_๋ฅผ ํตํด ์ ธ ์คํ ํ์ผ๋ก ์ ๋ฌ ๋ ๋ค์ _its_ ๊ตฌ๋ฌธ ๋ถ์์ ์ํ ํ ์ ์์ต๋๋ค.
ํ์ฌ ๋ฆฌํฐ๋ด ์ธ์๋ฅผ ์ ๋ฌํ๋ ๋ฐฐ์ด ๊ธฐ๋ฐ ๋ฐฉ๋ฒ์ด์๋ ์ํฉ์์ -c
๋ฐ echoargs 'echo "hi there"'
๋ฅผ _single_ string _with escaping_์ผ๋ก ๊ฒฐํฉํด์ผํฉ๋๋ค. ์ ๊ฐ์ค๋ฝ๊ฒ๋ _ ์ค์ง CoreFX API_๋ ์ค์ ํ๋ก์ธ์ค๋ฅผ ์์ฑ ํ ๋์ด ๋จ๊ณ๋ฅผ _reverses_ํ๊ณ ๋จ์ผ ๋ฌธ์์ด์ ๋ฆฌํฐ๋ด ํ ํฐ์ผ๋ก ๋ค์ ๋ถํ ํฉ๋๋ค.์ด ๋ฐ์ ์ด ํญ์ ๋ฆฌํฐ๋ด ํ ํฐ์ ์๋ ๋ชฉ๋ก์ด๋๋๋ก ๋ณด์ฅํ๋ ๊ฒ์ ์ด๋ ค์ด ๋ถ๋ถ์
๋๋ค.
๋ค์ ๋งํ์ง๋ง, ์ฌ๊ธฐ์ ํ์ถํ๋ ์ ์ผํ ์ด์ ๋ ํ์ฌ CoreFX ์ ํ ๋๋ฌธ์
๋๋ค.
์ด ์ ํ์ ํด๊ฒฐํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋จ์ผ ์ด์ค์ผ์ดํ ๋ฌธ์์ด์ ProcessStartInfo
์ธ์คํด์ค์ .Arguments
์์ฑ์ ํ ๋นํด์ผํ๋ฉฐ ์ด์ค์ผ์ดํ๋ C ++ ๋ช
๋ น ์ค ์ธ์ ๊ตฌ๋ฌธ ๋ถ์์ ์ง์ ๋๋๋ก ์ํํด์ผํฉ๋๋ค.
/bin/sh
์คํ ํ์ผ๋ก, (ํจ๊ณผ์ ์ผ๋ก) ProcessStartInfo.FileName
ํ ๋น๋ฉ๋๋ค.ProcessStartInfo.Arguments
๊ฐ์ผ๋ก ์ด์ค์ผ์ดํ ์ฒ๋ฆฌ ๋ ๋ค์ ๋จ์ผ ๋ฌธ์์ด :-c "echoargs 'echo \"hi there\"'"
## ๊ธฐ๋ณธ ๋์
๋ ผ์์ ์ฌ์ง๊ฐ์๋ ๊ฒ์ ์ด๊ฒ์ด-%๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๊ธฐ๋ณธ ๋์์ด์ด์ผํ๋์ง ์ฌ๋ถ์ ๋๋ค.
Unix์ ๊ธฐ๋ณธ ๋์์ ๋งค์ฐ ๋ฌ๋ผ์ผํฉ๋๋ค.
_PowerShell ์์ฒด ์ด์ธ์ ์ด์ค์ผ์ดํ ๊ณ ๋ ค ์ฌํญ ์ ์๋ํ์ง ์์์ผํฉ๋๋ค (์ฌํ๊ฒ๋ ํผํ ์์๋ _Windows_๋ ์์ธ์
๋๋ค.ํ์ง๋ง MS C ++ ๊ท์น์ _ ๋ค์์ ์ ์ฉ ํ ์ ์์ต๋๋ค _; ์คํจ, --%
๋ ํ์ถ ํด์น๋ฅผ ์ ๊ณตํฉ๋๋ค).
์์ฒด ๊ตฌ๋ฌธ ๋ถ์ ํ _PowerShell_์ด ๋๋๋ ์ธ์๊ฐ ๋ฌด์์ด๋ ๋ค๊ฐ์ค๋ ProcessStartInfo.ArgumentList
์์ฑ์ ํตํด _ ๋ฆฌํฐ๋ด์ _array_ ๋ฐฐ์ด๋ก ์ ๋ฌ๋์ด์ผํฉ๋๋ค .
--%
์์ด ์์ ์ ์ ์ฉ๋จ : echoargs 'echo "hi there"'
:
PowerShell์ ์ผ๋ฐ์ ์ธ ๊ตฌ๋ฌธ ๋ถ์์ ์ํํ๊ณ ๋ค์ ๋ ์ธ์๋ก ๋๋ฉ๋๋ค.
echoargs
echo "hi there"
(์์ ๋ฐ์ดํ-_PowerShell_์ ๋ํ ๊ตฌ๋ฌธ ๊ธฐ๋ฅ ๋ง ํฌํจ, ์ ๊ฑฐ๋จ)ProcessStartInfo
๊ฐ ๋ค์๊ณผ ๊ฐ์ด ์ฑ์์ง๊ณ ๊ณง ์ถ์ ๋ CoreFX ํ์ฅ์ด ์ ์ฉ๋ฉ๋๋ค.
echoargs
์ (์ ํจ) ๋ฑ .FileName
์์ฑ ๊ฐ.ArgumentList
์ํด ๋
ธ์ถ ๋ Collection<string>
์ธ์คํด์ค์ ์ถ๊ฐ ํ ์ ์ผํ ์์๋ก _Literal_ echo "hi there"
.ArgumentList
.๋ค์ ๋งํ์ง๋ง, .ArgumentList
์ต์
์ด์๋ ๊ฒฝ์ฐ _yet_ํ์ง๋ง _ ์ค๊ฐ์ _ ์์์ ์ค๋ช
ํ ๊ฒ๊ณผ ๋์ผํ MS C ++ ํธํ ๋ณด์กฐ ์ด์ค์ผ์ดํ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@ SteveL-MSFT
Make the stop-parsing symbol (-%) work on Unix (# 3733) ์์ ์ด๋ฏธ ์ธ๊ธํ๋ฏ์ด --%
์ ๋์์ ๋ณ๊ฒฝํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
/bin/sh -c
๋ํ ํน๋ณํ ๊ธฐ๋ฅ์ด ํ์ํ ๊ฒฝ์ฐ ๋ค๋ฅธ ๊ธฐํธ ๋ฅผ ์ฌ์ฉํ๊ณ --%
๊ทธ๋๋ก ๋์ญ์์ค!
@TSlivede :
_If_ something --%
-_like_๋ Unix์์ ๊ตฌํ๋ฉ๋๋ค-๋ค์ดํฐ๋ธ globbing๊ณผ ์ผ๋ฐ์ ์ผ๋ก Unix์์ ๋ช
๋ น ์ค์ ์ ํตํ ๊ตฐ์ค์ ์ฌ์ฉํ๋ฉด ํ์๊ฐ ์ ๋ค๊ณ ๋๋๋๋ค. ๊ทธ๋ฐ ๋ค์ --$
์ ๊ฐ์ _ ๋ค๋ฅธ ๊ธฐํธ _๋ฅผ ์ ํํฉ๋๋ค
๋ค๋ฅธ ๊ธฐํธ๋ ๋ํ ์ด์ ๋ถ๊ฐ๋ฅํ _ ํ๋ซํผ ๋ณ _ ๋์์ด ํธ์ถ๋๊ณ ์์์ ์๊ฐ์ ์ผ๋ก ๋์ ๋๋ ์๋ฆผ ์ญํ ์ํฉ๋๋ค.
๊ทธ ์์ด๊ฐ ๊ฑด๋ ์ฌ ๋ PowerShell์์ ๋ฌด์์ํด์ผํ๋์ง ์ง๋ฌธ --%
์ ๋์ค์ --$
Windows์์.
--%
๊ทธ๋๋ก ๋์ด๋๋ฉ๋๋ค. / bin / sh๋ฅผ ํธ์ถํ๋ --$
์ ๊ฐ์ ๊ฒ์ ๋์
ํ๋ฉด Windows์์ cmd.exe๊ฐ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ข์ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ด๋ฌํ ๋์์ ๋ํ cmdlet์ ๋ง๋ค ์ ์์ต๋๊น?
@iSazonov ๋น์ ์ Invoke-Native
๊ฐ์ ๊ฒ์ ์ ์ํ๊ณ ์์ต๋๊น? ๋ด๊ฐ ๊ทธ ํฌ์ธ์ง ํ์คํ์ง ์์ต๋๋ค.
์, Start-Native
์ฒ๋ผ.
๋๋ด์ผ๋ก :-), PowerShell์ cmdlet์ ์ข์ํ์ง ์์ต๋๊น?
Build.psm1์๋ https://mnaoumov.wordpress.com/2015/01/11/execution-of-external-commands-in-powershell-done-right/์ ๋ํ ๋งํฌ๊ฐ์๋ Start-NativeExecution
์ด ์์ต๋๋ค.
@ SteveL-MSFT
-% ๊ทธ๋๋ก ๋์ด๋ ๊ด์ฐฎ์ต๋๋ค.
๋๋ ์ฐ๋ฆฌ ๋ชจ๋๊ฐ --%
์ด _Windows_์์ํ๋ ๋ฐฉ์๋๋ก ๊ณ์ ์๋ํด์ผํ๋ค๋ ๋ฐ ๋์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋์กฐ์ ์ผ๋ก _Unix_์์๋์ด ๋์์ด ์๋ฏธ๊ฐ ์์ต๋๋ค. ์ ๊ฐ ์ฌ๊ธฐ์ ๋ณด์ฌ ์ฃผ๋ ค๊ณ ํ๋ ๊ฒ์ฒ๋ผ ์์ฝํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
%var%
)์
๋๋ค.--%
๋ฅผ ๋์
ํ ์ฃผ๋ ๋๊ธฐ๋ ๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ค๋ฉด _ ๊ธฐ์กด cmd.exe
๋ช
๋ น ์ค์ ๊ทธ๋๋ก _ ์ฌ์ฌ์ฉ ํ ์ ์๋๋กํ๋ ๊ฒ์ด ์์ต๋๋ค.
--%
๋ ํ์ฌ ๋์์ผ๋ก Unix์์ ์ธ๋ชจ๊ฐ ์์ต๋๋ค./bin/sh -c
๊ธฐ๋ฐ์ด์ด์ผํ๋ฉฐ ์๋ง๋ ๋ค๋ฅธ ๊ธฐํธ๋ฅผ ์ฌ์ฉํ์ ๊ฒ์
๋๋ค.Windows์์ cmd /c
๊ธฐ๋ฐ ๊ธฐ๋ฅ์ด ํ์ํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. --%
์๋ _ ๋๋ถ๋ถ _ _ ์ถฉ๋ถํ ์ข์ ๋ฐฉ์์ผ๋ก ๋ค๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์
๋๋ค.
@TSlivede ๋ ๋ชจ๋ ์
ธ ๊ธฐ๋ฅ์ด ์๋ฎฌ๋ ์ด์
๋๋ ๊ฒ์ ์๋์ง๋ง ์ค์ ๋ก๋ ๋ฌธ์ ๊ฐ๋์ง ์๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค (์ : %envVar:old=new%
์ ๊ฐ์ ๋ณ์ ๊ฐ ๋์ฒด๋ ์ง์๋์ง ์์, ^
์ด์ค์ผ์ดํ ๋ฌธ์๊ฐ ์๋๋ฉฐ --%
์ _single_ ๋ช
๋ น์ผ๋ก ์ ํ๋ฉ๋๋ค.- cmd.exe
์ ๋ฆฌ๋๋ ์
๋ฐ ์ ์ด ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์ฆ, --%
๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค
๋ฐ๋ผ์ --$
-๊ตฌํ ๋ ๊ฒฝ์ฐ-๋ Unix _counterpart_ ~ --%
์
๋๋ค.
์ด์จ๋ ์ต์ํ about_Parsing
๋์๋ง ํญ๋ชฉ ์ --%
๊ฐ ๋ช ๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ์ธ๋ชจ๊ฐ ์๋ค๋ ๋์ ๋๋ ๊ฒฝ๊ณ ๋ฅผ๋ฐ์ ์๊ฒฉ์ด ์์ต๋๋ค .
@iSazonov ํน์ ์๋๋ฆฌ์ค๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด Start-Native
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ ์ ์์ง๋ง ๊ธฐ๋ณธ exe๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์์ฐ์ค๋ฝ๊ณ ์์ธก ๊ฐ๋ฅํ๋๋ก PowerShell์ ๊ฐ์ ํด์ผํฉ๋๋ค.
@ PowerShell / powershell-committee๋์ด ๋ด์ฉ์ ๊ฒํ ํ์ผ๋ฉฐ --%
์ ์ธ์๋ฅผ ๊ด๋ จ ํ๋ซํผ์์์ ๊ฐ์ด ์ฒ๋ฆฌํด์ผํ๋ค๋ ๋ฐ ๋์ํ์ต๋๋ค. ์ฆ, Windows์ Linux์์๋ ๋ค๋ฅด๊ฒ ๋์ํ์ง๋ง Windows์์๋ ์ผ๊ด๋๊ณ Linux์์๋ ์ผ๊ด๋ฉ๋๋ค. ์๋ก์ด์๊ธธ์ ๋์
ํ๋ ๊ฒ์ ์ฌ์ฉ์์๊ฒ ๋ ํผ๋ ์ค๋ฌ์ธ ๊ฒ์
๋๋ค. ์ด๋ฅผ ํ์ฑํํ๋ ๋ฐฉ๋ฒ์ ์์ง๋์ด์๊ฒ ๋งก๊ธฐ๊ฒ ์ต๋๋ค.
ํฌ๋ก์ค ํ๋ซํผ ์คํฌ๋ฆฝํธ๋ ์ด๋ฌํ ๋์์ ์ฐจ์ด๋ฅผ ์ธ์ํด์ผํ์ง๋ง ์ฌ์ฉ์๊ฐ ์ด๊ฒ์ ์น ๊ฒ ๊ฐ์ง๋ ์์ต๋๋ค. ์ฌ์ฉ์ ํผ๋๋ฐฑ์ด ๋ ๋ง์ ํ๋ซํผ ๊ฐ ์ฌ์ฉ์ผ๋ก ์ธํด ํ์ํ๋ค๋ ์๊ฒฌ์ด๋ผ๋ฉด ์๋ก์ด์๊ธธ์ ๋ค์ ์๊ฐ ํ ์ ์์ต๋๋ค.
๋ ๋ฒ์งธ๋ก ๋๋ ripgrep์ ์ฌ์ฉํ ๋ ์ด๋ฌํ ๋ค์ดํฐ๋ธ vs cmdlet ๋ฌธ์์ด ์ธ์ ๊ตฌ๋ฌธ ๋ถ์ ์ฐจ์ด์
๋ค์์ powershell ํธ์ถ์ ๊ฒฐ๊ณผ์ ๋๋ค (echo.exe๋ "C : Program FilesGitusrbinecho.exe"์์ ๊ฐ์ ธ์ด).
์ด์ ์ด "
ํด์ผํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
> echo.exe '"test'
test
ํ์ง๋ง์ด ๊ธฐ์ดํจ์ ๋๋ฅผ ๋์ด์ ๋ค ...
echo.exe '^\+.+;'
^\+.+;
echo.exe '^\+.*;'
^+.*;
๋ ๋ฒ์งธ ๊ฒฝ์ฐ์๋ \
๋ฅผ ๊ธฐ๋ณธ ๋ช
๋ น์ ์ ๋ฌํ๊ธฐ ์ํด \
๋ฅผ ๋ ๋ฒ ๋ฃ์ด์ผํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ๊ฒฝ์ฐ์๋ ํ ํ์๊ฐ ์์ต๋๋ค ๐
๋๋ ์ด๊ฒ์ด์ด ๋์์ ๋ณ๊ฒฝํ๋ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด๋ฏ๋ก cmlet๊ณผ ๊ธฐ๋ณธ ๋ช ๋ น ์ฌ์ด์ ์ฐจ์ด๊ฐ ์๋ค๋ ๊ฒ์ ์ดํดํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ์ด์ ๊ฐ์ ๊ธฐ์ด ํ ์ ์ด ์ฌ๋๋ค์ด powershell์ ๊ธฐ๋ณธ ์ ธ๋ก ์ฌ์ฉํ์ง ๋ชปํ๊ฒํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@mpawelski ๋ฐฉ๊ธ git 2.20.1.vfs.1.1.102.gdb3f8ae๋ฅผ ์ฌ์ฉํ์ฌ Windows ์์์์ ์ด๊ฒ์ ์๋ํ์ง๋ง 6.2-RC.1์์๋ ์ฌํ๋์ง ์์ต๋๋ค. ์ฌ๋ฌ ๋ฒ ์คํํ๋๋ฐ ์ง์์ ์ผ๋ก ^\+.+;
์์ฝ
@ SteveL-MSFT, @mpawelski๊ฐ ์ค์๋ก ๋์ผํ ๋ช
๋ น์ ๋ ๋ฒ ์ง์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด '^\"+.*;'
๋ฅผ ์ ๋ฌํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.- \"
๋ถ๋ถ์ ์ ์ํ์ญ์์ค. , ๋ฐ๋ผ์ ์ธ๋ถ ๋์ ํ๋ก๊ทธ๋จ์ ^\"+.*;
๋ฅผ ์ธ์ ๊ฐ์ผ๋ก ๊ฐ์ฃผํฉ๋๋ค.
# Note how the "\" char. is eaten.
PS> bash -c 'printf %s "$1"' - '^\"+.*;'
^"+.*;
#"# Running the very same command from Bash does NOT exhibit the problem:
$ bash -c 'printf %s "$1"' - '^\"+.*;'
^\"+.*;
-%๋ ๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ค๋ฉด ๊ธฐ์กด cmd.exe ๋ช ๋ น ์ค์์๋ ๊ทธ๋๋ก ์ฌ์ฌ์ฉ ํ ์ ์๋๋กํ์ต๋๋ค.
๊ทธ๊ฒ์ ์ ๋ต์ด ์๋๋๋ค. --%
๋ ๋ง์ Windows ๋ช
๋ น ์ค ์ ํธ๋ฆฌํฐ๊ฐ ์ ํธ๋ฆฌํฐ ํธ์ถ์ ์์ ํ ๋ฐฉํดํ๋ PowerShell์ ์ํด ํด์๋๋ ์ธ์๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋์
๋์์ต๋๋ค. ์ข์ํ๋ ๊ธฐ๋ณธ ์ ํธ๋ฆฌํฐ๋ฅผ ๋ ์ด์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ค๋ฉด ์ฌ๋๋ค์ ๋นจ๋ฆฌ ์ฌ๋ก ์ก์ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ก ์ธํด ์ ๋๋ก ์๋ํ์ง ์๋ SO ๋ฐ ๊ธฐํ RE ๋ค์ดํฐ๋ธ exe ๋ช
๋ น์ ๋ํ ์ง๋ฌธ์ ๋ตํ ๋๋ง๋ค 1/4์ด ์๋ค๋ฉด Qoba์์ ๊ฐ์กฑ๊ณผ ํจ๊ป ์ ๋
์์ฌ๋ฅผ ํ ์์์ ๊ฒ์
๋๋ค. :-) ์๋ฅผ ๋ค์ด, tf.exe
๋ ์์
๊ณต๊ฐ ์ง์ ์ ์ผ๋ถ๋ก ;
๋ฅผ ํ์ฉํฉ๋๋ค. Git์ {}
๋ฐ @~1
๋ฑ์ ํ์ฉํฉ๋๋ค.
--%
๋ PowerShell์ ๋ช
๋ น ์ค์ ๋๋จธ์ง ๋ถ๋ถ์ ๊ตฌ๋ฌธ ๋ถ์ํ์ง ์๋๋ก ์ง์ํ๊ธฐ ์ํด ์ถ๊ฐ๋์์ต๋๋ค. "์๋ ๊ทธ๋๋ก"๊ธฐ๋ณธ exe๋ก ๋ณด๋ด๊ธฐ ๋งํ๋ฉด๋ฉ๋๋ค. ํ ๋ฒ๋ง ๋ฌธ์ง๋ฌ cmd env var ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ณ์๋ฅผ ํ์ฉํ์ญ์์ค. ์ฝ๊ฐ ๋ชป ์๊ฒผ์ง ๋ง Windows์์๋ ์ ๋ง ์ ์ฉํฉ๋๋ค.
RE๋ฅผ cmdlet์ผ๋ก ๋ง๋ค์์ง ๋ง ์ด๋ป๊ฒ ์๋ํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. --%
๋ ํ์์๊ฒ EOL๊น์ง ํ์ฑ์ ๋ฉ์ฒญํ๊ฒํ๋ ์ ํธ์
๋๋ค ..
์์งํ ๋งํด์, PowerShell๊ณผ ํนํ์ด ๊ธฐ๋ฅ์ ์ค๋ ์ฌ์ฉ์๋ก์ ๋ค๋ฅธ ํ๋ซํผ์์ ๋์ผํ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ EOL๊น์ง ๊ตฌ๋ฌธ ๋ถ์์ ๊ฐ๋จํ ์๋ฏธํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ค ํํ์ ๋ณ์ ๋์ฒด๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ฝ๊ฐ ๋ชป ์๊ฒผ์ง ๋ง macOS / Linux์์๋ % envvar %๋ฅผ ์ฌ์ฉํ์ฌ ํด๋นํ๋ env var์ ๊ฐ์ผ๋ก ๋์ฒด ํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ํ๋ซํผ๊ฐ์ ์ด์ ํ ์ ์์ต๋๋ค.
๋ฌธ์ ๋์ด ์์ ์ ์ํํ์ง ์์ผ๋ฉด ์กฐ๊ฑด๋ถ ์ฝ๋๋ก ๋๋ฉ๋๋ค-์ ํํ ๋ด๊ฐ ํด๋์ฉ์ด๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ์ด ์๋๋๋ค.
$env:Index = 1
if ($IsWindows) {
git show --% @~%Index%
}
else {
git show --$ @~$Index
}
๋ชจ๋ ํ๋ซํผ์์์ด ์์ ์ ์ ํธํฉ๋๋ค.
$env:Index = 1
git show --% @~%Index%
Windows์ ๋์์ ํธํ์ฑ ๋๋ฌธ์ ๊ทธ๋๋ก ์ ์ง๋์ด์ผํฉ๋๋ค.
๋ฟก๋ฟก
๊ทธ๊ฒ์ ์ ๋ต์ด ์๋๋๋ค.
์ ๊ฑฐ ๊ณผ์ ์์ Windows ์ธ๊ณ์์ PowerShell ์ด์ ์ ๋ช
๋ น ์ค์ cmd.exe
- ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ด
--%
ํ์ฅ cmd.exe
-style %...%
ํ๊ฒฝ ๋ณ์ ์ฐธ์กฐ (์ : %USERNAME%
(์
ธ ๋ฐ ํน์ ๋
ผ๋ฆฌ๊ฐ ๊ด๋ จ๋์ง ์์ ๊ฒฝ์ฐ ์ด๋ฌํ ํ ํฐ์ด ์ ๋ฌ๋จ) _verbatim_)
PowerShell์ ์ ์์ ์ง์ (์ํ๋ ๊ฒฝ์ฐ, ๊ฐ์กฐ ์ถ๊ฐ๋จ) :
์น์ Cmd.exe ์ฉ์ผ๋ก ์์ฑ๋ ๋ช ๋ น ์ค๋ก ๊ฐ๋ ์ฐจ ์์ต๋๋ค. ์ด๋ฌํ ๋ช ๋ น ์ค์ PowerShell์์ ์์ฃผ ์๋ํ์ง๋ง ์ธ๋ฏธ์ฝ๋ก (;), ๋ฌ๋ฌ ๊ธฐํธ ($) ๋๋ ์ค๊ดํธ์ ๊ฐ์ ํน์ ๋ฌธ์๋ฅผ ํฌํจํ๋ ๊ฒฝ์ฐ์๋ ์ฝ๊ฐ์ ๋ฐ์ดํ๋ฅผ ์ถ๊ฐํ์ฌ ๋ณ๊ฒฝํด์ผํฉ๋๋ค. ์ด๊ฒ์ ๋ง์ ์ฌ์ํ ๋ํต์ ์์ธ ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
์ด ์๋๋ฆฌ์ค๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ช ๋ น ์ค ๊ตฌ๋ฌธ ๋ถ์์ "์ด์ค์ผ์ดํ"ํ๋ ์๋ก์ด ๋ฐฉ๋ฒ์ ์ถ๊ฐํ์ต๋๋ค. ๋งค์ง ๋งค๊ฐ ๋ณ์-%๋ฅผ ์ฌ์ฉํ๋ฉด ๋ช ๋ น ์ค์ ์ผ๋ฐ์ ์ธ ๊ตฌ๋ฌธ ๋ถ์์ ์ค์งํ๊ณ ํจ์ฌ ๋ ๊ฐ๋จํ ๊ฒ์ผ๋ก ์ ํํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ฐ์ดํ์ ์ผ์นํ์ง ์์ต๋๋ค. ์ธ๋ฏธ์ฝ๋ก ์์ ๋ฉ์ถ์ง ์์ต๋๋ค. PowerShell ๋ณ์๋ ํ์ฅํ์ง ์์ต๋๋ค. Cmd.exe ๊ตฌ๋ฌธ (์ : % TEMP %)์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํ๊ฒฝ ๋ณ์๋ฅผ ํ์ฅํฉ๋๋ค. ๊ทธ ์ธ์๋ ์ค์ ๋ (๋๋ ํ์ดํ ์ธ ๊ฒฝ์ฐ ํ์ดํ)๊น์ง ์ธ์๊ฐ ๊ทธ๋๋ก ์ ๋ฌ๋ฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์ _Unix_ ์ธ๊ณ์ ์ ํฉํ์ง ์์ต๋๋ค (์์์ ์์ฝ).
*.txt
์ ๊ฐ์ด ์ธ์ฉ๋์ง ์์ ์ธ์์ ๊ธ ๋ก๋น์ ์๋ํ์ง ์์ต๋๋ค.
์ ๋์ค ์ธ๊ณ์ ์ ํต์ ์ธ (POSIX ์ ์ฌ) ์์ ํ๊ฒฝ ๋ณ์๋ฅผ ์ฐธ์กฐํ๊ธฐ ์ํด %...%
๋ฅผ ์ฌ์ฉํ์ง _ ์์ต๋๋ค _. $...
๊ตฌ๋ฌธ์ด ํ์ํฉ๋๋ค.
(๋คํํ) Unix ์ธ๊ณ์๋ _raw_ ๋ช ๋ น ์ค์ด ์์ต๋๋ค. ๋ชจ๋ ์ธ๋ถ ์คํ ํ์ผ์ _literals_์ _array_๋ฅผ ์ ๋ฌํด์ผํ๋ฏ๋ก ๋ช ๋ น ์ค์ ๋จผ์ ์ธ์๋ก ๊ตฌ๋ฌธ ๋ถ์ํด์ผํ๋ ๊ฒ์ ์ฌ์ ํ โโPowerShell ๋๋ CoreFx์ ๋๋ค.
Unix ์ธ๊ณ์ ๊ธฐ์กด (POSIX ์ ์ฌ) ์์ --%
์ธ์ํ์ง ๋ชปํ๋ '...'
(์์ ๋ฐ์ดํ) ๋ฌธ์์ด์ ํ์ฉํฉ๋๋ค. # 10831์ ์ฐธ์กฐํ์ญ์์ค.
๊ทธ๋ฌ๋ Windows ์ธ๊ณ์์๋ --%
์๋ ์ฌ๊ฐํ๊ณ ๋ถ๋ช
ํ์ง ์์ ์ ํ์ด ์์ต๋๋ค .
--%
๋ฅผ ์ฌ์ฉํ๋ฉด ๋ช
๋ น ์ค์์ PowerShell ๋ณ์๋ฅผ ์ง์ ์ฐธ์กฐ ํ ์ ์์ต๋๋ค. ์ ์ผํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ _environment_ ๋ณ์๋ฅผ ์์๋ก ์ ์ํ๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฐ ๋ค์ %...%
๋ก ์ฐธ์กฐํด์ผํฉ๋๋ค.(...)
-๋ซ๋ )
๋ ๋ช
๋ น ์ค์ ๋ฆฌํฐ๋ด ๋ถ๋ถ์ผ๋ก ํด์๋๋ฏ๋ก ๋ช
๋ น ์ค์ (...)
๋ฌถ์ ์ ์์ต๋๋ค.;
๋ฐ ๋ค๋ฅธ ๋ฌธ์ผ๋ก ๋ช
๋ น ์ค์ ๋ฐ๋ผ๊ฐ ์ ์์ต๋๋ค. ;
๋ ๋ช
๋ น ์ค์ ๋ฆฌํฐ๋ด ๋ถ๋ถ์ผ๋ก ํด์๋๊ธฐ ๋๋ฌธ์
๋๋ค.}
๋ซ๊ธฐ๋ ๋ช
๋ น ์ค์ ๋ฆฌํฐ๋ด ๋ถ๋ถ์ผ๋ก ํด์๋๊ธฐ ๋๋ฌธ์ ํ ์ค ์คํฌ๋ฆฝํธ ๋ธ๋ก ๋ด์์ --%
์ฌ์ฉํ ์ ์์ต๋๋ค.cmd --% /c ... > file
๋ฅผ ์ฌ์ฉํ์ฌ cmd.exe
์์ ๋ฆฌ๋๋ ์
์ ์ฒ๋ฆฌํ๋๋ก ํ ์ ์์ต๋๋ค.`
) ๋๋ cmd.exe ( ^
) ๋ชจ๋ _literals_๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.--%
๋ ์ค ๋๊น์ง ๋ง (์ต๋) ํ์ฑํฉ๋๋ค.๋คํํ๋ ์ฐ๋ฆฌ๋ ์ด๋ฏธ ํฌ๋ก์ค ํ๋ซํผ ๊ตฌ๋ฌธ์ ๊ฐ์ง๊ณ ์์ต๋๋ค : _PowerShell์ ์์ฒด ๊ตฌ๋ฌธ _.
์,์ด๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด _PowerShell_์ด ๋ฉํ ๋ฌธ์๋ฅผ ๊ณ ๋ คํ๋ ๊ฒ์ด ๋ฌด์์ธ์ง ์์์ผํฉ๋๋ค. ์ด๋ cmd.exe
๋ฐ Bash์ ๊ฐ์ POSIX ์ ์ฌ ์์ด ๋ฉํ ๋ฌธ์๋ฅผ ๊ณ ๋ คํ๋ ๊ฒ ๋ชจ๋์ _superset_์
๋๋ค. ๋ถ๊ฐ์ง๋ก ์ ์ธ ๋ช
๋ น ์ค ๊ฒฝํ.
๊ทธ๋ ๋ค๋ฉด PowerShell์ด "
๋ฌธ์์ ์ธ์ฉ์ ๋๋ฌด ์๋ชป ์ฒ๋ฆฌํ๋ ๊ฒ์ ์ผ๋ง๋ ์ํ๊น์ด ์ด๋ฉฐ์ด ๋ฌธ์ ๋ฌธ์ ์ ์์ฝ๋์ด ์์ต๋๋ค.
@rkeithhill , ์ ๋ ์ฝ๊ฐ์ ์ ์ ์ ์์ํ์ต๋๋ค. ๋ซ์ ๋ณด๊ฒ ์ต๋๋ค.
--%
์ค์ ๋ก ์ด๋ฏธ _is_ PowerShell Core 6.2.0๋ถํฐ ๊ตฌํ๋์์ต๋๋ค. ์ :
/bin/echo --% %HOME%
ํ๊ฒฝ ๋ณ์์ ๊ฐ์ ์ธ์ํฉ๋๋ค HOME
; ๋์กฐ์ ์ผ๋ก
/bin/ls --% *.txt
๋ *.txt
๊ฐ ๋ฆฌํฐ๋ด๋ก ์ ๋ฌ๋๊ธฐ ๋๋ฌธ์ ์์๋๋ก ์๋ํ์ง ์์ต๋๋ค.
๊ถ๊ทน์ ์ผ๋ก --%
์ฌ์ฉํ์ง ์์ ๋, ์ฐ๋ฆฌ๋ ์ฌ์ฉ์๊ฐ _ ๋ฐฐํ์์ ๊ตฌ์ฑ๋๋ ๋ช
๋ น ์ค / ์ธ์ ๋ฐฐ์ด์ด ๊ถ๊ทน์ ์ผ๋ก _ ์ด๋ป๊ฒ ๋ณด์ด๋์ง ์ง๋จํ๋๋ก ๋์์ผํฉ๋๋ค (์ด๋ ์ฐ๋ฆฌ๋ฅผ ์ ์ ๊น์ # 1761๋ก ๋๋๋ฆฝ๋๋ค).
echoArgs.exe
๊ฐ ๋ฐ๋ก ๊ทธ ์ญํ ์ํ๋ฉฐ, ์ฐ๊ฒฐ๋ ๋ฌธ์ ์์ ์ด๋ฌํ ๊ธฐ๋ฅ์ด PowerShell ์์ฒด์ ์ผ๋ถ๊ฐ๋๋๋ก ํ๋ช
ํ๊ฒ ํธ์ถํ์ต๋๋ค.๋ง์ง๋ง์ผ๋ก, PowerShell์ ์์ฒด ๊ตฌ๋ฌธ์ ๋ณธ์ง์ ์ผ๋ก ์ด์ ๊ฐ๋ฅํ ๊ตฌ๋ฌธ์ผ๋ก ์ฌ์ฉํ์ฌ ์ด์ ์ฃผ์ฅ์ ์์ ์ ์ ์ฉํ๋ ค๋ฉด ๋ค์์ ์ํํ์ญ์์ค.
# Works cross-platform, uses PowerShell syntax
# Note: No need for an aux. *environment* variable (which should be cleaned up afterward)
$Index = 1
git show "@~$Index"
# Alternative, quoting just the '@'
git show `@~$Index
์, ํ ํฐ ์ด๋์
@
๋ ์ธ์ฉํด์ผํ๋ ๋ฉํ ๋ฌธ์๋ผ๋ ๊ฒ์ ์์์ผํ์ง๋ง PowerShell์ด โโ๋ ๋๋ฆฌ ์ฌ์ฉ๋จ์ ๋ฐ๋ผ ์ด๋ฌํ ์๊ตฌ ์ฌํญ์ ๋ํ ์ธ์๋ ๋ ๋๋ฆฌ ํผ์ ธ ์ผํฉ๋๋ค.
์ฐธ๊ณ ๋ก,์ด ๋ฌธ์ ๋ Windows ๋ฐ Unix ๊ณ์ด์์ ๊ฑฐ์ ๋์ผํฉ๋๋ค. Unix SDProcess์ CoreFx ๊ตฌํ์๋ ParseArgumentsIntoList
๋ผ๋ ๊ฒ์ด ์์ต๋๋ค. CommandLineToArgvW
_setargv
์ค์์น์์ด ๊ฑฐ์ ์ ํํ๊ฒ ๊ตฌํ๋ฉ๋๋ค (๊ทธ๋ฆฌ๊ณ ๋ฌธ์ํ๋์ง ์์ ""
๋ ๋ฐ์ดํ๋ก ๋ฌถ์ โ "
๊ธฐ๋ฅ). ์ ๋์ค๋ ํ์ฌ์ ํํ์์ Windows์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊นจ์ง๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ์ ์ธ ๊ณ ํต์ ํฌ์ธํธ๊ฐ๋์ด์๋ ์๋ฉ๋๋ค.
_setargv
๋ ๊ฒฐ๊ตญ ๋ชจ๋ ํ๋ก๊ทธ๋จ์ด ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ฉฐ CRT ๋ฒ์ ๊ฐ์ ๋์ ๋ณํ์ ์ํฅ์ ๋ฐ๊ธฐ ๋๋ฌธ์ ๊ณ ๋ คํ ๊ฐ์น๊ฐ ์์ ๊ฒ์
๋๋ค. ์ฐ๋ฆฌ๊ฐ ํ ์ ์๊ณ ํด์ผ ํ ์ต์ ์ ๋ชจ๋ ๊ฒ์ ํฐ ๋ฐ์ดํ๋ก ๋ฌถ๊ณ ๋ฉ์ง ๋ฐฑ ์ฌ๋ผ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์
๋๋ค. ๊ทธ๊ฒ ์ ๋ถ์
๋๋ค.
์ธ์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ๋ฌธ ๋ถ์๋์ง ์๋ ๋ ๋ค๋ฅธ ์ :
az "myargs&b"
์ด ๊ฒฝ์ฐ az๋ myargs
๊ฐ์ ธ์ค๊ณ b
์ ๋ช
๋ น์ผ๋ก ์คํํ๋ ค๊ณ ํฉ๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ : az-% "myargs & b"
@ SteveL-MSFT, ํ์ ๊ธฐ๋ฅ์ธ ์ปฌ๋ ์
๊ธฐ๋ฐ ProcessStartInfo.ArgumentList
์์ฑ์ด .NET Core 2.1 ์ดํ๋ก ์ ๊ณต๋์์ผ๋ฏ๋ก Waiting - DotNetCore
๋ ์ด๋ธ์ ์ ๊ฑฐ ํ ์ ์์ต๋๋ค.
@TSlivede ๋ ์๋ก์ด ๋ฐฉ๋ฒ์ ์๊ณ ์์ผ๋ฉฐ์ด๋ฅผ ์ฌ์ฉํ ๊ณํ์ด์ง๋ง ๊ด๋ จ RFC ์ธ https://github.com/PowerShell/PowerShell-RFC/pull/90 ์ ์ํ๊น๊ฒ๋ ๋ ๋น ์ง๊ณ ์์ต๋๋ค.
_ ๊ตฌํ _ ํ ๋ก ์ ๊ณ์ํ ๊ฒ์ ์ ์ํฉ๋๋ค.
๊ทธ๋ฌ๋ RFC ํ ๋ก ์์ @joeyaiello ๋ ๋ณ๊ฒฝ ์ฌํญ์ ์คํ์ ๊ธฐ๋ฅ์ผ๋ก ๋ง๋๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ์ง๋ง ๊ธฐ์กด ์ฝ๋๋ฅผ ํฌ๊ฒ ๊นจ๋จ๋ฆฌ์ง ์๊ณ ๋ ์ธ์ฉ ๋์์ ์์ ํ ์ ์๋ค๋ ๊ฒ์ด ์ ์ ๋ถ๋ช ํด์ง๊ณ ์์ต๋๋ค.
_ ์ผ์ํด์ผํ๋ ๋ชจ๋ ์ฌ๋ :
foo.exe ""
ํ์ฌ _no_ ์ธ์ ์ ๋ฌ)foo.exe '{ "foo": "bar" }'
๊ฐ ๋ถ์ ์ ํ๊ฒ ์ด์ค์ผ์ดํ ์ฒ๋ฆฌ ๋ ๊ฒ์ผ๋ก ์ ๋ฌ๋จ "{ "foo": "bar" }"
)msiexec
์ ๊ฐ์ ํน์ CLI์ ๋จ์ ์ _ ์ ์ฒด์ ์ผ๋ก _ ํฐ ๋ฐ์ดํ๋ก ๋ฌถ์ฌ ์์ต๋๋ค ( foo.exe foo="bar none"
๋ "foo=bar none"
๋ก ์ ๋ฌ๋จ).msiexec
์ด๋ฉฐ ์ ์ ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์ ์ฉ๋ ๊ฒฝ์ฐ ํ์ํ foo="bar none"
๊ฒฌ์ ์์์ ์ ๋ฌํ๋ฉด --%
ํฉ๋๋ค.์ ์ ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์ ์ฉ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด _break_๋๋ฏ๋ก ๋ฌธ์ ๊ฐ ๋ ๊ฒ์ ๋๋ค.
๋ฐ๋ผ์ ์ถ๊ฐ ์ง๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ต์ํ _opt-in_ ๊ธฐ๋ฅ์ผ๋ก ์ฌ๋ฐ๋ฅธ ๋์์ ์ฌ์ฉํ๋ ค๋ฉด ์ด๋ป๊ฒํด์ผํฉ๋๊น?
Start-Process
๋ก ๊นจ์ง ์ธ์ฉ๋ฌธ์ ๊ฒฝ์ฐ, ์ฐ๋ฆฌ๋ ์ ์ด๋ ์ฌ๋ฐ๋ฅธ ๋์์์ํ ์๋ก์ด ๋งค๊ฐ ๋ณ์๋ฅผ ๋์
ํ ์์๋ ์ต์
์ด --%
).์ด๋ฌํ ๋ฉ์ปค๋์ฆ์ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ๋ ์ผ๋ฐ์ ์ผ๋ก ๊ธฐ๋ณธ ์ค์ ๋ณ์์ ์ํด ๋ฐ์ํ์ง๋ง ์ ์ ๋ ์ฆ๊ฐํ๋ using
๋ฌธ์ ์ํด ๋ฐ์ํฉ๋๋ค. PowerShell์ ๋์ ๋ฒ์ ์ง์ ์
๋๋ค. ์ฆ, ์ตํธ ์ธ ๋์์ ๊ธฐ๋ณธ์ ์ผ๋ก _from_ one์ ์ตํธ ์ธ ์ฝ๋๋ผ๋ ์ฝ๋์๋ ์ ์ฉ๋๋ฏ๋ก ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์๋ง๋ _lexical_ ๊ธฐ๋ฅ ๋ฒ์ ์ง์ , @lzybkr์ด ์์ฑํ-๋๋ฑํ๊ฒ ์ ์ฝํด์ง- ์ดํ ์๊ฒฉ ๋ชจ๋ RFC ์์ ์ดํ ๋ฒ์๊ฐ ์ง์ ๋ using strict
์ ์์ ์ผ๋ฐํ๋ฅผ ์ผ๋ฐ์ ์ผ๋ก ๋์
ํ ๋์
๋๋ค.
์ดํ ๋ฒ์ using preference ProperArgumentQuoting
์ ๊ฐ์ ๊ฒ? (๋ช
๋ฐฑํ๊ฒ ํ์ ๊ฐ๋ฅํ ์ด๋ฆ์ด์ง๋ง ํ๋๋ฅผ ์ฐพ๊ธฐ ์ํด ๊ณ ๊ตฐ๋ถํฌํ๊ณ ์์ต๋๋ค.)
์ด๋ฌํ ๋ชจ๋ ์ฃผ์ ์ฌํญ๊ณผ ์ด๊ฒ์ด ์ง์ ํธ์ถ์ ๋ฌธ์ ์ด๊ธฐ๋ํ๋ฏ๋ก ๋จ์ํ ์ ๋งค๊ฐ ๋ณ์๋ฅผ ์ถ๊ฐ ํ ์ ์๋ค๋ ์ ์ ๊ฐ์ํ ๋, ์ ๋ ์ด์ ๋์์ ๊นจ๋ ๊ฒ์ ๊ฐ๋ ฅํ ์ฐฌ์ฑํฉ๋๋ค.
์, ์๋ง ๋ง์ด ๊นจ์ง ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ค์ ๋ก๋ ์ฒ์๋ถํฐ ์์ ํ ๊นจ ์ก๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋๋ _ ์ค์ ๋ก ์๋ํ๋ _ ๊ธฐ๋ฅ์ ๊ฐ๋ ๊ฒ๋ณด๋ค ๊ณ ์ฅ๋ ํ๋์ ๋ํ ์์ฒญ๋ ์์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ ์งํ๋ ๊ฒ์ ์ฐ์ ์ํ๋ ๊ฒ์ด ํนํ ํ๋นํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์๋ก์ด ๋ฉ์ด์ ๋ฒ์ ์ผ๋ก์ ์ ๋ v7์ด์ด ์ํฉ์ ๊ฝค ์ค๋ซ๋์ ์ ์ ํ๊ฒ ์์ ํ ์์๋ ์ ์ผํ ๊ธฐํ๋ผ๊ณ ์๊ฐํ๋ฉฐ ๊ธฐํ๋ฅผ ๊ฐ์ ธ์ผํฉ๋๋ค. ์ฌ์ฉ์์๊ฒ ์๋ฆฌ๋ฉด ์ ํ์ด ์ ๋ฐ์ ์ผ๋ก ์ ๋๋ก ์ด๋ฃจ์ด์ง์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ธ๋ ์ดํน ์ฒด์ธ์ง๊ฐ ๋ถ๊ฐํผํ๋ค๊ณ ๋๋๋ค๋ฉด ๋ํ ํ ์ธ์ ์์ ์ฝ๊ฒ ์ธ์ ํ ์ ์์ด์ผํ๊ณ ๋ชจ๋ ํ๋ซํผ์์ ๋ ์ ์๋ํ๋ ์คํฌ๋ฆฝํธ ๋ฒ์ ์ ๊ฐ์ง ์ ์๋ค๋ ์ ์ ๊ณ ๋ คํ์ฌ ์ด์์ ์ธ ์๋ฃจ์ ์ ์ค๊ณํด์ผํฉ๋๋ค.
๋์ ํจ, @ vexx32 : ๊ธฐ๋ณธ์ ์ผ๋ก ๋ง ๊ธฐ์กด ๋์์ ์ ์งํ๋ ๊ฒ์
์ธ๋ถ ํ๋ก๊ทธ๋จ์ ์ธ์๋ฅผ ์์ ์ ์ผ๋ก ์ ๋ฌํ์ง ์๋ ์์ ํต์ฌ ๋ช ๋ น ์ค ํ๋์ ์คํจํฉ๋๋ค.
๋น์ ์ ํ์คํ ๋ธ๋ ์ดํน ์ฒด์ธ์ง์ ๋ํด _my_ ํฌํ๊ถ์ ๊ฐ์ง๊ณ ์์ง๋ง, ํนํ v7์ด ์ฅ๊ธฐ WinPS ์ฌ์ฉ์๊ฐ PSCore๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ ์ ์๋ค๊ณ ์ ์ ๋๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋ค๋ฅด๊ฒ ๋๋ผ๊ฒ ๋ ๊ฒ์ด ๋๋ ต์ต๋๋ค.
@iSazonov : https://github.com/PowerShell/PowerShell-RFC/pull/90 ์ ์ฌ๋ฐ๋ฅธ ์๋ฃจ์ ์ ์ค๋ช ํฉ๋๋ค.
๊ทธ ์ ์ ์ ์์ฝํ๋ ค๋ฉด :
PowerShell์ ์ ธ๋ก์ _its_ ๊ท์น์ ๋ฐ๋ผ ์ธ์๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ ํ ๋ค์ ๊ฒฐ๊ณผ๋ก ํ์ฅ ๋ ์ธ์ ๊ฐ _verbatim_์ ๋์ ํ๋ก๊ทธ๋จ์ ์ ๋ฌํด์ผํฉ๋๋ค. ์ฌ์ฉ์๋ PowerShell์ด โโ์ด๋ป๊ฒ ์๋ํ๋์ง์ ๋ํด ์๊ฐํ ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ค์ด ๊ฑฑ์ ํด์ผ ํ ๊ฒ์ _PowerShell_ ๊ตฌ๋ฌธ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ป๋ ๊ฒ์ ๋๋ค.
Unix์ ๊ฐ์ ํ๋ซํผ์์ ProcessStartInfo.ArgumentList
๋ ํ์ฅ ๋ ์ธ์ ๊ฐ์ _array_๊ฐ ๋์ ํ๋ก๊ทธ๋จ์ _as-is_๋ก ์ ๋ฌ ๋ ์ ์๋ค๋ ์ ์ ๊ฐ์ํ ๋์ด๋ฅผ ์๋ฒฝํ๊ฒ ๊ตฌํํ ์์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด ์ธ์์์.
Windows์์๋ Windows ๋ช
๋ น ์ค ๊ตฌ๋ฌธ ๋ถ์ ์ธ ProcessStartInfo.ArgumentList
์ฌ์ฉ ํ๋ ์ฃผ๋ฆ ์ az[.cmd]
์ ์ ์๋ฏ์ด CLI ์ง์
์ ์ผ๋ก _batch ํ์ผ _์ด ๋๋ฆฌ ํผ์ ธ ์๊ธฐ ๋๋ฌธ์) --%
์์ต๋๋ค.
PSSA๋ ๋ณ๊ฒฝ ๋ ์ธ์ ํ์์ ์ฌ์ฉํ๋ค๋ ๊ฒฝ๊ณ ๋ฅผ ์ฌ์ฉ์์๊ฒ ๊ฒฝ๊ณ ํ์ฌ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ํํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
์ด ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ค๋ฅธ ์ผ๋ถ ์ ํจ๊ป ์งํํ๋ ค๋ฉด ์ ํ์ ๊ธฐ๋ฅ ๊ณผ ๊ฐ์ ๊ฒ์ ์ฑํํ๋ ๊ฒ์ ๊ณ ๋ คํด์ผํ๋ค๊ณ ์๊ฐ ํฉ๋๋ค .
๊ธฐ์กด ํ๋์ ์ ์งํ๋ ๋ฐ ์ ๋ง ๊ฐ์น๊ฐ ์์ต๋๊น? ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ ์ธ์๋ ๋ง์ ๋๋ค.
๋๋ ์ด๊ฒ์ ์ํด ๋ ๊ฐ์ ์ฝ๋ ๊ฒฝ๋ก๋ฅผ ์ ์งํ๋ ๊ฒ์ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋จ์ง ๊นจ์ง ๊ตฌํ์ ์ ์งํ๋ ๊ฒ์ ๋๋ค. ์๋ํ๋ฉด ์ผ๋ถ ์ค๋๋ ์ฝ๋๋ ๋๋๋ก ๊ทธ๊ฒ์ ํ์๋ก ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋๋ folx๊ฐ ๊ฐ๋์ฉ ๊ทธ๋ค์ ์ฝ๋๋ฅผ ์ ๋ฐ์ดํธ ํ ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํ๋ ๊ฒ์ด ๋ถ๋นํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๐
PS7์ด WinPS์ ๋ ๋ฆฝํ ๋์ฒดํ์ด ๋ ๊ฒ์ผ๋ก ์์ํ๋ค๋ฉด ๋ ๋ฐฐ๋ก ๊ทธ๋ ์ต๋๋ค. v7์ ๋์์ ์ ์งํ ์์๋ ์ ์ผํ ์ด์ ๋ ์ฌ๋๋ค์ด 5.1๊ณผ 7 ๋ชจ๋์์ ๋ช ๋ น์ ์คํํ๋ ๋ฐ ๋์ผํ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๊ธฐ๋ฅผ ๊ธฐ๋ํ๋ ๊ฒฝ์ฐ์ ๋๋ค. PS7์ด 5.1์ ๋์ฒดํ๋ ๊ฒฝ์ฐ๋ ๋งค์ฐ ๋๋ฌธ ๊ฒฝ์ฐ์ ๋๋ค.
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์ฌ์ฉ์๊ฐ ๋ ๊ฐ์ง๋ฅผ ๋ชจ๋ ์ค๋ช ํ๋ ๊ฒ์ ๊ทธ๋ฆฌ ์ด๋ ต์ง ์์ต๋๋ค. ์ค์ ์ธ์ด ๊ตฌ๋ฌธ์ ๋ณ๊ฒฝํ์ง ์๋๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ดํ๋ ๊ฒ์ ๋งค์ฐ ์ฝ์ต๋๋ค.
if ($PSVersionTable.PSVersion.Major -lt 7) {
# use old form
}
else {
# use new form
}
์ฌ์ฉ์์๊ฒ ์ฐจ์ด๋ฅผ ์ธ์ํ๊ฒํ๋ค๋ฉด ์ง๊ธ๊น์ง PS์์ ์ด์ํ ๋ค์ดํฐ๋ธ ์คํ ํ์ผ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๊ณ ํต์ ๋์ด ์ค ์์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๐
@TylerLeonhardt๋ ์ต์ ๊ธฐ๋ฅ์ ๋ํ ๋ ผ์์์ ์ธ๊ธ ํ ๋ฐ์ ๊ฐ์ด - ๊ทธ ์๋จ ์ด์ ๊ฐ ํ์๊ฐ ์ ์ง๋๊ณ ์ํ ํ๋ฌ์ค๋ ์ ์งํ๊ณ ์ต์ ๊ธฐ๋ฅ ํ๋ ์ ์ํฌ๋ฅผ ํ ์คํธ ํ _multiple_ ๋ณ๊ฐ์ ๊ตฌํ์ ์ ์ง ๊ตฌํ. ์ด๊ฒ์ ๋ํ ๊ฐ์น๊ฐ์๋ ๊ฒ ๊ฐ์ง ์์ต๋๋ค, tbh.
@ vexx32 ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ฌ๊ธฐ์ ํฐ ๋ฌธ์ ์ ๋๋ค. ์ด๊ฒ์ ๋ค์ดํฐ๋ธ ์คํ ํ์ผ์ ๋ํ args์ ์ ์ผํ ๋ฌธ์ ๊ฐ ์๋๋๋ค. ๋๋ ๊ทธ๊ฒ๋ค์ ๋ชจ๋ ๋ฒํท ํํ์ฌ ๋ชจ๋ ํ๋์ "์ ํ์ ๊ธฐ๋ฅ"์ผ๋ก ๋ง๋ค๊ณ ์ถ์ต๋๋ค. ์ : https://github.com/PowerShell/PowerShell/issues/1761 ๋ฐ https://github.com/PowerShell/PowerShell/issues/10675. ๊ธฐ๋ณธ ๋ช ๋ น๊ณผ์ "๊ณ ์ "์ํธ ์ด์ฉ์ฑ์ vNext์์ ํด๊ฒฐํ๊ณ ์ถ์ต๋๋ค. ๋ฐ๋ผ์ ๋๊ตฐ๊ฐ๊ฐ์ด ๋ฒ์ฃผ์์ ๊ธฐ์กด ๋๋ ์๋ก์ด ๋ฌธ์ ๋ฅผ ๋ณธ๋ค๋ฉด ๋๋ฅผ ์ฐธ์กฐํ๊ณ ์ ์ ํ๊ฒ ํ๊ทธ ํ ๊ฒ์ ๋๋ค (๋๋ ์ฌ์ฌ ๊ถํ์ด์๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ๋ฌธ์ ์ฒ๋ผ ํ๊ทธ ์ง์ ).
์ ํ์ ๊ธฐ๋ฅ์ ๋ชจ๋์ ๋๋ค :-) ์์ง์ ์ ํ์ ๊ธฐ๋ฅ์ ๊ฐ๋ ๊ฒ์ ์ง์, ํนํ Windows ์ง์์ ๊ฒฝ์ฐ ํฐ ๊ณจ์นซ๊ฑฐ๋ฆฌ์ ๋๋ค. ๋ด๋ถ ์ข ์์ฑ์ ์ค์ด๊ณ ๋ด๋ถ API๋ฅผ ๊ณต์ฉ์ผ๋ก ๋์ฒดํ์ฌ ์์ง์ ๋ชจ๋ํ ํ ์ ์์ต๋๋ค. ๊ทธ ํ ์์ง์์ ์ต์ ๊ธฐ๋ฅ์ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
@iSazonov ์ฐ๋ฆฌ ํ์ด vNext์์ ์ดํด๋ณผ ๊ฒ ์ค ํ๋๋ ์์ง์ ๋ชจ๋ํํ๋ ๊ฒ์ ๋๋ค. :)
์ฌ๊ธฐ์ ์ต์ข ์ฌ์ฉ์์๊ฒ ๊ถ์ฅ๋๋ ์๋ฃจ์ ์ ๋ฌด์์ ๋๊น?
์ด๊ฒ์ ์ธ์์ ์ด์ง๋ง .NET ํ๋ ์ ์ํฌ ์์ฒด์์ ์ฌ๋ฐ๋ฅธ * ArgumentList ์ฒ๋ฆฌ๋ฅผ ์ป๋ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ๋๋ค.
Add-Type -AssemblyName "System"
function startProcess([string] $FileName, [string[]] $ArgumentList) {
$proc = ([System.Diagnostics.Process]::new())
$proc.StartInfo.UseShellExecute = $false
$proc.StartInfo.FileName = $FileName
$proc.StartInfo.CreateNoWindow = $true
foreach ($a in $ArgumentList) { $proc.StartInfo.ArgumentList.Add($a) }
$proc.Start()
return $proc
}
startProcess -FileName 'C:\Program Files\nodejs\node.exe' -ArgumentList '-e','console.log(process.argv.join(''\n''))','--','abc" \" messyString'
๋ฌผ๋ก ์์น ๋งค๊ฐ ๋ณ์์ ์ฝ๊ฐ์ get-command
์์์๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๊ธฐ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ ์ธ์์ ์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค.
* ๋ฉด์ฑ
์กฐํญ : Windows์์ cmdline์ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ์ฌ๋ฐ๋ฅธ ๋จ์ผ ๋ฐฉ๋ฒ์ ์์ต๋๋ค. "์ฌ๋ฐ๋ฅธ"์ด๋ ArgumentList ์ฒ๋ฆฌ, main (string[] args)
์ฒ๋ฆฌ ๋ฐ Unix์ ์ธ๋ถ ์คํฐ ํธ์ถ์ ์ํด ๋ชจ๋ ํ๋ซํผ์์ .NET์ผ๋ก ๊ตฌํ ๋ cmdline์์ argv๋ก ๋ณํํ๋ MSVCRT ์คํ์ผ์ ์๋ฏธํฉ๋๋ค. ์ด ์ํ์ ์ผ๋ฐ์ ์ธ ์ํธ ์ด์ฉ์ฑ์ ๋ณด์ฅํ์ง ์๊ณ ์๋ ๊ทธ๋๋ก ์ ๊ณต๋ฉ๋๋ค. ์ ์ ๋ NodeJS child_process ๋ฌธ์์ "windows ๋ช
๋ น ์ค"์น์
์ ์ฐธ์กฐํ์ญ์์ค.
@ Artoria2e5 ์ ํํ ๋ด๊ฐ ๊ฒฐ๋ก ์ ๋ด ๋ ธ์ต๋๋ค. System.Diagnostics.Process๋ ์ธ๋ถ ์คํ ํ์ผ์ ์คํํ๋ ์ ๋ขฐํ ์์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ด์ง๋ง stdlib ๊ท์น์ผ๋ก ์ธํด ์ธ์ ์ด์ค์ผ์ดํ ์ฒ๋ฆฌ๊ฐ ๊น๋ค๋ก์ธ ์ ์์ต๋๋ค.
2N backslashes + " ==> N backslashes and begin/end quote
2N+1 backslashes + " ==> N backslashes + literal "
N backslashes ==> N backslashes
๊ฒฐ๊ณผ์ ์ผ๋ก ์ธ์๋ฅผ ์ด์ค์ผ์ดํํ๋ ๋ค์ ๋
ผ๋ฆฌ๋ฅผ ์๊ฐํด ๋์ต๋๋ค. ํ๋ก์ธ์ค ์คํ์ ์ํด ์ธ์๋ฅผ ํฐ ๋ฐ์ดํ "
๋ก ๊ฐ ์๋๋ค.
https://github.com/choovick/ps-invoke-externalcommand/blob/master/ExternalCommand/ExternalCommand.psm1#L244
๋ํ ์ธ๋ถ ์คํ ํ์ผ์ด ์คํ๋๋ ๋์ ์ค์๊ฐ์ผ๋ก STDOUT ๋ฐ STDERR์ ์ป๋ ๊ฒ์ด ๊น๋ค๋ก์ธ ์ ์์ผ๋ฏ๋ก์ด ํจํค์ง๋ฅผ ๋ง๋ค์์ต๋๋ค.
https://github.com/choovick/ps-invoke-externalcommand
๋๋ Windows, Linux ๋ฐ Mac์์ ๋ง์ด ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ์ง๊ธ๊น์ง๋ ๋ฌธ์ ์์ด ์ค ๋ฐ๊ฟ ๋ฐ ๊ธฐํ ํน์ ๋ฌธ์๋ก ์ธ์๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค.
GitHubGitHub์์ ๊ณ์ ์ ๋ง๋ค์ด choovick / ps-invoke-externalcommand ๊ฐ๋ฐ์ ๊ธฐ์ฌํ์ธ์.
GitHubGitHub์์ ๊ณ์ ์ ๋ง๋ค์ด choovick / ps-invoke-externalcommand ๊ฐ๋ฐ์ ๊ธฐ์ฌํ์ธ์.
@choovick ์ ์ฒด stdio ๋ฆฌ๋๋ ์ ์ด ํ๋ฅญํฉ๋๋ค!
์ด์ค์ผ์ดํ ๋ถ๋ถ์ ๋ํด์๋ ์ฝ๊ฐ ๋์ํ์ง ์์ต๋๋ค. ArgumentList๋ผ๊ณ ํ๋ ๊ฒ์ด ์ด๋ฏธ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์๋์ ์ธ ์ต๊ทผ (?) ์ถ๊ฐ๋ผ๋ ๊ฒ์ ์ดํดํ๊ณ MS๊ฐ SDProcessStartInfo์ ๋ํ String, String [] ์ด๋์
๋ผ์ด์ ๋ฅผ ๋ฃ๋ ๊ฒ์ ์์ ๊ธฐ ๋๋ฌธ์ ์ค๋ง ์ค๋ฝ์ต๋๋ค. (์ด๋คโฆ .NET ์ธํฐํ์ด์ค ์ ์์์ํ ์ฅ์๊ฐ ์์ต๋๊น?)๊ฐ๋ฒผ์ด ๋ํ
ํด๋น NodeJS ์์ ์ ์ด์ค์ผ์ดํ ํจ์๋ ๋น์ ์ ๊ฒ๊ณผ ์ฝ๊ฐ ๋ค๋ฆ
๋๋ค : ๋ฐ์ดํ๋ก ๋ฌธ์ํ๋์ง ์์ (๊ทธ๋ฌ๋ .NET core ๋ฐ MSVCRT์ ์์) ""
์ด์ค์ผ์ดํ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๊ฒํ๋ฉด ๋ฐฑ ์ฌ๋์ ์ ํ ์์
์ด ๋จ์ํ๋ฉ๋๋ค. ๋๋ ์ฃผ๋ก ๋ชจ๋ ๊ฐ๋ ฅํ cmd์ ์ฌ์ฉ ๋์๊ธฐ ๋๋ฌธ์ \"
๊ฐ ๋๋จธ์ง ๋ฌธ์์ด์ ์ธ์ฉ ํด์ ํด์๋ ์๋๋ค๋ ๊ฒ์ ์ดํดํ์ง ๋ชปํฉ๋๋ค. \^"
๋ก ๊ณ ๊ตฐ๋ถํฌํ๋ ๋์ , ๋๋ ์ฒ์๋ถํฐ ๋น๋ฐ๋ฆฌ์ ์ฌ์ฉ๋์ด ์จ ๋ฌด์ธ๊ฐ๋ก ๋ ๋์์ง ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
@ Artoria2e5 ๋ถํํ๋ ArgumentList๋ Windows์ PowerShell 5.1์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
```๋ ๊ฐ ํํ์์์๋ ๋ฉ์๋๋ฅผ ํธ์ถ ํ ์ ์์ต๋๋ค.
C : Usersyserdevtest.ps1 : 7 char : 37์์
์ฌ์ฉ์ ์ง์ ์ธ์ ์ด์ค์ผ์ดํ ๋
ผ๋ฆฌ ์ดํ ....๊ฐ๋ฒผ์ด ๋ํ
NodeJS์`\ ^ "`์ ๊ดํด์๋ ๋ช ๋ ์ ์ํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค. :) ์ ๋๋ก ์๋ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
System.Diagnostics.Process๋ ์ธ๋ถ ์คํ ํ์ผ์ ์คํํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ๋๋ค.
๋ฌธ์ ๋ PowerShell์ ์ถ๋ ฅ ์คํธ๋ฆผ๊ณผ ํตํฉ๋์ง ์๊ณ ํ์ดํ ๋ผ์ธ์์ ์คํธ๋ฆฌ๋ฐ ๋์์ ์ป์ง ๋ชปํ๋ค๋ ๊ฒ์ ๋๋ค.
๋ค์์ PowerShell์ด โโํธ์ถ์ ์ํํ๋๋กํ๋ ค๋ ๊ฒฝ์ฐ ํ์ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ํ ์์ฝ์ ๋๋ค (ํ์คํ ๋ฐ๋์ง ํจ) .
_embedded_ "
๋ฌธ์๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์๋ฅผ ์ ๋ฌํด์ผํ๋ ๊ฒฝ์ฐ, ๊ฐ๋ฅํ๋ฉด Windows์์ _double_ ๋๋ \
์ด์ค์ผ์ดํ :
Windows์์ _batch files_๋ฅผ ํธ์ถ ํ ๋ ๋์ ํ๋ก๊ทธ๋จ์ด ""
๋ฅผ ์ด์ค์ผ์ดํ ๋ "
์ธ์ํ๋ค๋ ๊ฒ์ ์๊ณ ์๋ ๊ฒฝ์ฐ $arg -replace '"', '""'
""
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ง๋ง (Windows PowerShell ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ณ Node.js ๋ฐ Azure์ ๊ฐ์ _stubs_์ ๊ฐ์ ๋ฐฐ์น ํ์ผ์ ์ฌ์ฉํ๋ CLI์์ ์๋ ํจ) ๋ชจ๋ ์คํ ํ์ผ์ด์ด๋ฅผ ์ง์ํ์ง๋ ์์ต๋๋ค (ํนํ Ruby ๋ฐ Perl).๊ทธ๋ ์ง ์์ผ๋ฉด (ํญ์ Unix์์) $arg -replace '"', '\"'
์ฐธ๊ณ : _Windows PowerShell_์์๋ ๊ฐ์ _spaces_๋ ํฌํจ๋์ด์๋ ๊ฒฝ์ฐ์๋ ํญ์ ์ ๋๋ก ์๋ํ์ง ์์ต๋๋ค. ๊ฐ์ ๋ฆฌํฐ๋ด \"
๊ฐ ์์ผ๋ฉด ์ํฉ์ ๋ฐ๋ผ PowerShell Core์ ๋ฌ๋ฆฌ ํฐ ๋ฐ์ดํ๋ฅผ ๋ฌถ๋ _not_ ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ํํ๊ธฐ ๋๋ฌธ์
๋๋ค. ์ : '3\" of snow'
ํด์ ํต๊ณผ.
๋ํ, ์์ ์ด์ค์ผ์ดํ ์ ์ \
๋ฐ๋ก ์์ "
\
์ธ์คํด์ค๋ฅผ ๋ ๋ฒํด์ผํฉ๋๋ค.
$arg = $arg -replace '(\\+)"', '$1$1"'
_empty_ ์ธ์๋ฅผ ์ ๋ฌํด์ผํ๋ ๊ฒฝ์ฐ '""'
.
'' -eq $arg ? '""' : $arg
(WinPS ๋์ : ($arg, '""')['' -eq $arg]
Windows PowerShell์๋ง ํด๋น๋๋ฉฐ PS Core์์์ด ์์ ์ ์ํํ์ง ๋ง์ญ์์ค (๋ฌธ์ ๊ฐ ์์ ๋ ๊ฒฝ์ฐ).
์ธ์๊ฐ _ ๊ณต๋ฐฑ์ ํฌํจ _ํ๊ณ _ ๋ _ (ํ๋ ์ด์) \
์ด๋ฉด ํํ \
์ธ์คํด์ค๋ฅผ ๋ ๋ฐฐ๋ก ๋๋ฆฝ๋๋ค.
if ($arg -match ' .*?(\\+)$') { $arg = $arg + $Matches[1] }
cmd
/ ๊ณต๋ฐฑ์ด _not_ ์์ง๋ง (๋ฐ๋ผ์ PowerShell์์ ์๋ ํฐ ๋ฐ์ดํ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ _not_) ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐ์น ํ์ผ์ด ํธ์ถ๋๋ ๊ฒฝ์ฐ &|<>^,;
(์ : a&b
), _embedded enclosing double-quoting_์ ์ฌ์ฉํ์ฌ PowerShell์ด โโํฐ ๋ฐ์ดํ ํ ํฐ์ ์ ๋ฌํ๊ณ ๋ฐ๋ผ์ cmd
/ ๋ฐฐ์น ํ์ผ ํธ์ถ์ ์ค๋จํ์ง ์๋๋กํฉ๋๋ค.
$arg = '"' + $arg + '"'
msiexec.exe
์ ๊ฐ์ด ์๋ชป ์๋ํ๋ ์คํ ํ์ผ์ ์ฒ๋ฆฌํด์ผํ๋ ๊ฒฝ์ฐ ์ธ์๋ฅผ ์์ ๋ฐ์ดํ๋ก ๋ฌถ์ผ์ญ์์ค.
'foo="bar none"'
์ธ๊ธํ๋ฏ์ด ์ด๋ฌํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ฉด _break_๋ฉ๋๋ค.
๋ค์์ ๊ฐ๋จํ (๊ณ ๊ธ์ด ์๋) ํจ์ iep
( "์ธ๋ถ ํ๋ก๊ทธ๋จ ํธ์ถ"์ฉ)์
๋๋ค.
msiexec
๋ํ ์๋ ํน์ ์ผ์ด์ค๋ฅผ ํฌํจํ์ฌ ์์์ ์ค๋ช
ํ ๋ชจ๋ ์ด์ค์ผ์ดํ๋ฅผ ์ํํ๊ณ ๋์ ํ๋ก๊ทธ๋จ์ ๋ฐ๋ผ \"
๋ณด๋ค ""
์ด์ค์ผ์ดํ๋ฅผ ์ ํธํฉ๋๋ค.\"
์ด์ค์ผ์ดํ๋ฅผ ์ฌ์ฉํด์ผํ๋ ๊ฒฝ์ฐ ์ค๋จ๋๋ ํฐ ๋ฐ์ดํ๊ฐ ํฌํจ ๋ ์์ธ์ ์ธ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค (์์์ ์ค๋ช
ํ๋๋ก).iepย
๋ฅผ ์ถ๊ฐํ๊ธฐ ๋งํ๋ฉด๋ฉ๋๋ค.$LASTEXITCODE
๋ฅผ ์ค์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ $?
๋ ์ ๋ขฐํ ์ _ ์์ต๋๋ค _.์ฐธ๊ณ :์ด ํจ์๋ ๊ฐ๋ฅํ ํ ๋์ ๋์ง ์๊ฒํ๊ธฐ ์ํด ์๋์ ์ผ๋ก ์ต์ํ (๋งค๊ฐ ๋ณ์ ์ ์ธ ์์, ๋ช
๋ น ์ค ๋์๋ง ์์, ์งง์ (๋ถ๊ท์น) ์ด๋ฆ)์
๋๋ค. ๋ช
๋ น ์ค ์์ iep
๋ฅผ ์ถ๊ฐํ๋ฉด๋ฉ๋๋ค. ์๋ํฉ๋๋ค.
EchoArgs.exe
์ฌ์ฉํ ํธ์ถ ์์ ( choco install echoargs -y
๋ฅผ ์ฌ์ฉํ์ฌ _elevated_ ์ธ์
์์ Chocolatey๋ฅผ ํตํด ์ค์น ๊ฐ๋ฅ) :
PS> iep echoargs '' 'a&b' '3" of snow' 'Nat "King" Cole' 'c:\temp 1\' 'a \" b'
Arg 0 is <>
Arg 1 is <a&b>
Arg 2 is <3" of snow>
Arg 3 is <Nat "King" Cole>
Arg 4 is <c:\temp 1\>
Arg 5 is <a \" b>
Command line:
"C:\ProgramData\chocolatey\lib\echoargs\tools\EchoArgs.exe" "" a&b "3\" of snow" "Nat \"King\" Cole" "c:\temp 1\\" "a \\\" b"
์๋ PowerShell Core ์ถ๋ ฅ์ ๋ณด์ฌ์ค๋๋ค. ๋น ์ธ์๋ฅผ ํฌํจํ์ฌ ๋ชจ๋ ์ธ์๊ฐ PowerShell์์ ๊ทธ๋๋ก ํ์๋๋๋๋ก ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ฌ๋์๋์ง ํ์ธํฉ๋๋ค.
Windows PowerShell์์๋ \"
์ด์ค์ผ์ดํ๊ฐ ์ ์์๋ ์คํ ํ์ผ์ ํธ์ถํ๊ธฐ ๋๋ฌธ์ (์์์ ์ค๋ช
ํ๋๋ก) ์ฌ์ฉ๋๋ฏ๋ก 3" of snow
์ธ์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ฌ๋์ง ์์ต๋๋ค.
๊ทธ ๋ฐฐ์น ํ์ผ์ด ์ ๋๋ก์ ํตํด ์ธ์๋ฅผ ์ ๋ฌ ํ์ธํ๋ ค๋ฉด, ๋น์ ์ ๋ง๋ค ์ ์์ต๋๋ค echoargs.cmd
์ ๋ํผ๋ก echoargs.exe
:
'@echoargs.exe %*' | Set-Content echoargs.cmd
iep .\echoargs.cmd '' 'a&b' '3" of snow' 'Nat "King" Cole' 'c:\temp 1\' 'a \" b'
๋ก ํธ์ถ
์ด์ ๋ฐฐ์น ํ์ผ์ด ํธ์ถ๋์์ผ๋ฏ๋ก ""
-escaping์ ์ฌ์ฉํ์ฌ Windows PowerShell์์ ํธ์ถ ํ ๋ 3" of snow
๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
์ด ํจ์๋ Unix ๊ณ์ด ํ๋ซํผ์์๋ ๋์ผํ๊ฒ ์๋ํ๋ฉฐ echoargs
๋ผ๋ sh
์
ธ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค์ด ํ์ธํ ์ ์์ต๋๋ค.
@'
#!/bin/sh
i=0; for a; do printf '%s\n' "\$$((i+=1))=[$a]"; done
'@ > echoargs; chmod a+x echoargs
iep ./echoargs '' 'a&b' '3" of snow' 'Nat "King" Cole' 'c:\temp 1\' 'a \" b'
๋ก ํธ์ถ
์ค์ : ์ด ํจ์ ์ ie
( I nvoke (external) E xecutable) ๋ก ๊ฒ์๋์์ต๋๋ค. ๋ฐฉ๊ธ Native
๋ชจ๋์ ๊ฒ์ํ์ต๋๋ค. ๋์ . ๋ค์์ผ๋ก ๋ชจ๋ ์ค์น
Install-Module Native -Scope CurrentUser
์ด ๋ชจ๋์๋ # 13068์์ ๋
ผ์ ๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํด๊ฒฐํ๋ ins
( Invoke-NativeShell
) ๋ช
๋ น๋ ํฌํจ๋์ด ์์ต๋๋ค. https://github.com/PowerShell/PowerShell/issues/13068#issuecomment -671572939 ์ฐธ์กฐ ์์ธํ ๋ด์ฉ์.
iep
's ์์ค ์ฝ๋ (๋์ Native
๋ชจ๋ ์ฌ์ฉ-์ ์ฐธ์กฐ) :function iep {
Set-StrictMode -Version 1
if (-not (Test-Path Variable:IsCoreClr)) { $IsCoreCLR = $false }
if (-not (Test-Path Variable:IsWindows)) { $IsWindows = $env:OS -eq 'Windows_NT' }
# Split into executable name/path and arguments.
$exe, [string[]] $argsForExe = $args
# Resolve to the underlying command (if it's an alias) and ensure that an external executable was specified.
$app = Get-Command -ErrorAction Stop $exe
if ($app.ResolvedCommand) { $app = $app.ResolvedCommand }
if ($app.CommandType -ne 'Application') { Throw "Not an external program, non-PS script, or batch file: $exe" }
if ($argsForExe.Count -eq 0) {
# Argument-less invocation
& $exe
}
else {
# Invocation with arguments: escape them properly to pass them through as literals.
# Decide whether to escape embedded double quotes as \" or as "", based on the target executable.
# * On Unix-like platforms, we always use \"
# * On Windows, we use "" where we know it's safe to do. cmd.exe / batch files require "", and Microsoft compiler-generated executables do too, often in addition to supporting \",
# notably including Python and Node.js
# However, notable interpreters that support \" ONLY are Ruby and Perl (as well as PowerShell's own CLI, but it's better to call that with a script block from within PowerShell).
# Targeting a batch file triggers "" escaping, but in the case of stub batch files that simply relay to a different executable, that could still break
# if the ultimate target executable only supports \"
$useDoubledDoubleQuotes = $IsWindows -and ($app.Source -match '[/\\]?(?<exe>cmd|msiexec)(?:\.exe)?$' -or $app.Source -match '\.(?<ext>cmd|bat|py|pyw)$')
$doubleQuoteEscapeSequence = ('\"', '""')[$useDoubledDoubleQuotes]
$isMsiExec = $useDoubledDoubleQuotes -and $Matches['exe'] -eq 'msiexec'
$isCmd = $useDoubledDoubleQuotes -and ($Matches['exe'] -eq 'cmd' -or $Matches['ext'] -in 'cmd', 'bat')
$escapedArgs = foreach ($arg in $argsForExe) {
if ('' -eq $arg) { '""'; continue } # Empty arguments must be passed as `'""'`(!), otherwise they are omitted.
$hasDoubleQuotes = $arg.Contains('"')
$hasSpaces = $arg.Contains(' ')
if ($hasDoubleQuotes) {
# First, always double any preexisting `\` instances before embedded `"` chars.
# so that `\"` isn't interpreted as an escaped `"`.
$arg = $arg -replace '(\\+)"', '$1$1"'
# Then, escape the embedded `"` chars. either as `\"` or as `""`.
# If \" escaping is used:
# * In PS Core, use of `\"` is safe, because its use triggers enclosing double-quoting (if spaces are also present).
# * !! In WinPS, sadly, that isn't true, so something like `'foo="bar none"'` results in `foo=\"bar none\"` -
# !! which - due to the lack of enclosing "..." - is seen as *2* arguments by the target app, `foo="bar` and `none"`.
# !! Similarly, '3" of snow' would result in `3\" of snow`, which the target app receives as *3* arguments, `3"`, `of`, and `snow`.
# !! Even manually enclosing the value in *embedded* " doesn't help, because that then triggers *additional* double-quoting.
$arg = $arg -replace '"', $doubleQuoteEscapeSequence
}
elseif ($isMsiExec -and $arg -match '^(\w+)=(.* .*)$') {
# An msiexec argument originally passed in the form `PROP="value with spaces"`, which PowerShell turned into `PROP=value with spaces`
# This would be passed as `"PROP=value with spaces"`, which msiexec, sady, doesn't recognize (`PROP=valueWithoutSpaces` works fine, however).
# We reconstruct the form `PROP="value with spaces"`, which both WinPS And PS Core pass through as-is.
$arg = '{0}="{1}"' -f $Matches[1], $Matches[2]
}
# As a courtesy, enclose tokens that PowerShell would pass unquoted in "...",
# if they contain cmd.exe metachars. that would break calls to cmd.exe / batch files.
$manuallyDoubleQuoteForCmd = $isCmd -and -not $hasSpaces -and $arg -match '[&|<>^,;]'
# In WinPS, double trailing `\` instances in arguments that have spaces and will therefore be "..."-enclosed,
# so that `\"` isn't mistaken for an escaped `"` - in PS Core, this escaping happens automatically.
if (-not $IsCoreCLR -and ($hasSpaces -or $manuallyDoubleQuoteForCmd) -and $arg -match '\\') {
$arg = $arg -replace '\\+$', '$&$&'
}
if ($manuallyDoubleQuoteForCmd) {
# Wrap in *embedded* enclosing double quotes, which both WinPS and PS Core pass through as-is.
$arg = '"' + $arg + '"'
}
$arg
}
# Invoke the executable with the properly escaped arguments.
& $exe $escapedArgs
}
}
@ mklement0 ์ธ์์ ์ด์ง๋ง ์ฌ๊ธฐ์ Windows์์ ์๋ํ์ง ์๋ ๋ช ๊ฐ์ง๊ฐ ์์ต๋๋ค.
iep echoargs 'somekey="value with spaces"' 'te\" st'
Arg 0 is <somekey="value>
Arg 1 is <with>
Arg 2 is <spaces">
Arg 3 is <te\">
Arg 4 is <st>
Command line:
"C:\ProgramData\chocolatey\lib\echoargs\tools\EchoArgs.exe" somekey=\"value with spaces\" te\\\" st
์ฌ๊ธฐ์ ๋ด ํ ์คํธ ์ธ์ ๋ฐฐ์ด์ด ์์ต๋๋ค. :)
$Arguments = @(
'trippe slash at the end \\\',
'4 slash at the end \\\\',
'\\servername\path\',
'path=\\servername\path\',
'key="\\servername\pa th\"',
'5 slash at the end \\\\\',
'\\" double slashed double quote',
'simple',
'white space',
'slash at the end \',
'double slash at the end \\',
'trippe slash at the end \\\',
'trippe slash at the end with space \\\ ',
'\\" double slashed double quote',
'double slashed double quote at the end \\"',
'\\\" triple slashed double quote',
'triple slashed double quote at the end \\\"',
# slash
'single slashes \a ^ \: \"',
'path="C:\Program Files (x86)\test\"'
# quotes
'double quote " and single quote ''',
# windows env var syntax
"env var OS: %OS%",
# utf16
('"utf16 ETHIOPIC WORDSPACE: \u1361"' | ConvertFrom-Json),
# special chars
"newLine`newLine"
"tab`tab"
"backspace`bbackspace"
"carriage`rafter",
"formFeed`fformFeed",
# JSON Strings
@"
[{"_id":"5cdab57e4853ea7b5a707070","index":0,"guid":"25319946-950e-4fe8-9586-ddd031cbb0fc","isActive":false,"balance":"`$2,841.15","picture":"http://placehold.it/32x32","age":39,"eyeColor":"blue","name":{"first":"Leach","last":"Campbell"},"company":"EMOLTRA","email":"[email protected]","phone":"+1 (864) 412-3166","address":"127 Beadel Street, Vivian, Vermont, 1991","about":"Ex labore non enim consectetur id ullamco nulla veniam Lorem velit cillum aliqua amet nostrud. Occaecat ipsum do est qui sint aliquip anim culpa laboris tempor amet. Aute sint anim est sint elit amet nisi veniam culpa commodo nostrud cupidatat in ex.","registered":"Monday, August 25, 2014 4:04 AM","latitude":"-12.814443","longitude":"75.880149","tags":["pariatur","voluptate","sint","Lorem","eiusmod"],"range":[0,1,2,3,4,5,6,7,8,9],"friends":[{"id":0,"name":"Lester Bender"},{"id":1,"name":"Concepcion Jarvis"},{"id":2,"name":"Elsie Whitfield"}],"greeting":"Hello, Leach! You have 10 unread messages.","favoriteFruit":"strawberry"},{"_id":"5cdab57e8cd0ac577ab534a4","index":1,"guid":"0be10c87-6ce7-46c4-8dd6-23b1d9827538","isActive":false,"balance":"`$1,049.56","picture":"http://placehold.it/32x32","age":33,"eyeColor":"green","name":{"first":"Lacey","last":"Terrell"},"company":"XSPORTS","email":"[email protected]","phone":"+1 (858) 511-2896","address":"850 Franklin Street, Gordon, Virginia, 4968","about":"Eiusmod nostrud mollit occaecat Lorem consectetur enim pariatur qui eu. Proident aliqua sunt incididunt Lorem adipisicing ea esse do ullamco excepteur duis qui. Irure labore cillum aliqua officia commodo incididunt esse ad duis ea. Occaecat officia officia laboris veniam id dolor minim magna ut sit. Aute quis occaecat eu veniam. Quis exercitation mollit consectetur magna officia sit. Irure ullamco laborum cillum dolore mollit culpa deserunt veniam minim sunt.","registered":"Monday, February 3, 2014 9:19 PM","latitude":"-82.240949","longitude":"2.361739","tags":["nostrud","et","non","eiusmod","qui"],"range":[0,1,2,3,4,5,6,7,8,9],"friends":[{"id":0,"name":"Meyers Dillard"},{"id":1,"name":"Jacobson Franco"},{"id":2,"name":"Hunt Hernandez"}],"greeting":"Hello, Lacey! You have 8 unread messages.","favoriteFruit":"apple"},{"_id":"5cdab57eae2f9bc5184f1768","index":2,"guid":"3c0de017-1c2a-470e-87dc-5a6257e8d9d9","isActive":true,"balance":"`$3,349.49","picture":"http://placehold.it/32x32","age":20,"eyeColor":"green","name":{"first":"Knowles","last":"Farrell"},"company":"DAYCORE","email":"[email protected]","phone":"+1 (971) 586-2740","address":"150 Bath Avenue, Marion, Oregon, 991","about":"Eiusmod sint commodo eu id sunt. Labore esse id veniam ea et laborum. Dolor ad cupidatat Lorem amet. Labore ut commodo amet commodo. Ipsum reprehenderit voluptate non exercitation anim nostrud do. Aute incididunt ad aliquip aute mollit id eu ea. Voluptate ex consequat velit commodo anim proident ea anim magna amet nisi dolore.","registered":"Friday, September 28, 2018 7:51 PM","latitude":"-11.475201","longitude":"-115.967191","tags":["laborum","dolor","dolor","magna","mollit"],"range":[0,1,2,3,4,5,6,7,8,9],"friends":[{"id":0,"name":"Roxanne Griffith"},{"id":1,"name":"Walls Moore"},{"id":2,"name":"Mattie Carney"}],"greeting":"Hello, Knowles! You have 8 unread messages.","favoriteFruit":"strawberry"},{"_id":"5cdab57e80ff4c4085cd63ef","index":3,"guid":"dca20009-f606-4b99-af94-ded6cfbbfa38","isActive":true,"balance":"`$2,742.32","picture":"http://placehold.it/32x32","age":26,"eyeColor":"brown","name":{"first":"Ila","last":"Hardy"},"company":"OBLIQ","email":"[email protected]","phone":"+1 (996) 556-2855","address":"605 Hillel Place, Herald, Delaware, 9670","about":"Enim eiusmod laboris amet ex laborum do dolor qui occaecat ex do labore quis sunt. Veniam magna non nisi ipsum occaecat anim ipsum consectetur ex laboris aute ut consectetur. Do eiusmod tempor dolore eu in dolore qui anim non et. Minim amet exercitation in in velit proident sint aliqua Lorem reprehenderit labore exercitation.","registered":"Friday, April 21, 2017 6:33 AM","latitude":"64.864232","longitude":"-163.200794","tags":["tempor","eiusmod","mollit","aliquip","aute"],"range":[0,1,2,3,4,5,6,7,8,9],"friends":[{"id":0,"name":"Duncan Guy"},{"id":1,"name":"Jami Maxwell"},{"id":2,"name":"Gale Hutchinson"}],"greeting":"Hello, Ila! You have 7 unread messages.","favoriteFruit":"banana"},{"_id":"5cdab57ef1556326f77730f0","index":4,"guid":"f2b3bf60-652f-414c-a5cf-094678eb319f","isActive":true,"balance":"`$2,603.20","picture":"http://placehold.it/32x32","age":27,"eyeColor":"brown","name":{"first":"Turner","last":"King"},"company":"DADABASE","email":"[email protected]","phone":"+1 (803) 506-2511","address":"915 Quay Street, Hinsdale, Texas, 9573","about":"Consequat sunt labore tempor anim duis pariatur ad tempor minim sint. Nulla non aliqua veniam elit officia. Ullamco et irure mollit nulla do eiusmod ullamco. Aute officia elit irure in adipisicing et cupidatat dolor in sint elit dolore labore. Id esse velit nisi culpa velit adipisicing tempor sunt. Eu sunt occaecat ex pariatur esse.","registered":"Thursday, May 21, 2015 7:44 PM","latitude":"88.502961","longitude":"-119.654437","tags":["Lorem","culpa","labore","et","nisi"],"range":[0,1,2,3,4,5,6,7,8,9],"friends":[{"id":0,"name":"Leanne Lawson"},{"id":1,"name":"Jo Shepard"},{"id":2,"name":"Effie Barnes"}],"greeting":"Hello, Turner! You have 6 unread messages.","favoriteFruit":"apple"},{"_id":"5cdab57e248f8196e1a60d05","index":5,"guid":"875a12f0-d36a-4e7b-aaf1-73f67aba83f8","isActive":false,"balance":"`$1,001.89","picture":"http://placehold.it/32x32","age":38,"eyeColor":"blue","name":{"first":"Petty","last":"Langley"},"company":"NETUR","email":"[email protected]","phone":"+1 (875) 505-2277","address":"677 Leonard Street, Ticonderoga, Utah, 1152","about":"Nisi do quis sunt nisi cillum pariatur elit dolore commodo aliqua esse est aute esse. Laboris esse mollit mollit dolor excepteur consequat duis aute eu minim tempor occaecat. Deserunt amet amet quis adipisicing exercitation consequat deserunt sunt voluptate amet. Ad magna quis nostrud esse ullamco incididunt laboris consectetur.","registered":"Thursday, July 31, 2014 5:16 PM","latitude":"-57.612396","longitude":"103.91364","tags":["id","labore","deserunt","cillum","culpa"],"range":[0,1,2,3,4,5,6,7,8,9],"friends":[{"id":0,"name":"Colette Mullen"},{"id":1,"name":"Lynnette Tanner"},{"id":2,"name":"Vickie Hardin"}],"greeting":"Hello, Petty! You have 9 unread messages.","favoriteFruit":"banana"},{"_id":"5cdab57e4df76cbb0db9be43","index":6,"guid":"ee3852fe-c597-4cb6-a336-1466e8978080","isActive":true,"balance":"`$3,087.87","picture":"http://placehold.it/32x32","age":33,"eyeColor":"brown","name":{"first":"Salas","last":"Young"},"company":"PLAYCE","email":"[email protected]","phone":"+1 (976) 473-2919","address":"927 Elm Place, Terlingua, North Carolina, 2150","about":"Laborum laboris ullamco aliquip occaecat fugiat sit ex laboris veniam tempor tempor. Anim quis veniam ad commodo culpa irure est esse laboris. Fugiat nostrud elit mollit minim. Velit est laborum ut quis anim velit aute enim culpa amet ipsum.","registered":"Thursday, October 1, 2015 10:59 AM","latitude":"-57.861212","longitude":"69.823065","tags":["eu","est","et","proident","nisi"],"range":[0,1,2,3,4,5,6,7,8,9],"friends":[{"id":0,"name":"Day Solomon"},{"id":1,"name":"Stevens Boyd"},{"id":2,"name":"Erika Mayer"}],"greeting":"Hello, Salas! You have 10 unread messages.","favoriteFruit":"apple"},{"_id":"5cdab57ed3c91292d30e141d","index":7,"guid":"ef7c0beb-8413-4f39-987f-022c4e8ec482","isActive":false,"balance":"`$2,612.45","picture":"http://placehold.it/32x32","age":36,"eyeColor":"brown","name":{"first":"Gloria","last":"Black"},"company":"PULZE","email":"[email protected]","phone":"+1 (872) 513-2364","address":"311 Guernsey Street, Hatteras, New Mexico, 2241","about":"Laborum sunt exercitation ea labore ullamco dolor pariatur laborum deserunt adipisicing pariatur. Officia velit duis cupidatat eu officia magna magna deserunt do. Aliquip cupidatat commodo duis aliquip in aute dolore occaecat esse ad. Incididunt est magna in pariatur ut do ex sit minim cupidatat culpa. Voluptate eu veniam cupidatat exercitation.","registered":"Friday, June 26, 2015 7:59 AM","latitude":"38.644208","longitude":"-45.481555","tags":["sint","ea","anim","voluptate","elit"],"range":[0,1,2,3,4,5,6,7,8,9],"friends":[{"id":0,"name":"Abby Walton"},{"id":1,"name":"Elsa Miranda"},{"id":2,"name":"Carr Abbott"}],"greeting":"Hello, Gloria! You have 5 unread messages.","favoriteFruit":"strawberry"},{"_id":"5cdab57edc91491fb70b705d","index":8,"guid":"631ff8a0-ce4c-4111-b1e4-1d112f4ecdc7","isActive":false,"balance":"`$2,550.70","picture":"http://placehold.it/32x32","age":25,"eyeColor":"brown","name":{"first":"Deirdre","last":"Huber"},"company":"VERBUS","email":"[email protected]","phone":"+1 (871) 468-3420","address":"814 Coles Street, Bartonsville, Tennessee, 7313","about":"Ipsum ex est culpa veniam voluptate officia consectetur quis et irure proident pariatur non. In excepteur est aliqua duis duis. Veniam consectetur cupidatat reprehenderit qui qui aliqua.","registered":"Monday, April 1, 2019 2:33 AM","latitude":"-75.702323","longitude":"45.165458","tags":["labore","aute","nisi","laborum","laborum"],"range":[0,1,2,3,4,5,6,7,8,9],"friends":[{"id":0,"name":"Genevieve Clarke"},{"id":1,"name":"Black Sykes"},{"id":2,"name":"Watson Hudson"}],"greeting":"Hello, Deirdre! You have 8 unread messages.","favoriteFruit":"strawberry"}]
"@
)
System.Diagnostics.Process๋ ์ฌ์ฉํ ๋ ์ ํ์ด ์๊ธฐ ๋๋ฌธ์ STDOUT STDERR ๋ฐ ๊ทธ ์กฐํฉ์ ๋ณ์๋ก ์บก์ฒ ํ ์์๋ ๋ฅ๋ ฅ์ ๊ฐ์ง ์์ฒด ๋ฌ๋๋ฅผ ์์ฑํด์ผํ๋๋ฐ, ์ด๋ ์ ์ฌ์ฉ ์ฌ๋ก์๋ ์ถฉ๋ถํ์ง๋ง ์๋ฒฝํ์ง๋ ์์ต๋๋ค.
ํธ์ง : ๋น์ ์ด ๋งํ๋ฏ์ด Windows Poweshell 5์์ ๊ฐ์ฅ์๋ฆฌ ์ผ์ด์ค๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค. Powershell 6์์ ํ ์คํธํ์ผ๋ฉฐ ํ๋ฅญํ๊ฒ ์๋ํฉ๋๋ค! ๋ถํํ๋ 7์ด Windows ์ผ์ด์ค์์ ์ธ์ ๋ ๋๊น์ง Poweshell 5๋ฅผ ์ฒ๋ฆฌํด์ผํฉ๋๋ค ...
์ธ์์ ์ด์ง๋ง ์ฌ๊ธฐ์ Windows์์ ์๋ํ์ง ์๋ ๋ช ๊ฐ์ง๊ฐ ์์ต๋๋ค.
์, ์ด๋ฌํ ์ ํ ์ฌํญ์ ์ด์ ์๊ฒฌ์์ ์ค๋ช
ํ๋๋ก ํฌํจ ๋ "
""
์ด์ค์ผ์ดํ ์ง์์ ๊ฐ์ ํ ์์๋ ์คํ ํ์ผ๊ณผ ํจ๊ป _Windows PowerShell_์ ์ ์ฉ๋ฉ๋๋ค.
๋ชจ๋ ํธ์ถ์์ ""
์ด์ค์ผ์ดํ๋ฅผ ์ง์ํ ์ํฅ์ด ์๋ค๋ฉด (_most_, Windows์ ๋ชจ๋ ์คํ ํ์ผ์ด ์ง์ํ์ง๋ ์์) ํจ์๋ฅผ ์ฝ๊ฒ ์กฐ์ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ํธ์ง์์ ๋งํ ๋ด์ฉ์ ํ์ธํ๋ ค๋ฉด PowerShell _Core_์์ :
iep echoargs 'somekey="value with spaces"' 'te\" st'
์ ์๋ํฉ๋๋ค.๋ชจ๋ ํธ์ถ์์
""
์ด์ค์ผ์ดํ์ ๋ํ ์ง์์ ๊ฐ์ ํ๊ณ ์ถ๋ค๋ฉด (_most_, Windows์ ๋ชจ๋ ์คํ ํ์ผ์ด ์ง์ํ์ง๋ ์์) ํจ์๋ฅผ ์ฝ๊ฒ ์กฐ์ ํ ์ ์์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค. ๊ฐ๊น์ด ์์ผ ๋ด์ ์ฌ์ฉํด ๋ณด๊ฒ ์ต๋๋ค. ๋๋ ๋๋๋ก sqlcmd๋ฅผ ๋ค๋ฃจ๋ฉฐ ""
๋ฅผ ํ์คํ ์ง์ํ์ง ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ํน์ ์ธ์์ ๋ํ ์ด์ค์ผ์ดํ ๋
ผ๋ฆฌ๋ฅผ ๊ฑด๋ ๋ธ ์์๋ ์ต์
์ ์ ๊ณตํ๊ธฐ ์ฝ์ต๋๋ค.
Windows์์ ๋ช ๋ น ์ค ์ธ์๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๋ฐฉ๋ฒ์ C ++ ๋ช ๋ น ์ค ์ธ์ ๊ตฌ๋ฌธ ๋ถ์ ์์ ์ฐพ์ ์ ์์ต๋๋ค.
Microsoft C / C ++ ์์ ์ฝ๋๋ ์ด์ ์ฒด์ ๋ช ๋ น ์ค์ ์ง์ ๋ ์ธ์๋ฅผ ํด์ ํ ๋ ๋ค์ ๊ท์น์ ์ฌ์ฉํฉ๋๋ค.
์ธ์๋ ๊ณต๋ฐฑ ๋๋ ํญ์ธ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค.
์บ๋ฟ ๋ฌธ์ (^)๋ ์ด์ค์ผ์ดํ ๋ฌธ์ ๋๋ ๊ตฌ๋ถ ๊ธฐํธ๋ก ์ธ์๋์ง ์์ต๋๋ค. ๋ฌธ์๋ ํ๋ก๊ทธ๋จ์
argv
๋ฐฐ์ด๋ก ์ ๋ฌ๋๊ธฐ ์ ์ ์ด์ ์ฒด์ ์ ๋ช ๋ น ์ค ํ์์ ์ํด ์์ ํ ์ฒ๋ฆฌ๋ฉ๋๋ค.ํฐ ๋ฐ์ดํ ( " string ")๋ก ๋๋ฌ์ธ์ธ
๋ฐฑ ์ฌ๋์ (\ ")๊ฐ ์์ ์ค๋ ํฐ ๋ฐ์ดํ๋ ๋ฆฌํฐ๋ด ํฐ ๋ฐ์ดํ ๋ฌธ์ (")๋ก ํด์๋ฉ๋๋ค.
๋ฐฑ ์ฌ๋์๋ ํฐ ๋ฐ์ดํ ๋ฐ๋ก ์์ ๋์ค์ง ์๋ ํ ๋ฌธ์ ๊ทธ๋๋ก ํด์๋ฉ๋๋ค.
์ง์์ ๋ฐฑ ์ฌ๋์ ๋ค์ ํฐ ๋ฐ์ดํ๊ฐ ์ค๋ฉด ๋ชจ๋ ๋ฐฑ ์ฌ๋์ ์์ ๋ํด ํ๋์ ๋ฐฑ ์ฌ๋์๊ฐ
argv
๋ฐฐ์ด์ ๋ฐฐ์น๋๊ณ ํฐ ๋ฐ์ดํ๋ ๋ฌธ์์ด ๊ตฌ๋ถ ๊ธฐํธ๋ก ํด์๋ฉ๋๋ค.ํ์์ ๋ฐฑ ์ฌ๋์ ๋ค์ ํฐ ๋ฐ์ดํ๊ฐ ์ค๋ฉด ๋ชจ๋ ๋ฐฑ ์ฌ๋์ ์์ ๋ํด ํ๋์ ๋ฐฑ ์ฌ๋์๊ฐ
argv
๋ฐฐ์ด์ ๋ฐฐ์น๋๊ณ ํฐ ๋ฐ์ดํ๋ ๋๋จธ์ง ๋ฐฑ ์ฌ๋์๋ก "์ด์ค์ผ์ดํ"๋์ด ๋ฆฌํฐ๋ด์ด๋ฉ๋๋ค. ํฐ ๋ฐ์ดํ ( ")๋argv
๋ฐฐ์น๋ฉ๋๋ค.
_exec, _wexec ํจ์ ์์๋ ์ค๋ช ํฉ๋๋ค.
๋ฌธ์์ด์ ํฌํจ ๋ ๊ณต๋ฐฑ์ผ๋ก ์ธํด ์๊ธฐ์น ์์ ๋์์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด
_exec
๋ฌธ์์ด์"hi there"
๋ฅผ ์ ๋ฌํ๋ฉด ์ ํ๋ก์ธ์ค๊ฐ ๋ ๊ฐ์ ์ธ์,"hi"
๋ฐ"there"
์ป์ต๋๋ค. ์ ํ๋ก์ธ์ค๊ฐ "hi there"๋ผ๋ ํ์ผ์ ์ด๋๋กํ๋ ๊ฒ์ด ์๋ ๋ ๊ฒฝ์ฐ ํ๋ก์ธ์ค๊ฐ ์คํจํฉ๋๋ค."\"hi there\""
๋ฌธ์์ด์ ์ธ์ฉํ์ฌ์ด๋ฅผ ๋ฐฉ์ง ํ ์ ์์ต๋๋ค.
Python์ subprocess.Popen
๋ Windows์์ ์ธ์ ์ํ์ค๋ฅผ ๋ฌธ์์ด ๋ก args
๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํ์ฌ ์ด์ค์ผ์ดํ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌ ํ ์ โโ์์ต๋๋ค. ๊ตฌํ์ subprocess.list2cmdline
์
๋๋ค.
์ด๊ฒ์ด --%
๋๋ ์ด์ค ์ด์ค์ผ์ดํ (PowerShell ๋ฐ CMD ๊ตฌ๋ฌธ์ ๋ฐ๋ฆ)๋ฅผ ์ฌ์ฉํ๋ ๋์ PowerShell์ด์ด๋ฅผ๋ณด๋ค ์ฐ์ํ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ ํ ์์๋ ๋ฐฉ๋ฒ์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณต ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ค์ ๋ก Azure CLI (python.exe ๊ธฐ๋ฐ) ๊ณ ๊ฐ์๊ฒ ๋ฒ๊ทธ๋ฅผ์ค๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ๊ธฐ์ํ ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ ๋ฐฉ๋ฒ์ด ์์ง ์์ต๋๋ค. Powershell ํ์ ๋๊ตฐ๊ฐ๊ฐ v7๋ก ๋จ์ํํ๋ฉด ๋ฐํ ์ ์์ต๋๊น?
์ข์ ์์์ PS 7.1์ ์ด์ ์ค ํ๋๊ฐ ๊ธฐ๋ณธ ๋ช ๋ น์๋ณด๋ค ์ฝ๊ฒ โโํธ์ถ ํ ์ ์๋๋กํ๋ ๊ฒ์ ๋๋ค. 7.1 ํฌ์์ ๋ํ
๋๋ถ๋ถ์ ๊ธฐ๋ณธ ๋ช ๋ น์ PowerShell ๋ด์์ ์ ๋๋ก ์๋ํ์ง๋ง ์ธ์ ๊ตฌ๋ฌธ ๋ถ์์ด ์ด์์ ์ด์ง ์์ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค (์ : ๋ฐ์ดํ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌ). ์๋๋ ์ฌ์ฉ์๊ฐ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๊ธฐ๋ณธ ๋๊ตฌ์ ๋ํ ์ํ ๋ช ๋ น ์ค์ ์๋ผ์ PowerShell์ ๋ถ์ฌ ๋ฃ์ ์ ์๋๋กํ๋ ๊ฒ์ด๋ฉฐ, PowerShell ํน์ ์ด์ค์ผ์ดํ ์์ด๋ ์๋ํฉ๋๋ค.
๊ทธ๋์ ์๋ง๋ (ํฌ๋ง์ ์ผ๋ก) ์ด๊ฒ์ 7.1์์ ํด๊ฒฐ ๋ ๊ฒ์ ๋๋ค.
๊ฐ์ฌํฉ๋๋ค, @rkeithhill ์ด์ง๋ง ๊ทธ๋ ์ง ์์ต๋๋ค.
์๋๋ ์ฌ์ฉ์๊ฐ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๊ธฐ๋ณธ ๋๊ตฌ์ ๋ํ ์ํ ๋ช ๋ น ์ค์ ์๋ผ์ PowerShell์ ๋ถ์ฌ ๋ฃ์ ์ ์๋๋กํ๋ ๊ฒ์ด๋ฉฐ, PowerShell ํน์ ์ด์ค์ผ์ดํ ์์ด๋ ์๋ํฉ๋๋ค.
๋ณธ์ง์ ์ผ๋ก ๊ฐ๋
์ ์ผ๋ก ๋ฌธ์ ๊ฐ์๋ --%
(๊ตฌ๋ฌธ ๋ถ์ ์ค์ง ๊ธฐํธ)์ ๋ํ ๋ ๋ค๋ฅธ ํด์์ฒ๋ผ ๋ค๋ฆฌ๋์?
@ SteveL-MSFT,์ด ์์ ๋ ๊ธฐ๋ฅ์ ๋ํด ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
์์ฝํ์๋ฉด, ์ฌ๊ธฐ์ ์ ์ ๋ ์์ ์ฌํญ์ _PowerShell_์ ๊ตฌ๋ฌธ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๊ณ PowerShell์ด โโ๋ชจ๋ ์ด์ค์ผ์ดํ ์ฒ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๋ค๋ ๊ฒ์ ๋๋ค (Windows์์๋, Unix์์๋ ๋ ์ด์ ํ์ํ์ง ์์ต๋๋ค. ์ด์ .NET์์๋ ๋์ ํ๋ก๊ทธ๋จ์ ์ถ ์ด์ ํ ํฐ ๋ฐฐ์ด์ ์ ๋ฌํฉ๋๋ค)-ํ์ง๋ง ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ ์งํด์ผํ๋ ๊ฒฝ์ฐ ์์ ์ฌํญ์ด ์ตํธ ์ธ๋์ด์ผํ๋ค๋ ๊ฒ์ ์์ฌ์ ์ฌ์ง๊ฐ ์์ต๋๋ค.
์ด ์์ ์ ํตํด ๋ค๋ฅธ ์
ธ์ ๋ํ ๋ช
๋ น ์ค์ _some_ ์กฐ์ํด์ผํ์ง๋ง ๋ ๊ฐ๋จ ํฉ๋๋ค. --%
๋นํด PowerShell์ ๊ตฌ๋ฌธ ๋ฐ ๋ณ์ ํ์ฅ ( (...)
ํํ์)์ ๋ชจ๋ ๊ธฐ๋ฅ์ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค.
\"
๋ฅผ `"
๋ก ๋ฐ๊ฟ์ผํ์ง๋ง _ "..."
_ ๋ด๋ถ์์๋ง ๊ฐ๋ฅํฉ๋๋ค.
_no (other) shell_์ด ๊ด๋ จ๋์ด ์์ผ๋ฏ๋ก $USER
์ ๊ฐ์ Bash ์คํ์ผ ํ๊ฒฝ ๋ณ์ ์ฐธ์กฐ๋ ์๋ํ์ง _ ์์ต๋๋ค (์ด๋ค์ _PowerShell_ ๋ณ์๋ก ํด์๋ฉ๋๋ค). ๋๋ฑํ PowerShell ๊ตฌ๋ฌธ, $env:USER
.
--%
๋-ํนํ _invariably_- cmd.exe
- %USERNAME%
์ ๊ฐ์ ์คํ์ผ์ ํ๊ฒฝ ๋ณ์ ์ฐธ์กฐ๋ฅผ ํ์ฅํ์ฌ์ด๋ฅผ ๋ณด์ํ๋ ค๊ณ ์๋ํ์ง๋ง, ๊ทธ๋ ์ง ์์๋ฟ๋ง ์๋๋ผ t ์ง์ Bash ์คํ์ผ ์ฐธ์กฐ ( $USER
)๋ _verbatim_ ๋์ ํ๋ก๊ทธ๋จ์ ์ ๋ฌ๋์ง๋ง ์๊ธฐ์น ์๊ฒ Unix ๊ณ์ด ํ๋ซํผ์์ cmd.exe
์คํ์ผ ์ฐธ์กฐ๋ฅผ ํ์ฅํ๊ณ '...'
์ธ์ํ์ง ๋ชปํฉ๋๋ค. PowerShell์๋ ๊ทธ๋๋ก ์ฌ์ฉํ๊ธฐ ์ํด ์ธ์ฉ / ์ด์ค์ผ์ดํ ์ฒ๋ฆฌ๊ฐ ํ์ํ _additional_ ๋ฉํ ๋ฌธ์๊ฐ ์์์ ์๊ณ ์์ด์ผํฉ๋๋ค. ๋ค์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค ( @
๋ ์ธ์์ _first_ char๋ก๋ง ๋ฌธ์ ๊ฐ๋ฉ๋๋ค.) :
@ { } `
(PowerShell์ ์ํ ์ ํ ํ์ฅ์ ๋ฐฉ์งํ๋ ค๋ ๊ฒฝ์ฐ $
)cmd.exe
: ( ) @ { } # `
`
-์ด๋ฌํ ๋ฌธ์๋ฅผ ์ด์ค์ผ์ดํํฉ๋๋ค. ์ถฉ๋ถํฉ๋๋ค (์ : printf %s `@list.txt
).๋ค์ ์ธ์์ ์ธ ์ :
๋ค์ Bash ๋ช ๋ น ์ค์ ์ฌ์ฉํฉ๋๋ค.
# Bash
$ printf '"%s"\n' "3\" of snow"
"3" of snow" # output
์ฅ์์ ์ ์ ๋ ์์ ๊ณผ ํ์ํ ๊ฒ์ ๋ชจ๋ ๊ต์ฒดํ๋ ๊ฒ์
๋๋ค \"
๋ด๋ถ ์ธ์คํด์ค "..."
์ -enclosed ์ธ์ `"
:
# PowerShell - WISHFUL THINKING
PS> printf '"%s"\n' "3`" of snow"
"3" of snow" # output
๊ทธ๊ฒ์ ๋น์ ์ด์ ๋ํด ๊ฑฑ์ ํ ํ์๊ฐ ์์ต๋๋ค ๊ฒ์
๋๋ค, ์๋ฒ ๋๋ "
๋ด๋ถ '...'
, ๋ด๋ถ "..."
๋ง ํ ์ด์ค์ผ์ดํ ํ ํ์๊ฐ _PowerShell_์ ํ๋ณต (๋น์ ์ ๋ํ ํ ์์๋ ์ฌ๊ธฐ์ ""
).
์์ iep
ํจ์ ๋ iep printf '"%s"\n' "3`" of snow"
๊ฐ ์๋ ํ๋๋ก ์๋ ํ ์ ์๋๋ก์ด ์์ ์ฌํญ์ (์ ์ฌ์ ์ผ๋ก) ๊ตฌํํฉ๋๋ค.
Bash์์์ ๊ฐ์ด ๋ช
๋ น์ด ์๋ํ๋๋กํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ๊ฑด๋ ๋ฐ์ด์ผํ๋ ํ์ฌ์ ๊นจ์ง ๋์๊ณผ ๋์กฐ๋ฉ๋๋ค ( \
๋ก ์ด์ค์ผ์ดํํ๋ _additional_ ๋ผ์ด๋๊ฐ ํ์ํฉ๋๋ค).
# PowerShell - messy workaround to compensate for the current, broken behavior.
PS> printf '\"%s\"\n' "3\`" of snow"
"3" of snow" # output
์์ ์ ํตํด ํ๋ซํผ์ _default shell_์ ํตํด ์ฃผ์ด์ง ๋ช
๋ น ์ค _as-is_๋ฅผ ์ฌ์ฉํ๋ ค๋ ์ฌ๋๋ค์ _here-string_์ ๊ทธ๋๋ก ์ฌ์ฉํ์ฌ sh -c
(๋๋ bash -c
๋ก ์ ๋ฌํ ์ ์์ต๋๋ค cmd /c
; ์ :
# PowerShell - WISHFUL THINKING
PS> sh -c @'
printf '"%s"\n' "3\" of snow"
'@
"3" of snow" # output
--%
์ฌ์ฉ์ ์ฌ๊ธฐ์ ์๋ํ์ง _ ์์ต๋๋ค _ ( printf --% '"%s"\n' "3\" of snow"
), here-string ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์ ์ถ๊ฐ ์ด์ ์ ๋ค์ํ --%
์ ํ์ด ์ ์ฉ๋์ง ์๋๋ค๋ ๊ฒ์
๋๋ค. , ํนํ ์ถ๋ ฅ ๋ฆฌ๋๋ ์
( >
)์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
_double_-quoted here-string ( @"<newline>....<newline>"@
)์ผ๋ก ์ ํํ๋ฉด --%
๊ณผ ๋ฌ๋ฆฌ _PowerShell ๋ณ์ ๋ฐ ํํ์ _์ ํฌํจ ํ ์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ์ฅ ๋ ๊ฐ์ด ๋์ ์
ธ์ ๊ตฌ๋ฌธ์ ๊นจ์ง ์๋์ง ํ์ธํด์ผํฉ๋๋ค.
์ด๋ฌํ ํธ์ถ์ ๋ํด ๊ฐ๊ฒฐํ ๋ณ์นญ (์ : Invoke-NativeShell
/ ins
)์ด์๋ ์ ์ฉ cmdlet์ ๋ํด ์๊ฐํ ์ ์์ต๋๋ค ( sh -c
/ cmd /c
ํ์ํ์ง ์์). ์ง์ ), ๊ทธ๋ฌ๋ ๋ณต์กํ ๋ช
๋ น ์ค์์๋ ๊ทธ๋๋ก ์ ๋ฌํ๊ธฐ ์ํด here-strings๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ์ง ์์ต๋๋ค.
# PowerShell - WISHFUL THINKING
# Passes the string to `sh -c` / `cmd /c` for execution, as appropriate.
# Short alias: ins
PS> Invoke-NativeShell @'
printf '"%s"\n' "3\" of snow"
'@
"3" of snow" # output
๋ฌผ๋ก , ํ๋ซํผ ๋ค์ดํฐ๋ธ ์ ธ์ ๊ธฐ๋ฅ์ ์์กดํ๋ ๊ฒฝ์ฐ ์ด๋ฌํ ํธ์ถ์ ์ ์์ ๋ฐ๋ผ ํ๋ซํผ [-family] ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. Windows ๋ฐ Unix์ ์ ์ฌํ ํ๋ซํผ์์๋ ์๋ํ์ง ์์ต๋๋ค.
์ด๊ฒ์ด ์ฅ๊ธฐ์ ์ผ๋ก _own ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ PowerShell _alone_์ ์์กดํ๋ ๊ฒ์ด ๋ฐ๋์งํ ์ด์ ์ ๋๋ค. ์ฆ, ๋ค๋ฅธ ์ ธ์ฉ์ผ๋ก ์ ์ ๋ ๋ช ๋ น ์ค์ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์์๋ ๊ฒฝ์ฐ์๋ ์ธ๋ถ ํ๋ก๊ทธ๋จ์ ํธ์ถํ๋ ๋ฐ ์์ธก ๊ฐ๋ฅํ ๊ต์ฐจ ํ๋ซํผ ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ค; PowerShell์ด โโ์ธ๊ธฐ๋ฅผ ์ป์์ ๋ฐ๋ผ ํ์ํ ์์ ์ฌํญ์ ๋ฐ๊ฒฌํ๊ณ ์๋ ๊ณ ํต์ด ์ค์ด๋ค ๊ฒ์ผ๋ก ์์ํ๊ณ ๋ช ๋ น ์ค์ PowerShell ๋ฒ์ ์ ๋ณด์ฌ์ฃผ๋ ๋ฌธ์๊ฐ ์ ์ ๋ ๋ง์ ์ง ๊ฒ์ผ๋ก ๊ธฐ๋ํฉ๋๋ค.
\"
๋ฅผ`"
๋ก ๋ฐ๊ฟ์ผํ์ง๋ง _"..."
_ ๋ด๋ถ์์๋ง ๊ฐ๋ฅํฉ๋๋ค.
์ด๊ฒ์ ๋ชจ๋ ๊ณณ์์ ์๋ํ์ง ์์ต๋๋ค.
# working everywhere but polluted with \
โฏ node -e 'console.log(\"hey\")'
hey
# working in Node:
โฏ node -e 'console.log(`"hey`")'
hey
# not working in Julia:
โฏ julia -e 'print(`"hey`")'
`hey`
# not working anywhere:
โฏ node -e "console.log(`"hey`")"
โฏ node -e "console.log("hey")"
โฏ node -e "console.log(""hey"")"
โฏ node -e 'console.log(""hey"")'
โฏ node -e 'console.log("hey")'
hey
PowerShell ํ์ด ๊ธฐํธ๋ฅผ ์ฐพ๊ณ ์๋ค๋ฉด ์ด์ ๊ตฌ๋ฌธ์ ๊นจ๋จ๋ฆฌ์ง ์์ต๋๋ค. ๋ฆฌํฐ๋ด์ ์๋์ผ๋ก ์ด์ค์ผ์ดํํ๊ณ ๋ฌธ์์ด ๋ณด๊ฐ์ ํ์ฉํ๋ Bash ์ ์ฌ ๋์์ ๋ฐฑํฑ`๊ฐ์ ๊ฒ์ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ด๊ฒ์ JavaScript์ ๊ตฌ๋ฌธ๊ณผ๋ ์ ์ฌํฉ๋๋ค.
โฏ node -e `console.log("hey")`
hey
โฏ $a=hey
โฏ node -e `console.log($hey)`
hey
์ Bash์ ๊ฐ์ ํ๋์ ์ํด ๋ฐฑํฑ๊ณผ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ์ง ์๋ ์ด์
๋ฐฑํฑ์ ์ด๋ฏธ POSIX ์์ ๋ฐฑ ์ฌ๋์ ๊ฐ์ ๋ชฉ์ ์ผ๋ก ๋ฌผ๊ฑด์ ์ด์ค์ผ์ดํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋น์ ์ด ์ธ๊ธํ๊ณ ์๋ ์ฝ๋ฉํธ๋ ์ด๋ฏธ ๊ทธ๊ฒ์ ์ง์ ํ๊ณ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ชจ๋ ASCII ๋ฐ์ดํ ๊ฐ์ ๊ฒ๋ค์ ๋ค ์ฌ์ฉํ์ต๋๋ค. $
์ ๋์ฌ๋ฅผ ์ผ๋ฐ ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ์ถ๊ฐํ๋ฉด ์๋ ํ ์ ์์ง๋ง ์ถฉ๋ถํ ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
Windows๊ฐ ๋ช ๋ น ์ค ์ธ์๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๋ฐฉ๋ฒ์ ๋ค์์์ ์ฐพ์ ์ ์์ต๋๋ค.
๋ฌธ์ ๋ Windows MSVCR์ด ๋จ์ํ ๊ทธ๋ ๊ฒํ๋ ๊ฒ์ด ์๋๋ผ ๋ฌธ์ํ๋์ง ์์ ๋ฐฉ์์ผ๋ก ์ฝ๋ ์ผ์ด์ค ๊ฒ ์
๋๋ค. ""
์ ๋งค์ฐ ๊ฒฌ๊ณ ํ์ฌ .NET์ Unix๋ก ์ด์ ํ ๋ CoreFX์ ๋ฃ์ ์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด์จ๋ ์ ์ด๋ ๋๊ตฐ๊ฐ๊ฐ globbing์ ์์ฒญํ ๋๊น์ง๋ ํ์ถํ๊ธฐ์ ์ถฉ๋ถํฉ๋๋ค.
๋ชจ๋ ์ฌ๋์ด ๋ค๋ฅด๊ฒ ์ํํ๋ ๊ณ ์ ์ ์ธ ๋ฌธ์ ๋ ์์ง๋ง ์์ cmdline์ ๋ํ .NET์ด ํญ์ ์๊ธฐ ๋๋ฌธ์ ๊ฑฑ์ ํ ํ์๊ฐ ์์ต๋๋ค.
์ Bash์ ๊ฐ์ ํ๋์ ์ํด ๋ฐฑํฑ๊ณผ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ์ง ์๋ ์ด์
๋ฐฑํฑ์ ์ด๋ฏธ POSIX ์์ ๋ฐฑ ์ฌ๋์ ๊ฐ์ ๋ชฉ์ ์ผ๋ก ๋ฌผ๊ฑด์ ์ด์ค์ผ์ดํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ชจ๋ ASCII ๋ฐ์ดํ ๊ฐ์ ๊ฒ๋ค์ ๋ค ์ฌ์ฉํ์ต๋๋ค.
๊ตฌ๋ฌธ ๋ถ์๊ธฐ๊ฐ ์ฌ๊ธฐ์`๊ฐ ๋ฌธ์์ด์ ๋์
ํ๊ณ ์์์ ๊ฐ์ง ํ ์์๋ ๊ฒฝ์ฐ ๊ธฐํธ ์กฐํฉ์ ์ฌ์ฉํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ''
์ ๊ฐ์ ๊ฒ์ด ์๋ ํ ์๋ ์์ต๋๋ค.
@aminya ๋ ์ด์ Windows Powershell 5.1 ๋ฐ 6 ์ด์์ ์ฌ์ฉํ์ง ์๋ ์๋ฃจ์
์
๋๋ค.
https://github.com/PowerShell/PowerShell/issues/1995#issuecomment -562334606
Windows์์๋ PowerShell 5,1์, Linux / mac์์๋ 6+๋ฅผ ์ฒ๋ฆฌํด์ผํ๋ฏ๋ก kubectl, helm, terraform ๋ฐ ๋ณต์กํ JSON์ ์ ๋ฌํ๋ ๋ค๋ฅธ ๋๊ตฌ์ ํจ๊ป ์์
ํ ์ ์๋๋ก ๋ช ๋
๋์ ๋ฌธ์ ์์ด ์๋ํ๋ ์์ฒด ๊ตฌํ์ด ์์ต๋๋ค. ๋งค๊ฐ ๋ณ์ ๋ด์ ๊ฐ์ฒด :
https://github.com/choovick/ps-invoke-externalcommand
GitHubGitHub์์ ๊ณ์ ์ ๋ง๋ค์ด choovick / ps-invoke-externalcommand ๊ฐ๋ฐ์ ๊ธฐ์ฌํ์ธ์.
@choovick ๋ค์ ์งง์ ๊ตฌํ์ด ์์ ์ค๋ ๋ ์์ ์ ๊ณต๋์์ง๋ง ์ฌ์ ํ ์คํจ ํ ๊ฒฝ์ฐ๋ฅผ ์ฐพ๊ณ ์์ต๋๋ค. ์ด๊ฒ์ v3๋ถํฐ PS์์ ์๋ํฉ๋๋ค.
@AndrewSav @TSlivede ์ Run-Native
ํจ์ ๋ ๋งค์ฐ ์๋ฆฌํ๊ณ ๊ฐ๊ฒฐํ๋ฉฐ _Windows PowerShell_์์๋ ์์ ์ ์ผ๋ก ์๋ํฉ๋๋ค. ์ฃผ๋ชฉํ ๊ฐ์น๊ฐ์๋ ๋ช ๊ฐ์ง ์ฌํญ : ํ์์ ๋ฐ๋ผ ์์ ํ๋ก์ธ์ค๋ aux๋ฅผ ๋ด
๋๋ค. commandlineargumentstring
ํ๊ฒฝ ๋ณ์ (์๋ง๋ ๋๋ฌผ์ง๋ง ์ค์ ๋ก๋ ๋ฌธ์ ๊ฐ ๋ ์ ์์), ์ธ์์๋ ํธ์ถ์ ํ์ฌ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌ๋์ง ์์ต๋๋ค (ํจ์ ๋ง ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ๋์ง ์๊ณ ์ฝ๊ฒ ์์ ๋จ) _with_, _all_ ์ธ์์ ๊ฐ์ ํฐ ๋ฐ์ดํ (์๋ฅผ ๋ค์ด, ๋ญ๊ฐ ์ป์) ๊ทธ๊ฒ์ด์ํ ๊ฒ์
๋๋ค ์ธ์, 42
๋ก ์ ๋ฌ๋ฉ๋๋ค "42"
Windows์์ (๋ถํํ๋)์ ๋ํ ๋ถ์์ฉ์ด์์ ์ ์์ต๋๋ค) ํฐ ๋ฐ์ดํ (๋๋ msiexec
๊ฒฝ์ฐ์ ๊ฐ์ด ๋ถ๋ถ์ ์ผ๋ก ํฐ ๋ฐ์ดํ) ์ธ์๋ฅผ ๋ค๋ฅด๊ฒ ํด์ํ๋ ํ๋ก๊ทธ๋จ.
@aminya , node -e 'console.log(`"hey`")'
(์ผ์ข
)์ด ์๋ํ๋ ์ ์ผํ ์ด์ ๋ ํ์ฌ์ ๊ณ ์ฅ๋ ๋์ ๋๋ฌธ์
๋๋ค (์๋ ์ฐธ์กฐ). ์ ๋ฌํ๋ ค๋ ๋ด์ฉ์ด _verbatim_ console.log("hey")
๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค. Windows์ PowerShell์ด โโ์ฌ๊ธฐ์ ์ ์ ๋๋๋ก ์ฌ๋ฐ๋ฅด๊ฒ ์ด์ค์ผ์ดํ ์ฒ๋ฆฌ ๋ ๊ฒฝ์ฐ ์์ ๋ฐ์ดํ๋ก์๋ ๊ทธ๋๋ก ์ ๋ฌํฉ๋๋ค : node -e 'console.log("hey")'
. ์ด๊ฒ์ _ ์๋์ผ๋ก _ node -e "console.log(\"hey\")"
๋ก ๋ฒ์ญ๋์ด์ผํฉ๋๋ค (ํฐ ๋ฐ์ดํ, \
์ด์ค์ผ์ดํ ์ฒ๋ฆฌ ๋ ๊ทธ๋๋ก "
).
์ด ์ค๋ ๋๊ฐ ์ผ๋ง๋ ์ค๋๋์๋์ง๋ฅผ ๊ณ ๋ คํ์ฌ ์์ฝ ํด ๋ณด๊ฒ ์ต๋๋ค.
_PowerShell_์ ๊ตฌ๋ฌธ ์๊ตฌ ์ฌํญ์ ๋ํด์๋ง ๊ฑฑ์ ํ ํ์๊ฐ ์์ผ๋ฉฐ, PowerShell์ ์์ฒด ๊ตฌ๋ฌธ ๋ถ์ ๊ฒฐ๊ณผ ์ธ _verbatim ์ธ์ ๊ฐ _์ด ์ธ๋ถ ํ๋ก๊ทธ๋จ _as-is_์ ์ ๋ฌ๋๋๋กํ๋ ๊ฒ์ _ ์๋ก์์ PowerShell์ ์์
์
๋๋ค.
System.Diagnostics.ProcessStartInfo
์ collection-of-verbatim-tokens ArgumentList
์์ฑ์ ํ์ฉํ ์ ์์ต๋๋ค. Windows์์๋ ์ ์ ํ๊ฒ ์ธ์ฉ๋๊ณ ์ด์ค์ผ์ดํ ๋ ๋ช
๋ น์ผ๋ก ์๋ ๋ณํ๋ฉ๋๋ค. -ํ๋ก์ธ์ค๊ฐ ์์๋ ๋ ์ค ๋ฌธ์์ด; ๊ทธ๋ฌ๋ _batch ํ์ผ _์ ๊ฒฝ์ฐ ์ฌ์ ํ ํน์ ์ฒ๋ฆฌ๊ฐ ํ์ํ ์ ์์ต๋๋ค. https://github.com/PowerShell/PowerShell-RFC/pull/90#issuecomment -552231174 ์ฐธ์กฐ์์ ์ฌํญ์ ๊ตฌํํ๋ ๊ฒ์ ์์ฌ ํ ์ฌ์ง์์ด ์์ฒญ๋ ๋ณํ์ด๋ฏ๋ก ์๋ง๋ ์ตํธ ์ธ์ด ํ์ํ ๊ฒ์
๋๋ค.
ํนํ ์ ๋์ค ์ธ๊ณ์์ ๊ณ์ ๋ฑ์ฅํ๊ณ PowerShell ์ฑํ์ ๋ฐฉํดํ๋ ํ์ฌ์ ๋ชจ๋ ์ธ์ฉ ๋ฌธ์ ๋ฅผ ์ ๊ฑฐํ๋ ค๋ฉด์ด ์์
์ ์งํํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
node -e 'console.log(`"hey`")'
: ๋ด๋ถ '...'
๊ฒฝ์ฐ `
-ํด๋น ๋ฌธ์๊ฐ์๋ ๊ทธ๋๋ก ์ ๋ฌ๋๊ธฐ๋ฅผ ์ํ์ง ์๋ ํ ์ฌ์ฉํ์ง ๋ง์ญ์์ค. PowerShell์ ํ์ฌ "
๋ฌธ์๋ฅผ ๊ทธ๋๋ก ์ด์ค์ผ์ดํํ์ง _ ์๊ธฐ ๋๋ฌธ์
๋๋ค _. ๋น์ ์ ์ธ์์์ \"
๋ฐฐํ์์ node
์ด ๋ช
๋ น ์ค์์ ๋ณด๋ ๊ฒ์ console.log(`"hey`")
์ด๋ฉฐ, ์ด๋ ๋ ๊ฐ์ ์ง์ ์ธ์ ํ ๋ฌธ์์ด ๋ฆฌํฐ๋ด๋ก ๊ตฌ๋ฌธ ๋ถ์๋ฉ๋๋ค. ์ธ์ฉ๋์ง ์์ console.log(`
๋ฐ ํฐ ๋ฐ์ดํ "hey`"
. ๋ฐ๋ฆฌ ํ "
์ผ๋ก ์ธํด๋์ง ์๋๋ก _syntactic_ ๊ธฐ๋ฅ์ด์๋, \
์ ์ด ์ฃผ๋ฉฐ๋ฅผ ์คํํ๊ธฐ ์๋ฐ ์คํฌ๋ฆฝํธ ์ฝ๋๋ ๊ถ๊ทน์ ์ผ๋ก console.log(`hey`)
, ๊ทธ๊ฒ์ ๋จ์ง ๋๋ฌธ์ ์์
์ ์ด๋ป๊ฒ๋ฉ๋๊น `....`
์์ ์ธ์ธ ํ ํฐ์ ์๋ฐ ์คํฌ๋ฆฝํธ์ ๋ฌธ์์ด ๋ฆฌํฐ๋ด, ์ฆ _template literal_์ ํ ํํ์
๋๋ค.
@AndrewSav ๋๋ ๋ฏธ์น ํ
์คํธ ๊ฐ์ฒด๋ก ํ
์คํธํ์ผ๋ฉฐ ๋๋ฅผ ์ํด ์ผํ์ต๋๋ค! Linux์ Windows 5.1 ๋ฐ PS 7์์ ํ
์คํธ ๋ ๋งค์ฐ ์ฐ์ํ ์๋ฃจ์
์
๋๋ค. ๋ชจ๋ ๊ฒ์ ํฐ ๋ฐ์ดํ๋ก ๋ฌถ์ด๋ ๊ด์ฐฎ์ต๋๋ค. msiexec
๋๋ "
๋ช
์ ์ ์ผ๋ก ์ทจ๊ธํ๋ ๊ฒ์ผ๋ก ์๋ ค์ง sqlcmd
๋ ๋ค๋ฃจ์ง ์์ต๋๋ค.
๋ด ๊ฐ์ธ ๊ตฌํ์๋ ์ธ๊ธ ํ ๊ฒ๊ณผ ์ ์ฌํ ๊ฐ๋จํ ์ด์ค์ผ์ดํ ๋ ผ๋ฆฌ๋ ์์ต๋๋ค. https://github.com/choovick/ps-invoke-externalcommand/blob/master/ExternalCommand/ExternalCommand.psm1#L278
ํ์ง๋ง ํด๋น ๋ชจ๋ ๋ด์์ ์ค์๊ฐ์ผ๋ก STDOUT ๋ฐ STDERR ์ค๋ ๋๋ฅผ ํ์ํ๊ณ ์บก์ฒํ๋ ์ฝ๋๋ฅผ ๋ง์ด ์์ฑํ์ต๋๋ค ... ์๋ง๋ ํฌ๊ฒ ๋จ์ํ ํ ์ ์์ง๋ง ํ์๊ฐ ์์์ต๋๋ค ...
@ mklement0 ์ด ์ค๋ ๋๋ ๋๋์ง ์์ ๊ฒ์ ๋๋ค (: ๋๋ถ๋ถ์ ์ฌ์ฉ ์ฌ๋ก์ ์ ํฉํ๊ณ ์ฌ์ฉํ๊ธฐ์ ์ถฉ๋ถํ ๊ฐ๋จ ํ ps ๊ฐค๋ฌ๋ฆฌ์ ๊ฒ์ ๋ PowerShell ๋ชจ๋์ ์ ๊ณตํ๊ฑฐ๋ ๋ค๊ฐ์ค๋ ์ ธ ๊ฐ์ ์ ๊ธฐ๋ค๋ ค์ผํฉ๋๋ค.
GitHubGitHub์์ ๊ณ์ ์ ๋ง๋ค์ด choovick / ps-invoke-externalcommand ๊ฐ๋ฐ์ ๊ธฐ์ฌํ์ธ์.
@ mklement0 ์ด ์ค๋ ๋๋ ๋๋์ง ์์ ๊ฒ์ ๋๋ค (: ๋๋ถ๋ถ์ ์ฌ์ฉ ์ฌ๋ก์ ์ ํฉํ๊ณ ์ฌ์ฉํ๊ธฐ์ ์ถฉ๋ถํ ๊ฐ๋จ ํ ps ๊ฐค๋ฌ๋ฆฌ์ ๊ฒ์ ๋ PowerShell ๋ชจ๋์ ์ ๊ณตํ๊ฑฐ๋ ๋ค๊ฐ์ค๋ ์ ธ ๊ฐ์ ์ ๊ธฐ๋ค๋ ค์ผํฉ๋๋ค.
PowerShell ํ์ด ํ๋ก๊ทธ๋จ ์์ฒด์์์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ์๊ธฐ๋ก ๊ฒฐ์ ํ๋ฉด ์ธ๋ถ ํ๋ก๊ทธ๋จ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ๋ฐ๋ฅด๊ฒ ์คํํ ์์๋ ์ ธ์ด ๋ด๊ฐ ์ ํํ ์ ธ์ด ์๋๋ผ๊ณ ๋งํ ๊ฒ์ ๋๋ค! ์ด๋ค์ PowerShell์์ ๋๋ฝ ๋ ๊ธฐ๋ณธ ํญ๋ชฉ์ ๋๋ค.
@aminya ์ , ๋๋ ๋ฌธ์ ๋ก ์ด๋ํด์ผ ํ ๋ ๋ฌธ์ ๊ฐ ๋งค์ฐ ์ง์ฆ๋๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ์๋์ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ทธ๋งํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
๋๋ PS ํ์ด ์์ผ๋ก ์ด๊ฒ์ ๊ฐ์ ํ์ฌ ๋ ๋ณต์กํ๊ฒ ๋ง๋ค๊ธฐ๋ฅผ ์ ๋ง๋ก ๋ฐ๋๋๋ค.
์์ ์ฌํญ์ ๊ตฌํํ๋ ๊ฒ์ ์์ฌ ํ ์ฌ์ง์์ด ์์ฒญ๋ ๋ณํ์ด๋ฏ๋ก ์๋ง๋ ์ตํธ ์ธ์ด ํ์ํ ๊ฒ์ ๋๋ค.
https://github.com/PowerShell/PowerShell-RFC/pull/90 ๊ตฌํ์ ์๋ฏธ
@aminya , ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ์ธ๋ถ ํ๋ก๊ทธ๋จ์ ํธ์ถํ๋ ๊ฒ์ด ์ ธ์ ํต์ฌ ๋ช ๋ น์ด๋ฉฐ ์ ๋๋ก ์๋ํด์ผํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค.
@choovick ์์ ์ ์ํ ๋ชจ๋์ ๋ณด์์ ์ค์ํ ์์ ์ ์ฉ ์ ์ง ๊ด๋ฆฌ ๋ชจ๋์์๋ _Windows PowerShell_์ ์ฌ์ ํ ์ ํฉํฉ๋๋ค.
๋ณด์ ์ ์ผ๋ก, ์ธ๋ถ ํ๋ก๊ทธ๋จ ํธ์ถ์ ๋ํ ์ ์ ๋ ๊ฐ๋
๋์๋ง ํญ๋ชฉ์ด ์์ฑ๋๋ฉด https://github.com/MicrosoftDocs/PowerShell-Docs/issues/5152 ์ฐธ์กฐ -์ด์ ๋ฒ์ / Windows PowerShell์ ๋ฌธ์ ๋ฅผ ์์ ํ๋ ๋์ฐ๋ฏธ ํจ์, ์์ @TSlivede ์ ๊ฐ์ด ์ง์ ๊ฒ์ ํ ์ ์์ต๋๋ค.
@iSazonov ์, https://github.com/PowerShell/PowerShell-RFC/pull/90 ๊ตฌํ์ ์ ๊ฐ ์๋ฏธํ๋ ๋ฐ์ ๋๋ค .
์ค๋ ๋๋ ๋๋์ง ์๊ณ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํ ์ฐ๋ ค๊ฐ ์์ต๋๋ค.
๋งํฌ ๋ RFC์ ๋ํ ๋ง์ง๋ง ๊ณต์ ์๋ต์ 2019 ๋ 7 ์ 8 ์ผ๋ถํฐ @joeyaiello ์์ด ๋๊ธ ์ด์์ต๋๋ค (๊ฐ์กฐ ์ถ๊ฐ๋จ).
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋์ด [RFC] ๊ฐ ๊ธฐ์กด ํ๋๊ณผ ๊ด๊ณ์์ด ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๊ด๊ณ์์ด ์์ฒญ๋ ์๋ฏธ๋ฅผ ๊ฐ๋๋ค ๊ณ ์๊ฐ ํฉ๋๋ค. ์ด์ ์คํ์ ๊ธฐ๋ฅ์ด ์์ผ๋ฏ๋ก ์คํ์ ๊ธฐ๋ฅ ํ๋๊ทธ ๋ค์์ด ๊ธฐ๋ฅ์ ์ค๋ ๊ตฌํํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐ
_ ๊ฐ์ธ์ ์ผ๋ก _, _ ๊ธฐ๋ณธ์ ์ผ๋ก _ ํ๋์ ๊ณ ์น๋ ๊ฒ์ ์ค์ํ์ง ์์ต๋๋ค. ๋น๋ก ๊ทธ๊ฒ์ด ์ฃผ์ ๋ณ๊ฒฝ์ด๋ผ๊ณ ํด๋ ๋ง์ ๋๋ค. RFC๋ ์ค์ ๋ก์ด๋ฅผ ์ ์ํ๊ณ _old_ (๊นจ์ง) ๋์์ ์ํ๋ค๋ฉด ์ตํธ ์ธ์ ์ ์ํฉ๋๋ค.
์ ์ง ๊ด๋ฆฌ ํ ๋ ๊ฑฐ์ ์ฝ๋๊ฐ์๋ ์ฌ๋๋ค์ด ๋ฐ๋ ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. _ ๊ธฐ์กด์ ๋ชจ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ๊ธฐ๋ฅ์ ๋ฉ์ถ ๊ฒ์ ๋๋ค _- ์ ์ฐธ์กฐ-์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ ์งํ๋ ๊ฒ์ด ์ฌ์ ํ ์ค์ํ ๋ชฉํ ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
์๋กญ๊ณ ๊ณ ์ ๋ ๋์์ด ์ตํธ ์ธ ๋ ๊ฒฝ์ฐ ์ฌ๋ฐ๋ฅธ ๋์์ ์ป๊ธฐ ์ํด ๋ฌด์ธ๊ฐ๋ฅผํด์ผํ๋ ์ด์ํจ์ด ์ฌ์ ํ ์์ง๋ง ์ ์ด๋ ๊ธฐ์กด ์ฝ๋๋ ์์๋์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ธฐ์กด ์ตํธ ์ธ ๋ฉ์ปค๋์ฆ ์์ฒด๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ด์ @KirkMunro ์ ์ ํ์ ๊ธฐ๋ฅ RFC ๊ฐ ๊ฑฐ๋ถ๋์์ผ๋ฏ๋ก _preference ๋ณ์ _๊ฐ ๊ฑฐ์ ๋จ๊ณ PowerShell์ ๋์ ๋ฒ์ ์ง์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์๋ก์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋๋ก ์ค๊ณ๋์ง ์์ ์ตํธ ์ธ ๋ฒ์์์ ํธ์ถ ๋ ํ์ฌ ์ฝ๋ ๊ทธ๋ฐ ๋ค์ ๊ตฌํ์ด ์ค๋จ ๋ ์ ์์ต๋๋ค (๊ธฐ๋ณธ ์ค์ ๋ณ์๊ฐ ์ผ์์ ์ผ๋ก ์ฌ์ค์ ๋์ง ์๋ ํ).
_Lexical_ ์ฌ๊ธฐ์ ์ตํธ ์ธ ๋ฒ์๊ฐ ํ์ํ์ง๋ง ํ์ฌ๋ ์์ต๋๋ค. Strict ๋ชจ๋์ _lexical_ ๋ฒ์ ์ง์ ์ ๋ํ RFC ๋ using
๋ฌธ (ํนํ ์ผ๋ฐ์ ์ผ๋ก _dynamically_ ๋ฒ์)์ ํตํด ์ดํ ๋ฒ์ ๊ธฐ๋ฅ (๋๋ ๋ค๋ฅธ ๋ชฉ์ )์ ๊ตฌํ์ ์ ์ํฉ๋๋ค. ์ด ํจํด์ ๋ฐ๋ผ ์ดํ ๋ฒ์์ using ProperExternalArgumentQuoting
๋ฌธ (์ด๋ฆ์ WIP :) (๊ธฐ์ ์ ์ผ๋ก ๊ฐ๋ฅํ ๊ฒฝ์ฐ)์ ๊ณ ๋ คํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ PowerShell์์ํ๊ฐ (๋ค์) ๊ฒํ ํ๊ณ ์ง๋ฌธ์ด ๋ฐ์ํ ๋๋ง๋ค _timely_ ํผ๋๋ฐฑ๊ณผ ํจ๊ป ์งํ ๋ฐฉ๋ฒ์ ๋ํ ๋ช ํํ ์ง์นจ์ ์ ๊ณตํด์ผํฉ๋๋ค. @ SteveL-MSFT?
โข ๊ทธ๋๋ ์ฐธ๊ณ --%
7.1 ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ์ํด ์์ -like ์๋ฃจ์
(์ฐธ์กฐ ์ ) (๋๋ ๊ฐ์ธ์ ์ผ๋ก ์๊ฐํ๋ ๊ฐ์น ์ถ๊ตฌํ์ง ์์ต๋๋ค - ๋ณผ ์์ ์ ์ด ๋๊ธ ) - PowerShell์์ ๊ธฐ๋ณธ์ ๊ณ ์ ํ๋ _separate_ ๊ธฐ๋ฅ์ด ๋ ๊ฒ์
๋๋ค (๋น ์๋ฎฌ๋ ์ด์
) ํ๋์ ์ฌ์ ํ โโํ์์
๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ๋๋ ๊ทธ๊ฒ์ด ์ฃผ์ํ ๋ณํ ์์๋ ๋ถ๊ตฌํ๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋์ ๊ณ ์น๋ ๊ฒ์ ์ ๊ฒฝ ์ฐ์ง ์์ ๊ฒ์ ๋๋ค. RFC๋ ์ค์ ๋ก์ด๋ฅผ ์ ์ํ๊ณ ์ด์ (๊นจ์ง) ๋์์ ์ํ๋ค๋ฉด ์ตํธ ์ธ์ ์ ์ํฉ๋๋ค.
์๋กญ๊ณ ๊ณ ์ ๋ ๋์์ด ์ตํธ ์ธ ๋ ๊ฒฝ์ฐ ์ฌ๋ฐ๋ฅธ ๋์์ ์ป๊ธฐ ์ํด ๋ฌด์ธ๊ฐ๋ฅผํด์ผํ๋ ์ด์ํจ์ด ์ฌ์ ํ ์์ง๋ง ์ ์ด๋ ๊ธฐ์กด ์ฝ๋๋ ์์๋์ง ์์ต๋๋ค.
๋์ํฉ๋๋ค. ์ฌ์ค ์ ๋ ๊ธฐ๋ณธ๊ฐ์ ๊นจ๋จ๋ฆฐ ๋ค์ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํ ๋ฒ๊ทธ ๋ผ๋ ์ฌ์ค์ ๊ฐ์ํ ๋, ์๋ก์ด ๋์์ ์ ํ ํด์ ๊ฐ ์๋ ์ ํ์ด์ด์ผํฉ๋๋ค. ์๋ํ๋ฉด ์๊ธฐ์น ์๊ฒ ์ค๋จ๋๊ธฐ ์ฌ์ด ๊นจ์ง ์ธ๋ถ ์ ธ ํธ์ถ์ ๊ณ์ ๊ถ์ฅํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฐฉ๋ฒ. ์ด์จ๋ PowerShell 7์ ๋ ๊ฑฐ์ Windows PowerShell๋ณด๋ค ๊ฐ์ ํ๊ธฐ ์ํด ๋ ธ๋ ฅํด์ผํฉ๋๋ค.
@ SteveL-MSFT์ ์ ๋ # 13068์ ์ฐฌ์ฑํ์ฌ ์ด๊ฒ์ ๋ซ์์ผํ๋ค๋ ๋ฐ ๋์ํ์ต๋๋ค. ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ๋ง์ง๋ ๊ฒ์ ๋ชจ๋ ํฐ ๋ณํ์ ์ง๋์ง ์์ผ๋ฏ๋ก ์ตํธ ์ธ ๋ชจ๋ ์ญํ ์ํ๋ ์ ์ด์์๋ฅผ ํตํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผํฉ๋๋ค.
# 13068์ด์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์ ํ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ํด๋น ์ฐ์ฐ์๊ฐ ์๋ ํ๋๋ก ๋์ ๋ ๊ฒฝ์ฐ ์ฃผ์ด์ง ์ธ์ ๋ฐฐ์ด ๋๋ ๋ณ์์์ ์์ฑ ๋ ์ฝํ ์ธ ์ ๋ช ์ ์ ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ดํฐ๋ธ ์คํ ํ์ผ์ ์ ๋๋ก ํธ์ถ ํ ์์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
@JustinGrote ๊ฐ ํด๋น ์ค๋ ๋์์ ์ ๊ณต ํ ์์
@joeyaiello ํด๋น ์ฐ์ฐ์๊ฐ ์ค์ ๋ก ์กด์ฌํ๊ณ ๋๊ตฐ๊ฐ๊ฐ์ด ์ค๋ ๋์์ ์ธ๊ธ ๋ ์ฐ์ฐ์๊ฐ ์ด๋ป๊ฒ ๊ฐ์ ํ ์ ์๋์ง ๋ณด์ฌ์ค ๋๊น์ง์ด ๋ฌธ์ ๋ฅผ ์ด์ด ๋ ์ ์์ต๋๊น?
์ ๊ทธ๋ฆฌ๊ณ Linux๋ ์ด๋ป์ต๋๊น? ์ด ๋ฌธ์ ๋ Windows์์๋ ์ด๋ฆฌ ์๊ณ ์์์น ๋ชปํ ๋ฌธ์ ์ด์ง๋ง Linux์์๋ ํจ์ฌ ๋ ์๋ฏธ๊ฐ ์์ต๋๋ค. ํนํ Linux powershell ์คํฌ๋ฆฝํธ์ ์ญ์ฌ๊ฐ ์์ด์ ๊นจ์ง ๊ฒ์ ๋๋ค.
์ด๊ฒ์ ๋ํ ํน์ ์ฐ์ฐ์๋ฅผ ๋ง๋๋ ๊ฒ์ ๋ช
๋ น ์ค ์
ธ์ ์ ํ ์๋ฏธ๊ฐ ์์ต๋๋ค. ์ฃผ๋ ์์
์ ํ๋ก๊ทธ๋จ์ ์์ํ๊ณ ์ธ์๋ฅผ ์ ๋ฌํ๋ ๊ฒ์
๋๋ค. ์ด ์์
์ ์ํด system()
๋ฅผ ์ํํ๋ ์ ์ฐ์ฐ์๋ฅผ ๋์
ํ๋ ๊ฒ์ ์ฐ์ ์ ๋ฒ๊ทธ๊ฐ ์๊ธฐ ๋๋ฌธ์ calc.exe
๋ฅผ ํธ์ถํ๋ ๋ฐฉ๋ฒ์ ๋์
ํ๋ Matlab๊ณผ ๊ฐ์ต๋๋ค. ๋์ ํด์ผ ํ ์ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Start-Process
์๋ ๋์ผํ๊ฒ ์ ์ฉ๋ฉ๋๋ค. (์ฌ์ค -QuotingBehavior Legacy
...์ ๊ฐ์ ์ผ๋ถ ์ต์
์ด์๋ "new"cmdlet์ ๋ํ ๊ฝค ์ข์ ํ๋ณด์
๋๋ค.) # 13089๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
Powershell์ด์ด ๋ ์ํฉ์์ ๋ค๋ฅด๊ฒ ์๋ํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ํนํ, ๊ณต๋ฐฑ์ ํฌํจํ๋ ์ธ์๋ฅผ ํฐ ๋ฐ์ดํ๋ก ๋ฌถ์ด ์ผ๊ด์ฑ์์ด ๋ํํฉ๋๋ค.
v.7์์ ์ผ๊ด๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ต๋๋ค. ๊ณ ์ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
PING 'A \"B'
Ping ์์ฒญ์ด ํธ์คํธ A "B๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
PING 'A\" B'
Ping ์์ฒญ์ด ํธ์คํธ A "B๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
ping
๋์ด์ผํ๋ ์ถ์ด ํธ์คํธ ์ด๋ฆ์ A \"B
๋ฐ A\" B
-_with_ \
๋ฌธ์์ด๊ธฐ ๋๋ฌธ์ ์์ ๋์ง ์์์ต๋๋ค.
PowerShell์ ์ ธ๋ก์ _its_ ๊ท์น์ ๋ฐ๋ผ ์ธ์๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ ํ ๋ค์ ๋์ ํ๋ก์ธ์ค๊ฐ PowerShell ์์ฒด ๊ตฌ๋ฌธ ๋ถ์์ ๊ฒฐ๊ณผ์ ๋์ผํ ์ถ์ด ๊ฐ์ ๋ณผ ์ ์๋๋ก ํฌ๋ช ํ๊ฒ ํ์ธํด์ผํฉ๋๋ค.
_other_ ์
ธ-์ ๋ฌ ๋ ๊ฐ๋ณ ์ธ์๋ฅผ ์ถ์ถํ๊ธฐ ์ํด _command line_์ ๊ตฌ๋ฌธ ๋ถ์ํด์ผํ๋ ๋ฐฉ์์ผ๋ก ์์ ์ ์
ธ์ฒ๋ผ ์๋ํด์ผํ๋ Windows์์ ์คํ๋๋ ๋ถ๋ ํ๋ก๊ทธ๋จ- \
๋ฅผ ์ด์ค์ผ์ดํ๋ก ์ฌ์ฉ ๋ฌธ์๋ ์ฌ๊ธฐ์ ๊ทธ๋ฆผ์ ์
๋ ฅํด์๋ ์๋ฉ๋๋ค. (Windows์์๋ง ํ์ํ๊ณ Unix์์๋ ์ถ ์ด์ ์ธ์๋ฅผ ๋ฐฐ์ด๋ก ์ง์ ์ ๋ฌํ๊ธฐ ๋งํ๋ฉด๋ฉ๋๋ค) PowerShell์ด โโ์ ์ญํ ์ํ๋ _behind the scenes_.
์ ์ณ๋๊ณ , PowerShell ์์ฒด๊ฐ "
_inside '...'
_ (์์ ๋ฐ์ดํ๋ก ๋ฌถ์ธ ๋ฌธ์์ด)์ ์ด์ค์ผ์ดํ๋ฅผ ์๊ตฌํ์ง ์๋ ๊ฒ์ฒ๋ผ bash
์ ๊ฐ์ POSIX ํธํ ์๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ์๋ฅผ ๋ค์ด bash
์์ ์คํํ๋ฉด /bin/echo 'A \"B'
(๋ถ๋ช
ํ๊ฒ) A \"B
์ธ์ํฉ๋๋ค ( \
๋ ์์ ๋ฐ์ดํ๋ก ๋ฌถ์ธ ๋ฌธ์์ด์์ ๋ฆฌํฐ๋ด๋ก ์ฒ๋ฆฌ๋จ). PowerShell์์ (์๊ธฐ์น ์๊ฒ) ๋งค์ฐ ๋์ผํ ๋ช
๋ น์ด ์์ฑ๋ฉ๋๋ค.
A "B
- \
๋๋ฝ-์ฌ๊ธฐ์์ ๋
ผ์ ๋ ๋ฌธ์ ์ ํํ์
๋๋ค.
๋๋ ๋ช ํํํด์ผํ๋ค :
๊ถ๊ทน์ ์ผ๋ก A "B
_verbatim_์ ์ ๋ฌํ๋ ค๋ ๊ด์ ์์ PowerShell์์ 'A "B'
๋ฅผ ์ฌ์ฉํ ์ ์์ด์ผํฉ๋๋ค.
PowerShell์ด โโํ์ฌ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๊ตฌ์ฑํ๋ ๋ช
๋ น ์ค์๋ "A "B"
๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ๋์ ํ๋ก์ธ์ค๋ A B
๋ก ํ์๋ฉ๋๋ค. ์ฆ, _embedded_ "
๋ฅผ ์ด์ค์ผ์ดํํ์ง ์๊ณ "..."
์ ๋ธ๋ผ์ธ๋ ์ํด๋ก์ ์
๋๋ค. "
๋ ์ฝ์
๋ "
์ ํจ๊ณผ์ ์ธ ์์ค์ ์ด๋ํ์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๋นํ์ธ๋ ์คํ ๋ฆฌ ๋ช
๋ น ์ค์์ PowerShell _should_ ์ฌ์ฉํ๋ ๊ฒ์ "A \"B"
์
๋๋ค. ์ฆ, ํฌํจ ๋ "
\
-escaping์ด ํ์ํฉ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก, ๊ฐ์ ๋ธ๋ผ์ธ๋ ์ธํด๋ก์ ๋ ์์ธ์ด 'A \"B'
ํํํ๋๋ก "A \"B"
๋งํ์๋ ๊ทธ๋์ _embedded_ ์ค์ ํ๋ ์ผ์ด ์ค ๋ช
๋ น \"
_escaped_๋ก๋ฅผ "
๋ฌธ์, ๋ฐ๋ผ์ ๋์ ํ๋ก์ธ์ค๋ A "B
๋ก ๊ฐ์ฃผํฉ๋๋ค. ์ฆ, _automatic_ ์ด์ค์ผ์ดํ๊ฐ ์๊ธฐ ๋๋ฌธ์ ํฌํจ ๋ \
์ ํจ๊ณผ์ ์ธ ์์ค์ด ๋ฐ์ํ์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๋นํ์ธ๋ ์คํ ๋ฆฌ ๋ช
๋ น ์ค์์ PowerShell _should_ ์ฌ์ฉํด์ผํ๋ ๊ฒ์ "A \\\"B"
์
๋๋ค. ์ฆ, \
๋ฐ "
์ด์ค์ผ์ดํ๊ฐ ํ์ํฉ๋๋ค.
ping
๋์ด์ผํ๋ ์ถ์ด ํธ์คํธ ์ด๋ฆ์A \"B
๋ฐA\" B
-_with_\
๋ฌธ์์ด๊ธฐ ๋๋ฌธ์ ์์ ๋์ง ์์์ต๋๋ค.
"๊ทธ๊ฒ"์ ์ฌ๊ธฐ์์ ์ธ์ฉ ๋ ๋ถ๋ง์ ์๋ฏธํ๋ฉฐ ๋คํํ๋ ์ฌํ ํ ์ ์์ต๋๋ค.
@ yecril71pl , ๋ด๊ฐ ๋ณธ๋ค : ๋ด (์๋ชป๋) ๊ฐ์ ์ "ํฐ ๋ฐ์ดํ ์์ ๊ณต๋ฐฑ์ ํฌํจํ๋ ์ธ์๋ฅผ ์ผ๊ด์ฑ์์ด ๋ํ"ํ๋ ๊ฒ์ ์ฝ์
๋ "
๋ฐ \
๋ฌธ์ _์ ์๋ ์ด์ค์ผ์ดํ _ ๋ถ์กฑ์ ๋ํ๋
๋๋ค. ์ด์ ์๊ฒฌ์์ ์ค๋ช
ํ์ต๋๋ค. ์ด๊ฒ์ด์ด ๋ฌธ์ ์ ํต์ฌ์
๋๋ค.
Windows PowerShell์๋์๋ PowerShell Core์ ์ฌ์ํ ์์ ์ฌํญ์ด ์์ต๋๋ค. ์ง๊ธ์ ํ๋๋ง ์๊ฐํ ์ ์์ต๋๋ค.
\
๊ฒฝ์ฐ ๋ธ๋ผ์ธ๋ ํฐ ๋ฐ์ดํ๋ฅผ ์ฌ์ฉํฉ๋๋ค. 'A B\'
๊ฐ (๋ถ๋ฌ์ง) "A B\"
๋ก ๋ฐ๋๋๋ค.-PS Core๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํฉ๋๋ค ( "A B\\"
). .์ด repo๋ PS Core ์ ์ฉ์ด๋ฏ๋ก PS Core์์ ์ฌ์ ํ ์์๋ ๋ถ๋ถ์ ์ง์คํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํฉ๋๋ค (์ฐจ์ด์ ์ ์ธ๊ธํ๋ ๊ฒ์ด ๋์์ด ๋ ์ ์์ง๋ง _ ์ ์ธ๋ก _ํ์ง๋ง ํด๋น ์ธก๋ฉด์ ๋ช ์ ์ ์ผ๋ก ๋ง๋๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค).
๊ทธ๋ฆฌ๊ณ ์ผ๋์ ๋์๋ ์๋๋ฆฌ์ค์กฐ์ฐจ๋ _ ์์ง PS Core์์ ๊นจ์ก์ต๋๋ค.ํ์ง๋ง _ ์ธ์์์ \
๋ฅผ ์๋ต ํ ๊ฒฝ์ฐ์๋ง _ :
'A" B'
์ ๋ฌํ๋ฉด ์ฌ์ ํ ๋ฐฐํ์์ _non_-double-quoted A" B
๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํฉ๋๋ค ( 'A\" B'
๊ฒฐ๊ณผ "A\" B"
๊ฒฐ๊ณผ๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ๋ค๋ฅด๊ฒ).
์ด repo๋ PS Core ์ ์ฉ์ด๋ฏ๋ก PS Core์์ ์ฌ์ ํ ์์๋ ๋ถ๋ถ์ ์ง์คํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํฉ๋๋ค (์ฐจ์ด์ ์ ์ธ๊ธํ๋ ๊ฒ์ด ๋์์ด ๋ ์ ์์ง๋ง _ ์ ์ธ๋ก _ํ์ง๋ง ํด๋น ์ธก๋ฉด์ ๋ช ์ ์ ์ผ๋ก ๋ง๋๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค).
๋ฉํ ์ ์ณ๋๊ณ : ๋ค๋ฅธ ์ฌ์ฉ์์ ๋๊ธ์ ์ธ๊ธ ๋ ์๋ชป๋ ํ๋์ด ์ ์ฉ๋์ง ์๋๋ค๋ ๊ฒ์ ์๋ ๊ฒ์ด ์ ์ฉํฉ๋๋ค. ๋ฌผ๋ก ์ฌ์ฉ์๊ฐ ํ์ฌ ๋ฒ์ ์ ํ์ธํ์ง ์์๊ธฐ ๋๋ฌธ์ ๋๊ธ์ ๋ฌด์ํ ์๋ ์์ต๋๋ค. ์. ๋ฌด์ง์ํ ๊ธฐ์๋ค์ด ๋ฌด์ง์ํ๊ณ ์๋์ง ํ์ธํ๋ ๊ฒ์ด ์ฌ์ ํ ์ข์ต๋๋ค. IMHO.
๊ฑฐ๊ธฐ์๋ ์ธ์๊ฐ ์์ง๋ง _asides_์ _ ์ ์ ํ ํ๋ ์ด๋ฐ ๋ฐ ์ปจํ ์คํธ _๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ค์ ๋ก ์ธ์ฉ๋๋ ์๋ ์ฃผ์์ _link_).
์ด ํ ๋ก ์ด ์ฐจ์ด๋ฅผ ๋ง๋๋์ง ๊ถ๊ธํฉ๋๋ค. ์์ํ์ ๊ฒฐ์ ์ ์ปค๋ฎค๋ํฐ๊ฐ ์ํ๋ ๊ฒ๊ณผ๋ ๋ฌด๊ดํฉ๋๋ค. ํ๊ทธ๋ฅผ๋ณด์ญ์์ค : Resolution- won't fix.
๊ทธ๋ฌ๋ PowerShell์ ์คํ ์์ค (MIT)์ด๊ธฐ ๋๋ฌธ์ ์ปค๋ฎค๋ํฐ๋์ด๋ฅผ ๋ณ๋์ ํฌํฌ์์ ์์ ํ ์ ์์ผ๋ฉฐ์ด PowerShellCommunity ( pwshc
)๋ฅผ ์งง๊ฒ ํธ์ถ ํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ด ํ์ํ์ง ์์ต๋๋ค. ๋์ค์ PowerShell 8์์์์ํ๋ ํฌํฌ๋ฅผ ํตํฉ ํ ์ ์์ต๋๋ค.
์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ ์ ๋ณด : PowerShell์ ์ด๋ค ์ด์ ์ฒด์ ์๋ ์ฌ์ ์ค์น๋์ด ์์ง ์์ผ๋ฉฐ, ์ ์๊ฒ PowerShellCommunity
์ค์น์ ์ด๋ ค์์ PowerShell
์ ๋์ผํฉ๋๋ค. ๋๋ ๋ฏธ๋์ 8 ๋ฒ์ ์ ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋ ์ ์ฐ์ฐ์๋ก ์ฝ๋๋ฅผ ๋ ๋ณต์กํ๊ฒ ๋ง๋๋ ๋์ ์ปค๋ฎค๋ํฐ ๋ฒ์ ์ ์ค์นํ๊ณ ์ฆ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
์์ํ๋ ๋ชจ๋ ๊ฒ์ ๊นจ๋จ๋ฆฌ๊ธฐ๋ก ๊ฒฐ์ ํ๊ธฐ ๋๋ฌธ์ ๊ทธ๊ฒ์ด ์ผ๋ง๋ ์ฌํ๊ฒ ๊นจ ์ก๋์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋๋ ์ปค๋ฎค๋ํฐ๊ฐ ์ณ์ ์ผ์ํ๋ Invoke-Native
์ ํจ๊ป ์ด ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ค์ ์์ง์ ๋ฐํ์ฌ ๋ง์ดํฌ๋ก ์ํํธ์ ์ผ๊ตด์ ๊ตฌํ๋ ๊ฒ์ ์ปค๋ฎค๋ํฐ์ ์ผ์ด ์๋๋๋ค.
๊ทธ๋ค์ด ์ผ๋ง๋ ์ฌํ๊ฒ ๋ถ์ ์ก๋์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค
๋๋ ๊ทธ ์๊ฐ์ ๋ฌธ์ ๊ฐ ํด๊ฒฐ ๋ ์ ์๋๋ผ๋ ์์น์ ์ผ๋ก ์ฌ๋ฐ๋ฅธ ์ผ์ํ๋ ๋ฒ์ ์๋ ๊ฒ _ ์์น์ ์ผ๋ก, ๋๊ฐ ์ค๋ฉด _ ์ค์ํ ์ผ์ ์๋ ๊ฒ-๊ทธ ์๊ฐ์ด _ ์ ๋ _ ์ฃผ์ด์ง ์ธ์ด์ ๋งฅ๋ฝ์์ ์ค์ง ์๋๋ผ๋ _ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค.
์ปค๋ฎค๋ํฐ๋ ์ณ์ ์ผ์ํ๋
Invoke-Native
์ ํจ๊ป ์ด ์ ์์ต๋๋ค.
ํ์คํ๊ฒ:
Invoke-NativeShell
์ ๊ฐ์ ๊ฒ์ # 13068์ ์ฃผ์ ์ธ _ ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก _๋ฅผ ๋ค๋ฃจ๋ฉฐ, ํด๋น ์ฌ์ฉ ์ฌ๋ก์ ๊ฒฝ์ฐ ์ด๋ฌํ cmdlet์ ์์ ๋ฐฉํธ์ด _ ์๋๋๋ค _ : ์ ์ ํ ์๋ฃจ์
์
๋๋ค-https://github.com/ ์ฐธ์กฐ PowerShell / PowerShell / issues / 13068 # issuecomment -656781439
_์ด _ ๋ฌธ์ ๋ _PowerShell ์์ฒด _ (ํ๋ซํผ -_ ๋ค์ดํฐ๋ธ _ ๊ธฐ๋ฅ์ ๊ดํ ๊ฒ์ด ์๋)๋ฅผ ์์ ํ๋ ๊ฒ์ด๋ฉฐ, ์ด์ ๋ํ _stopgap_ ์๋ฃจ์
์ ๋ฎ์ ์์์ ์ ๊ณตํ๋ ๊ฒ์
๋๋ค. _opt-in_-๋ฐ๋ผ์ ๊ธฐ๋ฅ iep
๋ฅผ ๊ธฐ๋ณธ -in ํจ์, ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ค์ง์ ์ผ๋ก ์ค๋จ ํ ์์๋ ํฅํ ๋ฒ์ ์์ _proper_ ์์ ์ ๋ณด๋ฅํฉ๋๋ค.
Microsoft์ ์ผ๊ตด์ ๊ตฌํ๋ ๊ฒ์ ์ปค๋ฎค๋ํฐ์ ์ผ์ด ์๋๋๋ค.
@aminya ์ ์ฐ๋ ค๋ ๋๊ตฐ๊ฐ์ ์ผ๊ตด์ ๊ตฌํ๋ ๊ฒ์ด ์๋๋ผ ์ ธ์ ํต์ฌ ์๋ฌด ์ธ ์์ญ์์ ๊ทผ๋ณธ์ ์ผ๋ก ์์๋ ํ๋์ ์์ ํ๋ ๊ฒ์ ๋๋ค.
์ฆ, ํฌํฌ๋ก PowerShell ์์ฝ ์์คํ ์ ์กฐ๊ฐํํ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ง๊ธ์์ด ๋ชจ๋ ๊ฒ์ ์๋ต ํ ์๊ฐ์ด ์์ง๋ง ์ด๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํ๋ฏ๋ก ๋ค์ ์์ํ๊ฒ ์ต๋๋ค.
ํด๋น ์ฐ์ฐ์๊ฐ ์ค์ ๋ก ์กด์ฌํ๊ณ ๋๊ตฐ๊ฐ๊ฐ์ด ์ค๋ ๋์์ ์ธ๊ธ ๋ ์ฐ์ฐ์๋ฅผ ์ด๋ป๊ฒ ๊ฐ์ ํ ์ ์๋์ง ๋ณด์ฌ์ค ๋๊น์ง์ด ๋ฌธ์ ๋ฅผ ์ด์ด ๋ ์ ์์ต๋๊น?
๊ด๋ จ ๋ฌธ์ ์์ ๋งํ๋ฏ์ด ๋ค์ดํฐ๋ธ ํธ์ถ ์ฐ์ฐ์๋ UX์ ๋ณต์ก์ฑ ์ ์ถ๊ฐํ๊ณ ์๋ชป๋ ๋ฐฉํฅ์
๋๋ค.
๋์์ ์ฌ๊ธฐ์ ์ ์ฒด ๋
ผ์๋ ๋ค์ดํฐ๋ธ ์ ํ๋ฆฌ์ผ์ด์
๊ณผ์ ์ํธ ์์ฉ์ ๋จ์ํ ํ๋ ๊ฒ์
๋๋ค.
์ฐ๋ฆฌ๋ฅผ ๋ง๋ ์ ์ผํ ๊ฒ์ ๊ทธ๊ฒ์ด ํ๊ดด์ ์ธ ๋ณํ๋ผ๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๊ฒ์ด ๋๋ฌด ๋ง์ ํ๊ดด๋ผ๊ณ ์ฌ๋ฌ ๋ฒ ๋งํ์ง๋ง, ๊ทธ๊ฒ์ ํ๊ฐ ํด ๋ณด๊ฒ ์ต๋๋ค.
๋ํ ํ ์ธ์ ์ ์ดํด ๋ณด๊ฒ ์ต๋๋ค. ์ฌ์ฉ์๋ ์ PowerShell ๋ฒ์ ์ ์ค์นํ๊ณ ๊ธฐ๋ณธ ์ ํ๋ฆฌ์ผ์ด์ ์ ํธ์ถ ํ ๋ ์๋ก์ด ๋์์ ๋ฐ๊ฒฌํฉ๋๋ค. ๊ทธ๊ฐ ๋ญ๋ผ๊ณ ๋งํ ๊น์? "๊ฐ์ฌํฉ๋๋ค. ๋๋์ด ํ์ดํ ๋งํ๋ฉด ์๋ํฉ๋๋ค!"๋ผ๊ณ ๋งํ ๊ฒ์ ๋๋ค.
์คํฌ๋ฆฝํธ ์คํ / ํธ์คํ ์๋๋ฆฌ์ค๋ฅผ ์ดํด ๋ณด๊ฒ ์ต๋๋ค. ์๋ก์ด ๋ฒ์ ์ ์ ํ๋ฆฌ์ผ์ด์ (ํ๋๋ง ๋ณ๊ฒฝํ๋๋ผ๋!)์ ๋น์ฆ๋์ค ํ๋ก์ธ์ค๋ฅผ ๋ง์น ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ํญ์ ์ด๊ฒ์ ๊ธฐ๋ํ๊ณ ์ ๋ฐ์ดํธ ํ ํ๋ก์ธ์ค๋ฅผ ํ์ธํฉ๋๋ค. ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๋ฉด ๋ช ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
_ ๋ฒ์ ์ ๋ฐ์ดํธ๋ ํญ์ ๋ฌด์ธ๊ฐ๋ฅผ ๊นจ๋จ๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋ง์ง๋ง ์ต์ ์ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง ์ ์๊ณ ๋ฐ์ ๋ค์ผ ์์๋ ์ต์ ์ ๋๋ค ._
(ํ์ฌ PowerShell Core๋ Windows์ ๊ตฌ์ฑ ์์๊ฐ ์๋๋ฏ๋ก ํธ์คํ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ง์ ๋ง์น ์ ์์ผ๋ฉฐ ์คํฌ๋ฆฝํธ ๋ง ์ง์ ์ํฅ์ ๋ฐ๋๋ค๋ ์ ์ ์ง์ ํ๊ณ ์ถ์ต๋๋ค.)
์์์ Jason์ด ๋งํ ๊ฒ์ ์๊ธฐ์ํค๊ณ ์ถ์ต๋๋ค. ์ด๊ฒ์ ๋ฒ๊ทธ ์์ ์
๋๋ค.
๋ชจ๋ ์ฌ๋์ ์ํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ๋ชจ๋ ๊ฒ์ ๋จ์ํํ๊ฒ ์ต๋๋ค. ์ฌ์ฉ์๊ฐ powershell-y
ํฉ๋๋ค.
๊ด๋ จ ๋ฌธ์ ์์ ๋งํ๋ฏ์ด ๋ค์ดํฐ๋ธ ํธ์ถ ์ฐ์ฐ์๋ UX์ ๊ณต๋ชจ ๋ฅผ ์ถ๊ฐํ๋ฉฐ ์๋ชป๋ ๋ฐฉํฅ์ ๋๋ค.
๋ณต์ก์ฑ โ
๋ํ ํ ์ธ์ ์ ์ดํด ๋ณด๊ฒ ์ต๋๋ค. ์ฌ์ฉ์๋ ์ PowerShell ๋ฒ์ ์ ์ค์นํ๊ณ ๊ธฐ๋ณธ ์ ํ๋ฆฌ์ผ์ด์ ์ ํธ์ถ ํ ๋ ์๋ก์ด ๋์์ ๋ฐ๊ฒฌํฉ๋๋ค. ๊ทธ๊ฐ ๋ญ๋ผ๊ณ ๋งํ ๊น์? "๊ฐ์ฌํฉ๋๋ค. ๋๋์ด ํ์ดํ ๋งํ๋ฉด ์๋ํฉ๋๋ค!"๋ผ๊ณ ๋งํ ๊ฒ์ ๋๋ค.
์ ๋ ๋ค๋ฅธ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ์๋ก์ด ์ฌ์ฉ์๊ฐ PowerShell์ ์ฌ์ฉํด๋ณด๊ณ , ๋ถ๊ฐ์ฌ์ํ๊ฒ ์คํจํ๋ค๋ ์ฌ์ค์ ๊นจ๋ซ๊ณ , ํด์งํต์ผ๋ก ์ฎ๊ธฐ๊ณ ์ ๋ ๋ฐํํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ ๋ด๊ฐ ํ ์ผ์ ๋๋ค.
์คํฌ๋ฆฝํธ์ ๋ํ ๋น ๋ฅธ ์์ ์ค๋น
๊ทธ๊ฒ์ ์ฌ์ฉ์ ์คํฌ๋ฆฝํธ์์ ๋ช ๋ฐฑํ ๊ฒฝ์ฐ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด ์ฐ๋ฆฌ๊ฐํด์ผ ํ ์ผ์ ๋๋ค.
๋ถ๊ฐ์ฌ์ํ๊ฒ ์คํจํ๋ค๋ ๊ฒ์ ๊นจ๋ซ๋ค
์ฌ๊ธฐ์ ์ ์ฒด ๋ ผ์๋์ด "์ ๋นํ ์คํจ"๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ๋จ์ํํ๋ฉด์ ์๋ก์ด ์ ๋นํ ๊ฒ๋ค์ ์ถ๊ฐํ์ง ์๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
์ฌ๊ธฐ์์ ์ ์ฒด ๋ ผ์๋ ์ด๊ฒ์ ์ ๊ฑฐํ๋ ๊ฒ์ ๊ดํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ๋จ์ํํ๋ฉด์ ์๋ก์ด ์ ๋นํ ๊ฒ๋ค์ ์ถ๊ฐํ์ง ์๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
์ฐ๋ฆฌ๋ ์คํ ๊ฐ๋ฅํ ํ๋ก๊ทธ๋จ์ ์ง์ ํธ์ถํ๋ ๊ธฐ๋ฅ์ ์์ ๊ณ ์ถ์ง ์์ต๋๋ค.
์ด์ ํธ์ถ์ ๋ฌด์ธ๊ฐ๊ฐ ์ด๋ฏธ ์ธ์ฉ๋์๋์ง ์ฌ๋ถ๋ฅผ ์ถ์ธกํ์ฌ cmdline์ ์ง์ ์ ์ด์ง ์์ต๋๋ค. ๋ํ, ์๊ธฐ ๋ฅ๋ ฅ์ ์ฌ์ ํ-%๋ก ์ ์ง๋ฉ๋๋ค.
๋ํ, ์๊ธฐ ๋ฅ๋ ฅ์ ์ฌ์ ํ-%๋ก ์ ์ง๋ฉ๋๋ค.
--%
์๋ ๋ฏธ๋ฆฌ ์ ์ ๋ ๋ช
๋ น ์ค์ด ํ์ํ๋ฏ๋ก ์ ํธ๋ฆฌํฐ๊ฐ ์ ํ๋ฉ๋๋ค.
๋ฟก ๋นต๋จ
์ฐ๋ฆฌ๋ ์คํ ๊ฐ๋ฅํ ํ๋ก๊ทธ๋จ์ ์ง์ ํธ์ถํ๋ ๊ธฐ๋ฅ์ ์์ ๊ณ ์ถ์ง ์์ต๋๋ค.
@iSazonov ๋ ๋ฒ๊ทธ๊ฐ์๋ ๋์์ ์ ๊ฑฐํ๋ ๊ฒ์ ์๋ฏธํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฆ, ๊ธฐ์กด์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊นจ๋ ๊ฒ์ ์๋ฏธํ๋๋ผ๋ ๋ฒ๊ทธ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์์ (์ถ๊ฐ ๊ตฌ๋ฌธ์ ํตํ ์ตํธ ์ธ์์ด)ํ๋ ๊ฒ์ ๋๋ค. ๋ง์์, @iSazonov?
@ Artoria2e5 :
์ด์ ํธ์ถ์ ์ด๋ฏธ ์ธ์ฉ๋์๋์ง ์ฌ๋ถ๋ฅผ ์ถ์ธกํ์ฌ cmdline์ ์ง์ ์ ์ด์ง ์์ต๋๋ค.
[_ ์ ๋ฐ์ดํธ _ : ์ธ์ฉ ๋ ์ค์ ์๋ชป ์ฝ์์ง๋ง ์ ๋ณด๊ฐ ์ฌ์ ํ ํฅ๋ฏธ ๋กญ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.]
_guess_ ํ ํ์๊ฐ ์์ผ๋ฉฐ ๊ท์น์ ๊ฐ๋จํฉ๋๋ค.
'/foo bar/someutil
'-๋ฐ / ๋๋ _variable ์ฐธ์กฐ (๋๋ ํํ์)๊ฐ ํฌํจ ๋ ๊ฒฝ์ฐ- $HOME/someutil
- &
๊ฐ _required_ ์ธ ๊ฒฝ์ฐ์๋ง ํด๋น๋ฉ๋๋ค.์ด๋ฌํ ์๊ตฌ๊ฐ ๋ถํํ๋ค๊ณ ์๊ฐํ ์๋ ์์ง๋ง PowerShell ์ธ์ด์ ํต์ฌ์ด๋ฉฐ ๋ ๊ฐ์ง ๊ธฐ๋ณธ ๊ตฌ๋ฌธ ๋ถ์ ๋ชจ๋ ์ธ ์ธ์ ๋ชจ๋์ ํํ์ ๋ชจ๋๋ฅผ ๊ตฌ๋ฌธ ์ ์ผ๋ก ๊ตฌ๋ณ ํ ์ ์์ด์ผํฉ๋๋ค.
&
ํธ์ถ์ด ํ์ํฉ๋๋ค.์ด ๊ฐ๋จํ ๊ท์น์ ์ธ์ฐ๊ณ ์ถ์ง ์๋ค๋ฉด ๋ ๊ฐ๋จํ ๊ท์น์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. _always_ use &
, ๋น์ ์ ๊ด์ฐฎ์ ๊ฒ์
๋๋ค-์๋ฌด๊ฒ๋ ํ์ํ์ง ์์ ๊ฒ๋ณด๋ค๋ ๋ค์ ๋ ํธ๋ฆฌํ์ง๋ง ์ ํํ ๊ณ ๋์ ์๋๋๋ค (๊ทธ๋ฆฌ๊ณ ๋ ์งง์ต๋๋ค. --%
, ์ด๊ฒ์ ์ ๋์ ์ผ๋ก ์๋ชป๋ ์๋ฃจ์
์
๋๋ค-์๋ ์ฐธ์กฐ)
์๊ธฐ ๋ฅ๋ ฅ์ ์ฌ์ ํ-%๋ก ์ ์ง๋ฉ๋๋ค.
[_ ์ ๋ฐ์ดํธ _ : ์ธ์ฉ ๋ ์ค์ ์๋ชป ์ฝ์์ง๋ง ์ ๋ณด๊ฐ ์ฌ์ ํ ํฅ๋ฏธ ๋กญ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.]
์๋์, # 13068๊ณผ _this_ ๋ฌธ์ ์ ๋ถํํ ํผ๋์๋ ๋ถ๊ตฌํ๊ณ , --%
-_its_, ๋ณํจ์์ด _platform-specific_ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ _native shell_์ ํธ์ถํ๋ ๊ธฐ๋ฅ์ ๋น๋ฉดํ ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์๋๋๋ค. ๊ทธ๊ฒ์ ํผ๋์ ๋ํ ๋ฟ์
๋๋ค .
--%
๋ ๋งค์ฐ ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก์ด๋ฉฐ ํ์ฌ ์ ์ ๋๋๋ก ์ฌ๊ฐํ ์ ํ์ด ์์ต๋๋ค. _operator_๋ฅผ ๋์
ํ ๊ฐ์น๊ฐ _ ์์ _ ๋ฌด์ธ๊ฐ๊ฐ ์๋ค๋ฉด (๋๋ ๊ธฐ์กด์ ๋์์ ๋ณ๊ฒฝํ๋) ๋ช
๋ น ์ค์ ๋ค์ดํฐ๋ธ ์
ธ์ ์ ๋ฌํ ์์๋ ๋ฅ๋ ฅ์
๋๋ค (๋ฌผ๋ก sh -c '...'
์ด๋ฏธ ์ง์ ์ํ ํ ์ ์์ต๋๋ค.) cmd /c '...'
, _์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ ๋ ๊ฒฝ์ฐ์๋ง ๊ฐ๋ ฅํ๊ฒ ์ ์ฉ _; ๋ฐ์ด๋๋ฆฌ Invoke-NativeShell
/ ins
cmdlet ๊ตฌํ, ์ฃผ๋ก ๋์ ์
ธ์ ์ธ๋ถ ์ ๋ณด ์ถ์ํ CLI ๊ตฌ๋ฌธ์ ๋น๋ฉดํ ๋ฌธ์ ๋ฅผ ํผํ ์ ์์ผ๋ฏ๋ก ( System.Diagnostics.ProcessStartInfo.ArgumentList
๋ฅผ ์ง์ ์ฌ์ฉํ์ฌ) ๋
๋ฆฝ์ ์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
๋ฟก ๋นต๋จ
์ ๋ ๋ค๋ฅธ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ์๋ก์ด ์ฌ์ฉ์๊ฐ PowerShell์ ์ฌ์ฉํด๋ณด๊ณ , ๋ถ๊ฐ์ฌ์ํ๊ฒ ์คํจํ๋ค๋ ์ฌ์ค์ ๊นจ๋ซ๊ณ , ํด์งํต์ผ๋ก ์ฎ๊ธฐ๊ณ ์ ๋ ๋ฐํํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ ๋ด๊ฐ ํ ์ผ์ ๋๋ค.
๋ช ํํ๊ฒ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น? powershell์ ํ์ฌ ๋์์ด ์ด๋ฌํ ๋ถ์พํ ์ฌ์ฉ์ ๊ฒฝํ์ผ๋ก ์ด์ด์ง ์ ์๋์ง, ์๋๋ฉด ์ ์ ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ํด๋น ์ฌ์ฉ์ ๊ฒฝํ์ผ๋ก ์ด์ด์ง๊น ๋๋ ต์ต๋๊น?
์ ์๊ฐ์๋ powershell์ ํ์ฌ ๋์์ด ๊ทธ๋ฌํ ๊ฒฝํ์ ์์ฑ ํ ๊ฐ๋ฅ์ฑ์ด ํจ์ฌ ๋ ๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ์์์ ๋งํ๋ฏ์ด : powershell์ ํ์ฌ ๋์์ ๋ฒ๊ทธ๋ก ๊ฐ์ฃผ๋์ด์ผํฉ๋๋ค.
์ ์ฌ์ฉ์๊ฐ PowerShell์ด โโ์์๋๋ ๊ฒ์ ์์ง ๋ชปํ๋ ์ํ์์ ์๊ณก ๋ ์ธ์๋ก ๋ช ๋ น์ ์คํํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
@ yecril71pl ์ ๋์ ์ผ๋ก ํ์ ํ ์ ์์ต๋๋ค. ์ ์ ๋ ์์ ์ฌํญ์ด ์๋๋ผ ์ธ์์ ๋ํด ํ์ฌ ํ์ํ ํ์์ด "์ผ๊ทธ๋ฌ์ง"๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
๋๋ ๋น์ ์ ์ง๋ฌธ์ด ๋ด๊ฐ ๋ถ์น์ ๊ดด์ง๋ผ๋ ๋น์ ์ ๊ฐ์ ์์ ๋น๋กฏ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ง์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ๋ ์ ์์ ์ธ ์์์ ์ฑํฐ๊ฐ ์๊ณก ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ ๊ฒ์ ์์ํ ์์๋ ๋ฅ๋ ฅ์ ์ ์งํ์ต๋๋ค.
๋ฟก ๋นต๋จ
@ Artoria2e5 ๋ ๋ค์๊ณผ ๊ฐ์ด ๋งํ ๋ ์ธ์ ๋ฐฐ์ด์ ๋จ์ผ lpCommandLine
๋ฌธ์์ด๋ก ๋ณํํ๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด์ ํธ์ถ์ ์ด๋ฏธ ์ธ์ฉ๋์๋์ง ์ฌ๋ถ๋ฅผ ์ถ์ธกํ์ฌ cmdline์ ์ง์ ์ ์ด์ง ์์ต๋๋ค.
์ ํ ํ ๋
echoargs.exe 'some"complicated_argument'
powershell์ด some"complicated_argument
์ฃผ์์ ๋ฐ์ดํ๋ฅผ ์ถ๊ฐํ๋์ง ์ฌ๋ถ๋ฅผ ์ถ์ธกํด์ผํฉ๋๋ค.
์ 1 : ๋๋ถ๋ถ์ powershell ๋ฒ์ ์์
echoarg.exe 'a\" b'
๋ฐ echoarg.exe '"a\" b"'
๋
"C:\path\to\echoarg.exe" "a\" b"
(ํ
์คํธ ๋ฒ์ 2.0; 4.0; 6.0.0-alpha.15; 7.0.1)
ํ์ง๋ง Win10 (๋ฒ์ 5.1.18362.752)์ ๊ธฐ๋ณธ powershell์
echoarg.exe 'a\" b'
~ "C:\path\to\echoarg.exe" a\" b
๋ฐ
echoarg.exe '"a\" b"'
~ "C:\path\to\echoarg.exe" ""a\" b""
.
์ 2 : ์ด์ powershell ๋ฒ์ ๋ฒ์ญ
echoarg.exe 'a"b c"'
~ "C:\path\to\echoarg.exe" "a"b c""
(ํ
์คํธ ๋ฒ์ 2.0; 4.0;)
์ต์ ๋ฒ์ ์
echoarg.exe 'a"b c"'
~ "C:\path\to\echoarg.exe" a"b c"
(ํ
์คํธ ๋ฒ์ 5.1.18362.752; 6.0.0-alpha.15; 7.0.1).
๋์์ด ์ด๋ฏธ ์ฌ๋ฌ ๋ฒ ๋ณ๊ฒฝ๋์์ผ๋ฏ๋ก ์์ ๋์์ ์ป๊ธฐ ์ํด ํ ๋ฒ ๋ ๋ณ๊ฒฝํ ์์๋ ์ด์ ๋ฅผ ์ ์ ์์ต๋๋ค.
@TSlivede , ๋ช ํํ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. @ Artoria2e5๋ผ๊ณ ์๋ชป ํด์ํด์ ์ฃ์กํฉ๋๋ค.
์ค์ ๋ฌธ์ ๋ 100 % ๋์ํฉ๋๋ค. ์ค์ ๋ก lpCommandLine
๊ฐ Windows์ ๋ฐฐํ์์ ์ฌ์ฉ๋๋ ๊ฒฐ๊ณผ์ ๋ํด ์๊ฐํ ํ์์กฐ์ฐจ ์์ต๋๋ค. PowerShell์ด โโ์ณ์ ์ผ์ํ๋ค๋ฉด ์๋ฌด๋ ํ ํ์๊ฐ ์์ ๊ฒ์
๋๋ค (๊ฐ์ฅ ํฐ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋ PowerShell์ ์๋ชป์ด ์๋๋๋ค. ์ด๋ --%
(ํ์ฌ ๊ตฌํ ๋จ))๊ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. Unix์ ์ ์ฌํ ํ๋ซํผ์ ๊ฒฝ์ฐ).
๋จ์ํ ๋ฌธ์ ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์์ ํ๋ ๊ฒ์ ๊ดํด์๋ ๋ถ๋ช ํ ๋ด ํฌํ๊ฐ ์์ต๋๋ค (๊ทธ๋ฌ๋ ๊ธฐ์กด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊นจ์ง ๊ฒ์ ๋๋ค).
์์ฝ : Microsoft Windows NT ํ์ ์์คํ ์ ๋ชจ๋ ํ๋ก๊ทธ๋จ์ ๋ํ ์ธ์๋ก ๋ชจ๋ ๊ฐ์ ์์ ์ ์ผ๋ก ์ ๋ฌํ ์ ์๋ค๋ ๊ฐ์ ์ ์๋ชป ๋์์ผ๋ฏ๋ก ์ด๊ฒ์ด ์ฐ๋ฆฌ์ ๋ชฉํ ์ธ ์ฒํ๋ ๊ฒ์ ์ค๋จํด์ผํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ ผ์์ ๋ฒ์ ๋ฅผ ๊ณ ๋ คํ๋ฉด ์ฌ์ ํ ๊ตฌ์ถ ํ ๊ฒ์ด ๋ง๋ค.
๋ค์ดํฐ๋ธ Windows ์คํ ํ์ผ์ ํธ์ถ ํ ๋ ์๋ ์ธ์ฉ๋ฌธ์ ์ ์งํด์ผํฉ๋๋ค. ์:
CMD /CSTART="WINDOW TITLE"
์์คํ ์ด WINDOW ํ์ผ์ ์ฐพ์ ์ ์์ต๋๋ค.
{ CMD /CSTART="WINDOW TITLE" }. Ast. EndBlock. Statements. PipelineElements. CommandElements[1]
StringConstantType BareWord ๊ฐ / CSTART = ์ฐฝ ์ ๋ชฉ StaticType System.String ๋ฒ์ / CSTART = "์ฐฝ ์ ๋ชฉ" ๋ถ๋ชจ์ CMD / CSTART = "์ฐฝ ์ ๋ชฉ"๋ฒ์ ๋ฅผ ํ ํ๋ฆฟ์ผ๋ก ์ฌ์ฉํ๋ฉด ์๋ฌด๊ฒ๋ ์์ง ์๊ณ ์์๋๋ก ๋ค์ดํฐ๋ธ ์คํ ํ์ผ์ ํธ์ถ ํ ์ ์์ต๋๋ค. ๋ฌธ์์ด ์ธ์๋ฅผ ์ฌ์ฉํ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฌ๊ธฐ์์ ์๋ํ์ง๋ง PowerShell ๋ด์์ ์ ์ ํ ์ง์์ด ๊ตฌํ๋๋ ๊ฒฝ์ฐ ๊ธฐ์ ์ ์ผ๋ก ์๊ฒฉํ ํ์ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์ ์ฉ๋ฉ๋๋ค.
๋ฐฑ ์ฌ๋์ ์ด์ค์ผ์ดํ๋ฅผ ํด์ํ๋ ๋๊ตฌ ( TASKLIST "\\\"PROGRAM FILES"
)์ ํด์ํ์ง ์๋ ๋๊ตฌ ( DIR "\""PROGRAM FILES" /B
) ๋ฐ ๋ฐฉํดํ์ง ์๋ ๋๊ตฌ ( TITLE A " B
). ๊ทธ๋ฌ๋ ์ด์ค์ผ์ดํํ๋ ค๋ ๊ฒฝ์ฐ ๋ฐฑ ์ฌ๋์๋ฅผ ์ฌ์ฉํ๋ ํ์ค ์ด์ค์ผ์ดํ๋ ๋จ์ํ ๋ฐ์ดํ๋ฅผ ์ ํ ์ง์ํ์ง ์๊ณ ์ด์ค ๋ฐฑ ์ฌ๋์ \\
์์ ํ ๋ค๋ฅธ ์๋ฏธ๋ฅผ ๊ฐ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์ผ๋ฐ์ ์ธ ํ์ผ ๊ด๋ฆฌ ๋๊ตฌ๋ฅผ ์์์ํต๋๋ค ( DIR "\\\"PROGRAM FILES" /B
์๋). CMD /CECHO='A " B'
)๋ฅผ ์ ๊ณต ํ ์ ์์ต๋๋ค.
ํ๊ฒฝ ๋ณ์๋ CMD
๊ฐ์ ๋ํ๋ด์ง ์๊ณ ํ๊ฒฝ ๋ณ์๊ฐ ํ์ฅ ๋ ๋ ๋ค์ ๊ตฌ๋ฌธ ๋ถ์๋๋ ์ฝ๋ ์กฐ๊ฐ์ ๋ํ๋ด๋ฉฐ ๋ค๋ฅธ ๋ช
๋ น์ ๋ํ ์ธ์๋ก ์์ ์ ์ผ๋ก ์ฒ๋ฆฌ ํ ์์๋ ๊ท์ ์ด ์์ต๋๋ค. CMD
๋ ํ์ฌ ์์๊ป๋ผ์ ๊ทผ๋ณธ ์์ธ ์ธ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๋ฌธ์์ด์ด ์๋ ์ด๋ค ์ข
๋ฅ์ ๊ฐ์ฒด์์๋ ์๋ํ์ง ์์ต๋๋ค.
์์ฝ : Microsoft Windows NT ํ์ ์์คํ ์ ๋ชจ๋ ํ๋ก๊ทธ๋จ์ ๋ํ ์ธ์๋ก ๋ชจ๋ ๊ฐ์ ์์ ์ ์ผ๋ก ์ ๋ฌํ ์ ์๋ค๋ ๊ฐ์ ์ _wrong_์ด๋ฏ๋ก ์ด๊ฒ์ด ์ฐ๋ฆฌ์ ๋ชฉํ ์ธ ์ฒํ๋ ๊ฒ์ ์ค์งํด์ผํฉ๋๋ค.
๊ทธ๊ฒ ๋ชฉํ๊ฐ๋์ด์ผํ์ง ์๋์? ํ๋ก๊ทธ๋จ์ด ์์ ํ๋ ์ธ์๋ฅผ ํด์ ํ ์ ์๋ค๋ฉด PowerShell์ ๋ฌธ์ ๊ฐ ์๋๋๋ค.
๋ค์ดํฐ๋ธ Windows ์คํ ํ์ผ์ ํธ์ถ ํ ๋ ์๋ ์ธ์ฉ๋ฌธ์ ์ ์งํด์ผํฉ๋๋ค. ์:
CMD /CSTART="WINDOW TITLE"
ํ๋ก๊ทธ๋จ ํธ์ถ์ด PowerShell์์ ํธ์ถ ๋ ํ๋ก๊ทธ๋จ์ด ์ฌ์ฉํ๋ ์ธ์ด๋ก ๋์ ์ผ๋ก ๋ณ๊ฒฝ๋์ด์ผํ๋ค๊ณ ์ ์ํ๊ณ ์์ต๋๊น? ์ด ์์ ๋ PowerShell์์ ์์ฑํ์ต๋๋ค. ์ฆ, ๋ค์ ์ค ํ๋์ ๋์ผํด์ผํฉ๋๋ค.
CMD "/CSTART=WINDOW TITLE"
CMD '/CSTART=WINDOW TITLE'
CMD /CSTART=WINDOW` TITLE
์์ฝ : Microsoft Windows NT ํ์ ์์คํ ์ ๋ชจ๋ ํ๋ก๊ทธ๋จ์ ๋ํ ์ธ์๋ก ๋ชจ๋ ๊ฐ์ ์์ ์ ์ผ๋ก ์ ๋ฌํ ์ ์๋ค๋ ๊ฐ์ ์ _wrong_์ด๋ฏ๋ก ์ด๊ฒ์ด ์ฐ๋ฆฌ์ ๋ชฉํ ์ธ ์ฒํ๋ ๊ฒ์ ์ค์งํด์ผํฉ๋๋ค.
๊ทธ๊ฒ ๋ชฉํ๊ฐ๋์ด์ผํ์ง ์๋์? ํ๋ก๊ทธ๋จ์ด ์์ ํ๋ ์ธ์๋ฅผ ํด์ ํ ์ ์๋ค๋ฉด PowerShell์ ๋ฌธ์ ๊ฐ ์๋๋๋ค.
์ด ํ๋ก๊ทธ๋จ CMD
ํด์ ํ ์์๋ ์ธ์ /CECHO=A " B
ํ์ง๋ง PowerShell์์ ์๊ณก์์ด ์ ๋ฌํ ์ ์์ต๋๋ค.
๋ค์ดํฐ๋ธ Windows ์คํ ํ์ผ์ ํธ์ถ ํ ๋ ์๋ ์ธ์ฉ๋ฌธ์ ์ ์งํด์ผํฉ๋๋ค. ์:
CMD /CSTART="WINDOW TITLE"
ํ๋ก๊ทธ๋จ ํธ์ถ์ด PowerShell์์ ํธ์ถ ๋ ํ๋ก๊ทธ๋จ์ด ์ฌ์ฉํ๋ ์ธ์ด๋ก ๋์ ์ผ๋ก ๋ณ๊ฒฝ๋์ด์ผํ๋ค๊ณ ์ ์ํ๊ณ ์์ต๋๊น? ์ด ์์ ๋ PowerShell์์ ์์ฑํ์ต๋๋ค. ์ฆ, ๋ค์ ์ค ํ๋์ ๋์ผํด์ผํฉ๋๋ค.
CMD "/CSTART=WINDOW TITLE" CMD '/CSTART=WINDOW TITLE' CMD /CSTART=WINDOW` TITLE
Microsoft Windows NT ํ์ ์์คํ ์์ ์ธ๋ถ ํ๋ก๊ทธ๋จ๊ณผ ์ธํฐํ์ด์ค ํ ๋ PowerShell์ ๋ชจ๋ PowerShell๊ณผ ๋์ผํ์ง๋ง ์์ ํ๋ก๊ทธ๋จ๊ณผ ๋์ผํ์ง ์์ ์ธ์๋ฅผ ์ธ์ฝ๋ฉํ๋ ๋ฌด์ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค๊ณ ์ ์ํ๋ ค๊ณ ํ์ต๋๋ค. ์ฌ์ฉ์๊ฐ ์ค์ ๋ก ์ด๋ค ์ธ์ฉ ๋ฐฐ์ด์ ์ฌ์ฉํ๋์ง์์ฃผ์๋ฅผ ๊ธฐ์ธ์ด์ง ์๊ณ ์ฃผ์ฅ์ ์ธ์ฝ๋ฉํ๋ One True Way โข๋ฅผ ๋ฌด๋๋ํ๊ฒ ๊ฐ์ํ๋ ๊ฒ์ ๋์์ด๋์ง ์์ต๋๋ค.
@ yecril71pl ๋๋ ๋น์ ์ ์๊ฒฌ์ ์ ๋ง ํผ๋ ์ค๋ฝ์ต๋๋ค. ์ฌ๊ธฐ์ ์ ํํ ๋ฌด์์ ์ ์ํ๊ณ ์์ต๋๊น? ์ฌ์ฉ ์ฌ๋ก๋ ๋ชจ๋ --%
๋ฉ๋๋ค. ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ด ๋งํ์ฌ ๋ซ์์ต๋๋ค.
--%
์๋ ์ฌ์ ์ ์ ๋ ๋ช ๋ น ์ค์ด ํ์ํ๋ฏ๋ก ์ ํธ๋ฆฌํฐ๊ฐ ์ ํ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ์ค์ ๋ก --%
์ ํจ๊ป ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ์๋:
PS > $env:mytitle='WINDOW TITLE'
PS > cmd --% /CSTART="%mytitle%"
๊ทธ๋์ ๋๋ ๋ฌด์์ ๋์น๊ณ ์์ต๋๊น?
์ฐ๋ฆฌ๋ ๊ตฌ๋ฌธ์ ๋๋ฝ CMD /CSTART="$mytitle"
ํ๋ ๊ฒ์ ๋์คํ์ง ์๊ณ , ENV:
.
๋์ฐํ ์๊ฐ์ผ๋ก Environment.ExpandEnvironmentVariables
๋ฅผ ๋ค๋ฅธ ๊ฒ์ผ๋ก ๋์ฒด ํ ์์๋ ์ต์
์ด ์์ต๋๋ค. ์ด์จ๋ Unix์๋ ๊ธฐ๋ณธ ๊ตฌํ์ด ์์ผ๋ฉฐ C #์ผ๋ก ๋ค์ ์์ฑํ๋ฉด ์ฒ๋ฆฌํ๋ ์์
์ด ์ฑ๋ฅ์ ์ค์ํด์ง ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
์ด์จ๋ env var ์ด๋ฆ์๋ ๋ฑํธ๊ฐ ํ์ฉ๋์ง ์์ผ๋ฏ๋ก %=$a%
์๋ฏธ $a
๊ฐ์ง ์ ์์ต๋๋ค. ์ด๊ฒ์ JS์ ํ
ํ๋ฆฟ ๋ฌธ์์ด์ฒ๋ผ ์๋ํ๋๋ก ๋ง๋๋ ๊ฒ๊ณผ ๊ฐ์ ๋งค์ฐ ์ ์ฐํ๊ณ (์๋ง๋ ๋์) ํ์ฅ์ ํ์ฉํ๋ฉด์ ๊ธฐ์กด์ ์ด๋ค ๊ฒ๋ ๊นจ๋จ๋ฆฌ์ง ์์ ๊ฒ์
๋๋ค. ์ง์ฅ, ์ฐ๋ฆฌ๋ %VARNAME=$var%
๋ ์ผ์ข
์ ๋์ฒด ๊ตฌ๋ฌธ์ผ๋ก ์ ์ ํ ์ ์์ต๋๋ค.
๋ฌธ์ํ ์ง์ฅ์ ๊ดํด์๋ ์ด๊ฒ์ด ... ์ฌ๊ณผ๋๋ฆฝ๋๋ค.
ํ์ฑ โโ๋ฌธ์ ๊ฐ _ ์๋๋๋ค _.
์ฐ๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ _PowerShell์ด โโ_its_ ๊ตฌ๋ฌธ ๋ถ์์ ๊ฒฐ๊ณผ ์ธ ๋ฌธ์์ด ํ ๋ ์ธ์๋ฅผ ์ธ๋ถ (๋ค์ดํฐ๋ธ) ์คํ ํ์ผ๋ก ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ฌธ์ ์ ๋๋ค.
_Windows_์์ ๋ฌธ์ ๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์์ฑ ๋ ์ธ๋ถ ์คํ ํ์ผ์ ํธ์ถํ๋ ๋ช ๋ น ์ค ์ด Microsoft C / C ++ ์ปดํ์ผ๋ฌ ์ค๋ช ์์ Parsing C ++ ๋ช ๋ น์ ์์ธํ ์ค๋ช ๋๋๋ก ์ธ์ ์ธ์ฉ์ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๊ท์น์ ๋ฐ๋ฅด์ง _ ์๋๋ค๋ ๊ฒ์ ๋๋ค . ์ค ์ธ์ ์น์ .
ํ์ฌ ์ผ์ด๋๋ ์ผ์ _different_ ๊ท์น์ด ์ฌ์ฉ๋๋ค๋ ๊ฒ์กฐ์ฐจ ์๋๋๋ค. ์๋ง๋ ๊ฐ๋ ์ผ๋ก ์ธํด ์์ฑ ๋ ๋ช ๋ น ์ค์ ํฌํจ ๋ ํฐ ๋ฐ์ดํ์ ๊ณต๋ฐฑ์ ์กฐํฉ๊ณผ ๊ด๋ จ๋ ์ธ์์ ํน์ฑ์ ๋ฐ๋ผ ์ํฉ์ ๋ฐ๋ผ _ ๊ตฌ๋ฌธ ์ ์ผ๋ก ๊ทผ๋ณธ์ ์ผ๋ก ๊นจ์ก์ต๋๋ค _ ๋ฟ๋ง ์๋๋ผ ๋น ๋ฌธ์์ด ์ธ์.
๊ถ๊ทน์ ์ผ๋ก ๋ฌธ์ ๋ Windows์์ ํ๋ก์ธ์ค ์์ฑ์ ๊ธฐ๋ณธ ์ํคํ ์ฒ์ ๋๋ค. ์ธ์๋ฅผ ์ธ์์ _array_๋ก ์ ๋ฌํ๋ ๋์ _ ๋ช ๋ น ์ค๋ก _-_all_ ์ธ์๋ฅผ ๋ํ๋ด๋ ๋จ์ผ ๋ฌธ์์ด-ํ๋ก์ธ์ค์ ์ ๋ฌํ ์ธ์๋ฅผ ์ธ์ฝ๋ฉํด์ผํฉ๋๋ค. ์ ๋์ค ๊ณ์ด ํ๋ซํผ์ด ์ํํ๋ ๋ฐฉ์์ ๋๋ค). ๋ช ๋ น ์ค์ ์ ๋ฌํ๋ ค๋ฉด _ ์ธ์ฉ ๋ฐ ์ด์ค์ผ์ดํ ๊ท์น _์ ๊ตฌํํด์ผํ๋ฉฐ, ์ฃผ์ด์ง ๋ช ๋ น ์ค์ ํด์ํ๋ ๋ฐฉ๋ฒ์ ๊ถ๊ทน์ ์ผ๋ก _ ๊ฐ ํ๋ก๊ทธ๋จ์ ๋ฌ๋ ค ์์ต๋๋ค. ์ฌ์ค์, ์ด๊ฒ์ ๋ถํ์ํ๊ฒ ํ๋ก๊ทธ๋จ์ด ์ผ์ข ์ ๋ฏธ๋ ์ ธ์ด๋๋๋ก ๊ฐ์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ๊ทธ๋ค์ ์ ธ์ด ์ด๋ฏธ ์ํ ํ ์์ ์ _ ์ฌ์ ํํด์ผํ๋๋ฐ, ์ด๋ _shell only_์ ๋ฒ์ ์ฌ์ผํ๋ ์์ ์ ๋๋ค. ์ ๋์ค์ ๊ฒฝ์ฐ), ์ฆ ๋ช ๋ น ์ค์ ๊ฐ๋ณ ์ธ์๋ก ๊ตฌ๋ฌธ ๋ถ์ํฉ๋๋ค. ๊ฐ๋จํ ๋งํด์, ์ด๊ฒ์ Windows์์ ์ ๋ฌ๋๋ ์ธ์ ์ธ ๋ฌด์ ๋ถ ์ํ์ ๋๋ค .
์ค์ ๋ก, ๋ฌด์ ๋ถ ์ํ๋ ์์ ์ธ๊ธ ํ ๊ท์น์ ์ค์ํ๋ _most_ ํ๋ก๊ทธ๋จ์ ์ํด ์ํ๋๋ฉฐ, ๊ฐ๋ฐ์ค์ธ ์๋ก์ด ํ๋ก๊ทธ๋จ์์ด ๊ท์น์ ์ค์ ํ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋์ต๋๋ค. ์ฃผ๋ก ์ฝ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ท๋ฐ์นจํ๋ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ฐํ์์ด ์ด๋ฌํ ๊ท์น (์ : Microsoft C / C ++ / .NET ๋ฐํ์). ๋ฐ๋ผ์ ํ๋ช ํ ํด๊ฒฐ์ฑ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
cmd.exe
, ๋ฐฐ์น ํ์ผ ๋ฐ msiexec.exe
๋ฐ msdeploy.exe
์ ๊ฐ์ Microsoft ์ ํธ๋ฆฌํฐ๋ฅผ ํฌํจํ๋์ด ๊ท์น์ ๋ฐ๋ฅด์ง _ ์๋ _ "์
์ฑ"ํ๋ก๊ทธ๋จ์ ๊ฒฝ์ฐ ๋ช
์ ์ ์ผ๋ก ๋์ ์คํ ํ์ผ์ ์ ๋ฌ ๋ ๋ช
๋ น ์ค์ ์ ์ดํฉ๋๋ค. ์ด๊ฒ์ด --%
, ํ์ฑ โโ์ค์ง ๊ธฐํธ๊ฐ ์ ๊ณตํ๋ ๊ฒ์
๋๋ค-๋น๋ก ์๋นํ ์ด์ ํ๊ธดํ์ง๋ง._Unix_์์ ๋ฌธ์ ๋ _a ๋ช
๋ น ์ค์ด ์์ ํ ์์ฑ๋๊ณ ์๋ค๋ ๊ฒ์
๋๋ค _-๋์ ์ถ์ด ์ธ์ ๋ฐฐ์ด์ด _as-is_๋ก ์ ๋ฌ๋์ด์ผํฉ๋๋ค. ๋์ .NET Core๊ฐ ์ง์ํ๋ ProcessStartInfo.ArgumentList
; -ํ๋ช
ํ๊ฒ๋-_ ๋ช
๋ น ์ค์ด์๊ณ _ ํ๋ก์ธ์ค๊ฐ Unix์ ๊ฐ์ ํ๋ซํผ์์ ์์ฑ ๋ ๋ ์ธ์ ๋ฐฐ์ด ๋ง ์๋ค๋ ์ ์ ๊ฐ์ํ ๋ ํญ์ _์ด๋ฅผ ์ง์ํด์ผํฉ๋๋ค.
ProcessStartInfo.ArgumentList
์ฌ์ฉํ๋ฉด Unix์ ๋ชจ๋ ๋ฌธ์ ๊ฐ ์ฌ๋ผ์ง๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ @TSlivede ์ https://github.com/PowerShell/PowerShell-RFC/pull/90 ์ด ์ ๋ถ์ ๋๋ค.
https://github.com/PowerShell/PowerShell-RFC/pull/90#issuecomment -650242411์์ ์ ๋ ๋ฐฐ์น ํ์ผ์ "์
์ฑ"์ ๋ํ ์ถ๊ฐ ์๋ ๋ณด์์ ์ ์ํ์ต๋๋ค. -Azure์ ๊ฐ์ ํ๋กํ ์ํํธ์จ์ด (CLI az
๋ ๋ฐฐ์น ํ์ผ๋ก ๊ตฌํ ๋จ, az.cmd
).
๋ง์ฐฌ๊ฐ์ง๋ก msiexec.exe
๋ฐ msdeploy.exe
๋ฐ ๊ธฐํ ์ ๋ช
"์
์ฑ"Microsoft CLI์ ๋ํด์๋ ๋์ผํ ์์
์ ์ํํ๋ ๊ฒ์ ๊ณ ๋ คํด์ผํฉ๋๋ค.
๋ฐฉ๊ธ ie
ํจ์ ๋ฅผ ํตํด ์์ ๋ชจ๋ ์ฌํญ์ ์ฒ๋ฆฌํ๋ ๋ชจ๋ Native
, ( Install-Module Native -Scope CurrentUser
)๋ฅผ ๊ฒ์ํ์ต๋๋ค ( i nvoke (external) e xecutable์ ์ฝ์ด์
๋๋ค. ์์์ ์๊ฐ iep
ํจ์์๋ณด๋ค ์์ ํ ๊ตฌํ์
๋๋ค.
๋ํ # 13068์ ์ฃผ์๋กํ๋ ins
( Invoke-NativeShell
) ๋ฐ ์ธ์ ์ ๋ฌ ์ง๋จ์์ํ dbea
( Debug-ExecutableArguments
)๋ ํฌํจ ๋ฉ๋๋ค . https : // github๋ฅผ ์ฐธ์กฐํ์ธ์ com / PowerShell / PowerShell / issues / 13068 # issuecomment -671572939๋ฅผ ์ฐธ์กฐํ์ธ์.
์ฆ, ie
๋์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๊ฐ๋จํ๊ฒ ํธ์ถ ์์ ie
๋ฅผ ๋ช
๋ น์ผ๋ก ์ฌ์ฉํ์ฌ ๋์ ๋์ง ์๋ ์์ ๋ฐฉํธ ์ญํ ์ ํ ์ ์์ต๋๋ค.
๋์ ์:
# This command is currently broken, because the '{ "name": "foo" }' argument isn't properly passed.
curl.exe -u jdoe 'https://api.github.com/user/repos' -d '{ "name": "foo" }'
๋ค์์ ์ฌ์ฉํฉ๋๋ค.
# OK, thanks to `ie`
ie curl.exe -u jdoe 'https://api.github.com/user/repos' -d '{ "name": "foo" }'
CMD /CSTART="WINDOW TITLE"
์์ (๋ ๋ง์ ๊ด์ฉ์ ํ์์ ์ด๋ฏธ ์๋ํ๋ cmd /c start "WINDOW TITLE"
) :
๋ณธ์ง์ ์ผ๋ก msiexec
/ msdeploy
๋ํ prop="<value with spaces>"
์ธ์์ ๋์ผํ ๋ฌธ์ ์
๋๋ค. PowerShell-์ ๋นํ๊ฒ- /CSTART="WINDOW TITLE"
๋ฅผ "/CSTART=WINDOW TITLE"
. ๊ทธ๋ฌ๋ cmd.exe
ํธ์ถ์ด ์ค๋จ๋ฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์๋ ๋ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
ins
/ Invoke-NativeShell
์์ํฉ๋๋ค ( cmd.exe /c
์ด ์ฌ์ค์ ์์๋๋ค๋ ์ ์ ์ ์ํ์ญ์์ค) :
ins 'START="WINDOW TITLE"'
$title = 'window title'; ins "START=`"$title`""
๋๋ ํ์ฌ --%
๊ตฌํ์ ์ฌ์ฉํ๋ ์ ํ ์ฌํญ์ ์ ์ํ์ญ์์ค.
cmd --% /CSTART="WINDOW TITLE"
--%
์ ๋ฌธ์ ๊ฐ๋๋ ์ ํ์ _PowerShell_ ๊ฐ์ ํฌํจํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ _aux๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. ํ๊ฒฝ ๋ณ์ _ ๋ฐ %...%
๊ตฌ๋ฌธ์ผ๋ก ์ฐธ์กฐํ์ญ์์ค.$env:_title = 'window title'; cmd --% /CSTART="%_title%"
--%
๋ ํญ์ _single_ ๋ฌธ์์ด ์ธ์๋ก ๊ตฌํ๋์ด์ผํฉ๋๋ค. ์ :cmd --% '/CSTART="WINDOW TITLE"'
๋๋ cmd --% "/CSTART=`"$title`""
-ํ์ง๋ง ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ๊นจ๋จ๋ฆฌ์ง ์๊ณ ๋ ๋ณ๊ฒฝํ ์ ์์ผ๋ฏ๋ก _new_ ๊ธฐํธ๋ฅผ ๋์
ํด์ผํฉ๋๋ค. ๊ฐ์ธ์ ์ผ๋ก ๋๋ ๊ธฐํธ๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
- ์ ธ์ด ์ด๋ฏธ ์ํ ํ ์์ ์ _ ์ฌ ์ํ _ํด์ผํฉ๋๋ค.
๋๋ CMD.EXE
๊ฐ ๋ช
๋ น ์ค์ ์ธ์๋ก ๋ถํ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ํ์ํ ์ ์ผํ ๊ฒ์ ํธ์ถ ํ ์คํ ํ์ผ์ ์ฐพ๋ ๊ฒ์ด๊ณ ๋๋จธ์ง๋ ์ฌ์ฉ์๊ฐ ์์ฑํ ๋ช
๋ น ์ค๋ฟ์
๋๋ค (ํ๊ฒฝ ๋ณ์ ๋์ฒด ํ, ์ธ์ ๊ฒฝ๊ณ์ ๊ด๊ณ์์ด ์ํ๋ฉ๋๋ค.) ๋ฌผ๋ก ๋ด๋ถ ์ ๋ช
๋ น์ ์ฌ๊ธฐ์ ์์ธ์
๋๋ค.
๋ณธ์ง์ ์ผ๋ก
msiexec
/msdeploy
๋ํmsiexec
prop="<value with spaces>"
์ธ์์ ๋์ผํ ๋ฌธ์ ์ ๋๋ค.
๋๋ ์ด๋ ์ชฝ๋ ์์ ์๋ ์ฌ์ฉ์๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ๋ ์น์ํ ๊ฒ์ ๊ฐ์ ธ ์ค๋ ๊ฒ์ ์ ํธํ์ต๋๋ค.
๋ช ํํ๊ฒ ๋งํ๋ฉด ๋ค์์ ์ด์ ๋๊ธ์์ ์ธ๊ธ ํ ์ฌํญ์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.
CMD.EXE
๋ช ๋ น ์ค์ ์ธ์๋ก ๋ถํ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
_external ์คํ ํ์ผ _ (ํ์ ํ๋ก์ธ์ค์ ๋ค๋ฅธ ์คํ ํ์ผ์ ์ํด ์คํ๋๋ ๋ช ๋ น)์ ํธ์ถ ํ ๋ _explicit_ ๋ถํ ์์ด ๋ฒ์ด๋ ์ ์์ง๋ง _batch files_์ ๋ํด์๋์ด๋ฅผ ์ํํด์ผํฉ๋๋ค.
์ธ๋ถ ์คํ ํ์ผ์ ํธ์ถ ํ ๋์๋ ์ฃผ์ด์ง ๋ฉํ ๋ฌธ์ (์ : &
)์ _syntactic_ ๊ธฐ๋ฅ์ด ์๋์ง ๋๋ ํฐ ๋ฐ์ดํ๋ก ๋ฌถ์ธ ์ธ์์ ์ผ๋ถ์ธ์ง ๋ฐ๋ผ์ ์ฒ๋ฆฌํด์ผํ๋์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ค๋ฉด ์ธ์ ๊ฒฝ๊ณ๋ฅผ _ ์ธ์ํด์ผํฉ๋๋ค. ๋ฌธ์ ๊ทธ๋๋ก :
:: OK - the "..." around & tells cmd.exe to use it verbatim
C:\>echoArgs.exe one "two & three"
Arg 0 is <one>
Arg 1 is <two & three>
Command line:
"C:\ProgramData\chocolatey\lib\echoargs\tools\EchoArgs.exe" one "two & three"
๋ํ cmd.exe
๋ _embedded_ "
๋ฌธ์๋ฅผ ์ธ์ํฉ๋๋ค. "..."
์์ ""
๋ก ์ด์ค์ผ์ดํ๋๋ฉด ๋ฌธ์์ด์ด ์ธ์๋ฉ๋๋ค.
:: OK - the "" is recognized as an escaped "
C:\>echoArgs.exe "3"" of rain & such."
Arg 0 is <3" of rain & such.>
Command line:
"C:\ProgramData\chocolatey\lib\echoargs\tools\EchoArgs.exe" "3"" of rain & such."
๋ถํํ๋, cmd.exe
_only_๋ (Windows ์ ์ฉ) ""
ํ๋ฉฐ ๋ ๋๋ฆฌ ์ฌ์ฉ๋๋ \"
๋ ์ง์ํ์ง ์์ต๋๋ค (์ ๋์ค์์ POSIX์ ์ ์ฌํ _shells__exclusively_ ์ฌ์ฉ)-์ฐธ๊ณ : _programs_๊ฐ ์๋ _shells_. ํ๋ก๊ทธ๋จ์ ์
ธ์ ๊ตฌ๋ฌธ ๋ถ์ ๊ฒฐ๊ณผ ์ธ ์ถ ์ด์ ์ธ์ ๋ฐฐ์ด ๋ง ๋ณผ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
Windows์ ๋๋ถ๋ถ์ CLI๋ _both_ ""
๋ฐ \"
ํ์ง๋ง ์ผ๋ถ๋ _only_ \"
(ํนํ Perl ๋ฐ Ruby)๋ฅผ ์ดํดํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
:: !! BROKEN: cmd.exe misinterprets the & as *unquoted*, thinks it's the statement-sequencing operator,
:: !! and tries to execute `such`:
C:\>echoArgs.exe "3\" of rain & such."
Arg 0 is <3" of rain >
Command line:
"C:\ProgramData\chocolatey\lib\echoargs\tools\EchoArgs.exe" "3\" of rain
'such."' is not recognized as an internal or external command,
operable program or batch file.
๋ฐ๋ผ์:
๊ฐ๋ฅํ๋ฉด cmd.exe
์ง์ ์ ํํ์ง ๋ง์ญ์์ค.
ie
(ํ์ฌ๋ก์๋)๋ฅผ ํตํด ํธ์ถํฉ๋๋ค.cmd.exe
๋ฅผ ํธ์ถํด์ผํ๋ ๊ฒฝ์ฐ ์ผ๋ฐ์ ์ธ ๋จ์์ฑ์ ์ํด ins
/ Invoke-NativeShell
๋ฅผ ์ฌ์ฉํ๊ณ ํนํ ๋ช
๋ น ์ค์ PowerShell ๋ณ์ ๋ฐ ์ ๊ฐ์ ํฌํจํ๋ ๊ฒ์ด ์ผ๋ง๋ ์ฌ์ด ์ง์ ๋ํด ์ฌ์ฉํฉ๋๋ค. .
cmd.exe
์ง์ ํธ์ถํ๋ ํฉ๋ฒ์ ์ธ ์ด์ ๋ ํ์ดํ ๋ผ์ธ์ ์์ ๋ฐ์ดํธ ๋ฐ์ดํฐ์ ๋ํ PowerShell์ ์ง์ ๋ถ์กฑ์ ๋ณด์ํ๊ธฐ์ํ ๊ฒ ์
๋๋ค. ์์ ๋ ๋๋ ์ฌ๊ธฐ์ ๋ง์ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌ ํ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ผ๋ฉฐ ํ ๋ก ์ ๊น์ด์ ๋ํด ์ ๋ง ๊ฐ์ฌํ์ง๋ง ... ์ค๋ฆฌ ... ์ค์ ์๋๋ฆฌ์ค์์ ์ค์ ๋ก ์ค์ํ์ด ์ฌ๋ก๋ฅผ ๊ฐ์ง ์ฌ๋์ด ์์ต๋๊น? ?
Windows ์ธ์ ๊ตฌ๋ฌธ ๋ถ์์ ํ์ฌ ์กด์ฌํ๋ "๋ฌด์ ๋ถ ์ํ"๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด PowerShell์์ ๊ถํ์ ๋ถ์ฌ๋ฐ์ง ๋ชปํ ๊ฒ์ ์ ์๊ฐ์ ๋๋ค. ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์์๋ ๋ง์ ๋์ผํ ์ด์ ๋๋ฌธ์ Windows ๋ฐ VC ++ ์ปดํ์ผ๋ฌ๊ฐ์ด ๋์์ ์ค๋จํ์ง ์๊ธฐ๋ก ์ ํํ ์ด์ ๊ฐ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋ง์ฐํ๊ณ , ์ฐ๋ฆฌ๊ฐ ๋ฌด์ธ๊ฐ๋ฅผ ๋ฐ๊พธ๋ฉด ์๋กญ๊ณ (๋๋ถ๋ถ ํด๋ ํ ์์๋) ๋ฌธ์ ๋ค์ ์ ๋ง ๊ธด ๊ผฌ๋ฆฌ๋ฅผ ๋ง๋ค ๊ฒ์ ๋๋ค.
์ด๋ฏธ ํฌ๋ก์ค ํ๋ซํผ์ด๊ณ Windows์ Linux (์ : Docker, k8s, Git ๋ฑ) ์ฌ์ด์์ ๋ง์ด ์ฌ์ฉ๋๋ ์ ํธ๋ฆฌํฐ์ ๊ฒฝ์ฐ์ด ๋ฌธ์ ๊ฐ ํ์ค ์ธ๊ณ์์ ๋ํ๋์ง ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ ์กฐํ ์์ ์ ์ํํ๋ "๋ถ๋"์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฒฝ์ฐ ๋๋ถ๋ถ ๋ ๊ฑฐ์ Windows ์ ์ฉ ์ ํธ๋ฆฌํฐ์ ๋๋ค.
@ mklement0์ ๋ํด ์ค๋ช
๋งค์ฐ ๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
โฏ git commit --allow-empty -m 'this is what we call a "commit message" which contains arbitrary text, often with punctuation'
error: pathspec 'message which contains arbitrary text, often with punctuation' did not match any file(s) known to git
โฏ $a = 'this is what we call a "commit message" which contains arbitrary text, often with punctuation'
โฏ git commit --allow-empty -m "$a"
error: pathspec 'message which contains arbitrary text, often with punctuation' did not match any file(s) known to git
โฏ $PSVersionTable
Name Value
---- -----
PSVersion 7.0.3
PSEdition Core
GitCommitId 7.0.3
OS Microsoft Windows 10.0.19042
Platform Win32NT
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0โฆ}
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
WSManStackVersion 3.0
git.exe
์ (๋) ์ ์๋ํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ด๋ฏ๋ก PowerShell์ ์์ ์ ๊ฐ๋จํ์ง๋ง ๋ชจ๋ ์คํฌ๋ฆฝํฐ๊ฐ ์ค๋งํธ ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋๋๋ ค ์ผํฉ๋๋ค. cmd.exe
์ (๋) ์ ์ํ๊ธฐ๊ฐ ๋ ์ด๋ ต๊ณ ๋ช ๊ฐ์ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ง๋ง ์ ๋ถ๋ ์๋ ์์๋ ํจ์ฌ ๋ ์ฌ๋ ค ๊น์ ์ ๊ทผ ๋ฐฉ์์ด ํ์ํฉ๋๋ค. PowerShell์ด โโWindows NT ๋๊ตฌ๋ก ์์๋์๋ค๋ ์ ์ ๊ณ ๋ คํ๋ฉด ์ค์ ๋ก ๋์ฐํฉ๋๋ค. ๋๋์ด ์ง๋ฌธ์ _ cmd.exe
์ ๊ฐ์ ์๋ชป ์๋ํ๋ ๋ ๊ฑฐ์ ์ ํธ๋ฆฌํฐ๊ฐ PowerShell์์ ์ธํฐํ์ด์ค์ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ๋ฐฉ์์ผ๋ก ํธ์ถ๋๋ ์ค์ ์๋๋ฆฌ์ค๊ฐ ์๋์ง ์ฌ๋ถ๋ฅผ ์ดํดํฉ๋๋ค _. PowerShell์ cmd.exe
์์๋ ๋๋ถ๋ถ์ ๊ธฐ๋ฅ์ ๋ณต์ ํ์ฌ cmd.exe
์ค๋ณต๋๋๋ก์ด ๋ฌธ์ ์ ์ ๊ทผํ๋ ค๊ณ ํ์ต๋๋ค. ์ด๋ ๋ค๋ฅธ ๋๊ตฌ์์๋ ๊ฐ๋ฅํฉ๋๋ค. ์๋ฅผ ๋ค์ด MSI๋ ActiveX๋ฅผ ํตํด ์๋ ํ ์ ์์ง๋ง ๊ทธ๋ ๊ฒํ๋ ค๋ฉด ์๋นํ ์ง์์ด ํ์ํฉ๋๋ค. ๋ฐ๋ผ์ ๋ค๋ฃจ์ง ์๋ ํ์ ํญ๋ชฉ์ด ์์ต๋๊น?
@ PowerShell / powershell-committee๊ฐ ์ด์ ๋ํด ๋
ผ์ํ์ต๋๋ค. ์ค์ ์ธ๊ณ์์ ๋งค๋ ฅ์ ์ธ ์์ ๋ฅผ ๋ช
ํํ๊ฒ ๋ณด์ฌ์ฃผ๋ git ์์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ฐ๋ฆฌ๋ 7.2 ์ด๋ฐ์ ๊ทธ๋ฌํ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ์ ๋์ ์ํฅ์ ๊ฒ์ฆํ๊ธฐ ์ํด ์คํ์ ์ธ ๊ธฐ๋ฅ์ด ์์ด์ผํ๋ค๋ ๋ฐ ๋์ํ์ต๋๋ค. ์ถ๊ฐ ํ
์คํธ ์์ ๋ --%
๋ ํ์ฑ๋์ง ์์์ด์ผํ๋๋ฐ ๋ฌธ์ ๊ฐ ์์์ ๋ณด์ฌ์ค๋๋ค.
PS> testexe --% -echoargs 'a b c "d e f " g h'
Arg 0 is <'a>
Arg 1 is <b>
Arg 2 is <c>
Arg 3 is <d e f >
Arg 4 is <g>
Arg 5 is <h'>
์ด๊ฒ์ ๊ธฐ๋ณธ ๋ช ๋ น ๋งค๊ฐ ๋ณ์ ๋ฐ์ธ๋์ ๋ฌธ์ ์ธ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.
์, @cspotcode ๊ฐ์ฌํฉ๋๋ค. ๊ทธ ์๋ ์ ๊ฒ ํ์คํ ์ํ ์๊ฐ์ด์์ต๋๋ค.
์ ๋ ์ฌ์ ํ ๋ธ๋ ์ดํน ์ฒด์ธ์ง ์ธก๋ฉด์ ๋ํด ์ฐ๋ คํ๊ณ ์์ผ๋ฉฐ, ์ด๊ฒ์ด ์ฌ๋ฌ ๋ฒ์ ์ PowerShell์์ ์คํ์ ์ผ๋ก ๋จ์์์ ์์๋ ์คํ์ ๊ธฐ๋ฅ์ ๋ํ ํ๋ณด๊ฐ ๋ ์ ์๋ค๋ ๊ฒ์ด ์ ์๊ฐ์ด๋ฉฐ, ์ด๋ ์ฐ๋ฆฌ๊ฐ ๊ฒฐ๊ตญ ๋ง๋ค ๊ฒ์ด๋ผ๊ณ ํ์ ํ๋ ๊ฒ์ด ์๋๋๋ค.
๋ํ RFC @ mklement0 ์ ํ์ฉ ๋ชฉ๋ก / "๋ฃจ์ฆ ์ฑ"์ธก๋ฉด์ ์ดํดํ๊ธฐ ์ํด ๋ ์์ธํ ์กฐ์ฌํด์ผํฉ๋๋ค. ๊ทธ๋ฐ ๋ชฉ๋ก์ ์ ์งํ๊ธฐ ์ํด ์ผ๋ง๋ ๋ฑ๋ก ํ ๊ฒ์ธ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@joeyaiello ์ @ SteveL-MSFT, ๋จผ์ ๋ฉํ ๊ด์ฐฐ์ํ๊ฒ ์ต๋๋ค.
@cspotcode ์ ์์ ๊ฐ ๋ฌธ์ ์ ๋ํ _glimpse_๋ฅผ ์ ๊ณต ์ข์ง๋ง , ๊ทํ์ ์๋ต์ ์ฌ์ ํ โโ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ์ ๋ํ ๊ทผ๋ณธ์ ์ธ ์ดํด์ ๊ฐ์ฌ์ ๋ถ์กฑ์ ๋ฐฐ์ ํฉ๋๋ค (๋์ค์์ด ์ ์ ๋ ผ์ ํ ๊ฒ์ ๋๋ค). .
์ด๊ฒ์ _ ๊ฐ์ธ์ _ ํ๋จ์ด ์๋๋๋ค. ์ ๋ ๋งค์ฐ ์๊ฒ ํด์ ์งง์ ์๊ฐ์ ๋งค์ฐ ๊ด๋ฒ์ํ ์ฃผ์ ์ ๋ํด ๊ฒฐ์ ์ ๋ด๋ ค์ผํ๋ ๊ฒ์ด ์ผ๋ง๋ ์ด๋ ค์ด์ง ์ ์๊ณ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ _structural_ ๋ฌธ์ ๋ฅผ ๊ฐ๋ฆฌ ํต๋๋ค. @ PowerShell / powershell-committee๊ฐ ๋ ผ์์ค์ธ ๋ฌธ์ ์ ๋ํ ํผ์์ ์ธ ์ดํด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ผ์์ ์ผ๋ก ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ๊ฒ์ผ๋ก ๋ณด์ด๋ฉฐ ์ปค๋ฎค๋ํฐ ์ ์ฒด์ ํด๋ฅผ ๋ผ์นฉ๋๋ค.
๋์๊ฒ ์ฌ๊ธฐ์ ๋ ผ์๋๋ ๋ฌธ์ ์ ๋ํ์์ํ์ ๋ฐ์์ ์ง๊ธ๊น์ง์ด ๊ตฌ์กฐ์ ๋ฌธ์ ์ ๊ฐ์ฅ ์ค์ํ ์์ ๋๋ค.
๋ฐ๋ผ์ ์ด๊ฒ์ ๊ณ ๋ คํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
์์ํ๊ฐ ํ์ํ๋ ์ฃผ์ ๋ณ _sub_-์์ํ๋ฅผ ์๋ช ํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น? ๊ด๋ จ ๋ฌธ์ ์ ๋ํด ํ์ํ ์ดํด๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๊น?
testexe
SteveL-MSFT์ ์ฝํ
์ธ ๋ฅผ ๊ณต์ ํ ์ ์์ต๋๊น?
@TSlivede ๋ https://github.com/PowerShell/PowerShell/issues/13068#issuecomment -665125375์ ๋ฌธ์ ๋ฅผ ์ ์ ํ๊ฒ ์์ฝํ์ต๋๋ค.
๋ฐ๋ฉด PowerShell์ ์ ธ์ด๋ผ๊ณ ์ฃผ์ฅํฉ๋๋ค (# 1995๊ฐ ํด๊ฒฐ ๋ ๋๊น์ง _is_ ์ ธ์ด๋ผ๊ณ ๋งํ์ง ์๊ฒ ์ต๋๋ค).
์ด์ ์ ์ฌ๋ฌ ๋ฒ ์ธ๊ธํ๋ฏ์ด ์์ ํต์ฌ ์๋ฌด๋ ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ์ธ๋ถ ์คํ ํ์ผ์ ํธ์ถํ๋ ๊ฒ์ ๋๋ค.
ํฐ ๋ฐ์ดํ์ ๋น ๋ฌธ์์ด ์ธ์๊ฐ ํฌํจ ๋ ์ธ์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ฌ๋์ง ์์๊ธฐ ๋๋ฌธ์ PowerShell์ ํ์ฌ์ด ๋ช ๋ น์ ์ดํํ์ง ๋ชปํฉ๋๋ค.
์์ ์ธ๊ธํ๋ฏ์ด, ๊ฐ๋ฅํ ์ธ๋ถ CLI๊ฐ ๋ถ์กฑํ์ฌ์ด ๋ฌธ์ ๊ฐ ๊ฑฐ์ ๋๋ฌ๋์ง ์๋ Windows ์ ์ฉ ์๋์๋ ๋ฌธ์ ๊ฐ ์ ์์ ์ ์์ง๋ง, ์์ฆ์ ์ฌ๋ผ์ง๊ณ PowerShell์ด โโ์ ๋ขฐํ ์์๋ ํฌ๋ก์ค ํ๋ซํผ์ผ๋ก ์๋ฆฌ ๋งค๊นํ๋ ค๋ ๊ฒฝ์ฐ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผํฉ๋๋ค.
@cspotcode ์ git
์์ ๋ ์ข์ ๊ฒ์
๋๋ค. JSON ๋ฌธ์์ด์ ์ ๋ฌํ๋ ค๋ ์คํ ํ์ผ (์ : curl
์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
# On Unix; on Windows,
# echoArgs.exe '{ "foo": "bar" }'
# would show the same problem.
PS> /bin/echo '{ "foo": "bar" }'
{ foo: bar } # !! Argument was incorrectly passed.
์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ ์ณ๋๊ณ :
Unix์์ ๋ฌธ์ ๋ ๋ฐฐํ์์ ProcessStartInfo.ArgumentList
๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ํ๊ณ _ ์์ ํ _ ํด๊ฒฐ๋ฉ๋๋ค.
Windows์์ ๋ฌธ์ ๋ ์ฌ์ํ๊ฒ ํด๊ฒฐ๋๋ฉฐ ProcessStartInfo.ArgumentList
๋ฐฐํ์์ ์ฌ์ฉํ์ฌ _ ๋๋ถ๋ถ _ ํด๊ฒฐ๋ฉ๋๋ค.
--%
--%
์ ํ์์ฑ์ ์ค์ด๊ธฐ ์ํด ์ ์๋ ค์ง ํน์ ์ผ์ด์ค๋ฅผ ๋ณด์ ํ ์ ์์ต๋๋ค. ์๋๋ฅผ ์ฐธ์กฐํ์ญ์์ค.๋ฐ๋ผ์ _ ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ _ ๋ค์ ์ค ํ๋๋ฅผ ์ ํํด์ผํฉ๋๋ค.
์ธ์ ์ ๋ฌ์ด ์ ๋๋ก ์๋ํ๋๋กํ๋ ๊ฒ์ ์ค์์ฑ์ ์ธ์ํ๊ณ _ ์ญ ํธํ์ฑ์ ํฌ์ํ์ฌ ์์ ํฉ๋๋ค _.
์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ด ์ ๋ง ์ค์ํ๋ค๋ฉด Native
๋ชจ๋ ์์ ie
ํจ์์ ๊ฐ์ ์ ์ฐ์ฐ์ ๋๋ ํจ์๋ฅผ ์ ๊ณตํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ธ๋ถ๋ฅผ ํธ์ถํ๋ ์ ์ผํ ์ ๋ขฐํ ์์๋ ๋ฐฉ๋ฒ์ผ๋ก ๋๋ฆฌ ๊ณต๊ฐํ์ญ์์ค. ์คํ ํ์ผ.
์ฌํ๊ฒ ์์๋ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ํด๊ฒฐํ๊ธฐ ์ํด _experimental_ ๊ธฐ๋ฅ์ ์ ์ํ๋ ๊ฒ์ ์์ ํ ๋ถ์ ์ ํฉ๋๋ค.
@ SteveL-MSFT
์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ
์ผ๋ก --%
์ฌ์ฉ์ ๊ณ ๋ คํ๋๋ผ๋ ๊ทผ๋ณธ์ ์ผ๋ก ์๋ชป๋ ๋ฐฉ๋ฒ์
๋๋ค.
"..."
์ธ์ฉ ๋ฐ %...%
์คํ์ผ ํ๊ฒฝ ๋ณ์ ์ฐธ์กฐ ๋ง ์๋ _Windows ์ ์ฉ _ ๊ธฐ๋ฅ์
๋๋ค.
์ ๋์ค์์๋ "ํ์ฑ ์ค์ง"๋ผ๋ ๊ฐ๋ ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฉ๋์ง ์์ต๋๋ค. _ ํ์ ํ๋ก์ธ์ค์ ์ ๋ฌํ ๋ช ๋ น ์ค์ด ์์ต๋๋ค _. ์ธ์ ๋ฐฐ์ด ๋ง ์์ต๋๋ค.
๋ฐ๋ผ์ _someone_์ ๋ช
๋ น ์ค์ ProcessStartInfo
ํด๋์ค์ ์์ ์ ์ผ๋ก ์์ ๋ ์ธ์ _before_ ํธ์ถ๋ก ๊ตฌ๋ฌธ ๋ถ์ํด์ผํฉ๋๋ค. ์ด๋ .Arguments
์์ฑ์ ํตํด ์์ ์ ์ผ๋ก ์์๋๋ฉฐ Unix์์๋ ๋ช
๋ น ์ค ๊ตฌ๋ฌธ ๋ถ์์ _Windows_ ๊ท์น์ ์ฌ์ฉํฉ๋๋ค. -๋ฐ๋ผ์ "..."
์ธ์ฉ (๋ด์ฅ ๋ "
์ ""
๋๋ \"
๋ก ์ด์ค์ผ์ดํ ์ฒ๋ฆฌ) ๋ง ์ธ์ํฉ๋๋ค.
--%
๋ "๋ถ๋"CLI๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ํฉ๋ฒ์ ์ธ ์ ์ผํ ๋ชฉ์ ์ธ Windows ์ ์ฉ ๊ธฐ๋ฅ์
๋๋ค.
ํํ
Windows ๋ฐ VC ++ ์ปดํ์ผ๋ฌ๋์ด ๋์์ ์ค๋จํ์ง ์๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
VC ++ ์ปดํ์ผ๋ฌ๋ _ ๋ฌด์ ๋ถ ์ํ์ ์ง์๋ฅผ ๊ฐ์ ธ ์ค๊ธฐ ์ํด
ProcessStartInfo.ArgumentList
ํ๋ฉด ์๋์ผ๋ก ์ ๊ณต ๋๋์ด ๊ท์น์ ์ ํํ ์ค์ํฉ๋๋ค .
_ ์ด๊ฒ๋ง์ผ๋ก๋ ๋๋ถ๋ถ์ ํตํ๋ฅผ ์ฒ๋ฆฌ ํ ์ โโ์์ต๋๋ค. ๋ชจ๋ ํธ์ถ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ฉฐ ์ค์ ๋ก PowerShell์ ์ฑ ์์ด ์๋๋๋ค ._
์์ ์ธ๊ธ ํ ๋ฐ์ ๊ฐ์ด ๋น์ ์์ ์ธ ๊ฒฌ์ ํ์์ด ํ์ํ "๋ถ๋"CLI์ ๊ฒฝ์ฐ --%
์ฌ์ฉํด์ผํฉ๋๋ค (๋๋ Native
๋ชจ๋์์ ins
/ Invoke-NativeShell
).
_ ์์๋ก _ ์ฐ๋ฆฌ๋ ์ ์๋ ค์ง "๋ถ๋"์๋๋ฆฌ์ค, ์ฆ ๋ฐฐ์น ํ์ผ ๋ฐ ํน์ ์ ๋ช Microsoft CLI ํธ์ถ์ ์๋์ผ๋ก ๋ณด์ ํ ์ ์์ต๋๋ค.
๋ฐฐ์น ํ์ผ ์ผ์ด์ค๋ ์ผ๋ฐ์ ์ธ ์ผ์ด์ค์ด๋ฉฐ ์ฝ๊ฒ ์ค๋ช
ํ๊ณ ๊ฐ๋
ํ ํ ์ ์์ต๋๋ค (์ : ์ธ์ฉ ํ ํ์๊ฐ ์๋๋ผ๋ a&b
as "a&b"
)-์ฌ์ฉํ ํ์๊ฐ ์์ต๋๋ค. ์ --%
๋ชจ๋ ๊ฒฝ๊ธฐ ์ ํ ์ง์์ ๊ทธ๋ฌํ ํ๋๋น์ ๊ทธ๋ค์ ์ง์
์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฐ์น ํ์ผ (์ด ๋งค์ฐ ์ผ๋ฐ์ ์ด๋ค), az.cmd
ํผ๋ ์ค๋ฌ์ธ ์์๋ ํน์ CLI์ ๋ํ ํ๋ ์ฝ๋ฉ ์์ธ์ ๋ํ ๋์์ PowerShell์ ๊ตฌ๋ฌธ ๋ถ์ ๊ฒฐ๊ณผ ์ธ ์ธ์์์ ๋ค์ _pattern_์ ๊ฐ์งํ๋ ๊ฒ์
๋๋ค ( <word>=<value with spaces>
-๋ฐ "<word>=<value with spaces>"
์ ๋ฌํ๋ ๋์ ). , ํ์ฌ์ ๊ฐ์ด <word>="<value with spaces>"
; ํ์๋ "๋ถ๋"CLI๋ฅผ ๋ง์กฑํ๋ ๋์์ ๊ท์น์ ์ค์ํ๋ CLI์์๋ ํ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด echoArgs "foo=bar baz"
๊ถ๊ทน์ ์ผ๋ก echoArgs --% foo="bar baz"
์ ๋์ผํ ์ฒซ ๋ฒ์งธ ์ธ์๋ฅผ ๋ด
๋๋ค.
@musm https://github.com/PowerShell/PowerShell/blob/master/test/tools/TestExe/TestExe.cs ์์ TestExe
์ ์์ค ์ฝ๋๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค .
GitHub๋ชจ๋ ์์คํ ์์ํ PowerShell! GitHub์์ ๊ณ์ ์ ๋ง๋ค์ด PowerShell / PowerShell ๊ฐ๋ฐ์ ๊ธฐ์ฌํ์ธ์.
๊ธฐ๋ณธ์ ์ผ๋ก ์์ธ๋ฅผ ์์ฉํ๋ ๊ฒ์ ์ฌ๋๋ค์ด PowerShell์ "์ ์ฉ์ฑ"์ ๋๋๋ ค ์ผํ๋ ํ์ฌ ์ํฉ๊ณผ ์ ์ฌํ ์ํฉ์ผ๋ก ์ด์ด์ง ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์์ธ๊ฐ์๋ ๊ฒฝ์ฐ ์ ์ฉ๋๊ณ ์์์ด ๋ถ๋ช ํด์ผํฉ๋๋ค.
์๋ง๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
# Arguments passed correctly, without regard for the program's ability to handle them
& $program a "" 'c "d e" f'
# Try to pass the arguments intelligently based on the program being called
&[] $program a "" 'c "d e" f'
# Escape the arguments for a batch file, eg) " -> ""
&[bat] $program a "" 'c "d e" f'
๋๋ ๊นจ์ง์ง ์์ ๊ตฌ๋ฌธ์ ์ฐพ๊ธฐ ์ํด ์ ๋ง ๊ณ ์ฌํ๊ณ ์์ต๋๋ค. ํ๋ก๊ทธ๋จ์ ์บ์คํ ํ๋ ๊ฒ์ผ๋ก ์๊ฐํ๋ค๋ฉด ์ ์ด๋ ์ด๋ฐ ์ข ๋ฅ์ ๋ง์ด ๋ง์ง๋ง, ํ๋ก๊ทธ๋จ์ ํฌํจํ๋ ์ค์ ๋ณ์๋ฅผ ์บ์คํ ํ๋ ค๋ฉด ๊ดํธ๋ฅผ ๋ฌถ์ด์ผํฉ๋๋ค.
์ฆ, ์ฌ๋๋ค์ด ์ํ๋ ๋ชจ๋ ์๋ชป๋ ๋์์ ๋ํด ์์ธ๋ฅผ ์ถ๊ฐ ํ ์ ์๋๋ก ํ์ฉํ๋ ๊ฒ ์ธ์๋ --%
์ ํ์์ฑ์ ์ ๊ฑฐํด์ผํฉ๋๋ค. ๋ฑ๋กํ ์์ธ ํด๋์ค๋ ํ๋ก๊ทธ๋จ์ ์ ์ฉ ๊ฐ๋ฅํ์ง (์ง๋ฅ์ ํธ์ถ์ ์ํด) ๊ฒฐ์ ํ๋ ๋ฐฉ๋ฒ๊ณผ ๋ช
๋ น ์ถ์ ๊ตฌ๋ฌธ ํธ๋ฆฌ๋ฅผ ๋์ง๊ณ ์ธ์ ๋ฐฐ์ด / ๋ฌธ์์ด์ ๋ฐํํ๋ ์ด์ค์ผ์ดํ ๋ฉ์๋๋ฅผ ๊ฐ๊ฒ๋ฉ๋๋ค.
"<word>=<value with spaces>"
์ ๋ฌํ๋ ๋์<word>="<value with spaces>"
๋ช ๋ น ์ค์ ๊ตฌ์ฑํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ธ์ฉ ๋ถํธ๋ PowerShell์์ ํธ์ถ์ด ์ธ์ฉ๋๋ ๋ฐฉ์์ ๋ฐ๋ผ์ผํฉ๋๋ค. ๋ฐ๋ผ์:
ํนํ:
| ์คํฌ๋ฆฝํธ ์ธ์ | ๋ช
๋ น ์ค |
| ----------------- | ---------------- |
| p=l of v
| "p = l of v"|
| p=l` of` v
| "p = l of v"|
| p="l of v"
| p = "l of v"|
| p="l of v"'a s m'
| p = "l of v"a "sm"|
| p="l of v"' s m'
| p = "l of vsm"|
๋ง์ง๋ง ํ์ ์๋ ํฐ ๋ฐ์ดํ๋ฅผ ์ ์งํ ์์๋ ์๋ฅผ ๋ณด์ฌ์ค๋๋ค.
๋๋ ์ฌ๊ธฐ์ ๋ง์ ๊ฒฐํจ์ ์ก์ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ผ๋ฉฐ, ํ ๋ก ์ ๊น์ด์ ๋ํด ์ ๋ง๋ก ๊ฐ์ฌํ์ง๋ง ..._ ducks _... ์ค์ ์๋๋ฆฌ์ค์์ ์ค์ ๋ก ์ค์ํ์ด ์ฌ๋ก๋ฅผ ๊ฐ์ง ์ฌ๋์ด ์์ต๋๊น? ?
Powershell์์ ripgrep ์ ์ฌ์ฉํ ๋ ๋ง์ WFT ์๊ฐ์
rg '"quoted"'
๊ทธ๋ฆฌ๊ณ git bash์์๋ ๊ทธ๋ ์ง ์์์ต๋๋ค.
์ฌํ๊ฒ๋์ด ๊ธด github ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๊ณ Powershel์ "
๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ด ์์ ํ ๋ง๊ฐ ์ก๋ค๋ ๊ฒ์ ์์ ๊ธฐ ๋๋ฌธ์ ์ด์ ์ด WTF ์๊ฐ์ ๋ ์ป์ต๋๋ค. ์ต๊ทผ์ "git.exe"์์ ๋ ํ๋ฅญํฉ๋๋ค.
์์งํ ๋งํด์, ์ด์ ๋ ๋ฌธ์์ด์์ ๋งค๊ฐ ๋ณ์๋ก "
๋ฅผ ์ ๋ฌํ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ ๋ Powershell์ ์ฌ์ฉํ์ฌ ๋ค์ดํฐ๋ธ ๋ช
๋ น์ ํธ์ถ ํ ์ ์์ต๋๋ค. ์๋ชป๋ ๊ฒฐ๊ณผ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
์ ๋ง, @ mklement0 ์ ๊ทธ๊ฒ์
์ด์ ์ ์ฌ๋ฌ ๋ฒ ์ธ๊ธํ๋ฏ์ด ์ ์
ํฐ ๋ฐ์ดํ์ ๋น ๋ฌธ์์ด ์ธ์๊ฐ ํฌํจ ๋ ์ธ์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ฌ๋์ง ์์๊ธฐ ๋๋ฌธ์ PowerShell์ ํ์ฌ์ด ๋ช ๋ น์ ์ดํํ์ง ๋ชปํฉ๋๋ค.
์์ ์ธ๊ธํ๋ฏ์ด, ๊ฐ๋ฅํ ์ธ๋ถ CLI๊ฐ ๋ถ์กฑํ์ฌ์ด ๋ฌธ์ ๊ฐ ๊ฑฐ์ ๋๋ฌ๋์ง ์๋ Windows ์ ์ฉ ์๋์๋ ๋ฌธ์ ๊ฐ ์ ์์ ์ ์์ง๋ง ์์ฆ์ ์ฌ๋ผ์ง๊ณ PowerShell์ด โโ์ ๋ขฐํ ์์๋ ํฌ๋ก์ค ํ๋ซํผ์ผ๋ก ์๋ฆฌ ๋งค๊นํ๋ ค๋ ๊ฒฝ์ฐ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผํฉ๋๋ค .
๊ทธ๋ฆฌ๊ณ ๋ธ๋ ์ดํน ์ฒด์ธ์ง์ ๋ํด.
์ต๊ทผ์ ๋๋ฃ๊ฐ ๋ด ์คํฌ๋ฆฝํธ๊ฐ ๊ทธ์ ์ปดํจํฐ์์ ์๋ํ์ง ์๋๋ค๊ณ ์ ์๊ฒ ์ผ์ต๋๋ค. ์ ๋ Powershel Core์์๋ง ์คํํ๊ณ ์์๊ณ ๊ทธ๋ Windows Powershell์์ ์คํํ๊ณ ์์์ต๋๋ค. Windows Powershell์์๋ "BOM"์ด ์๊ณ Powershel Core์์๋ BOM์ด์๋ Out-File -Encoding utf8
์ธ์ฝ๋ฉ ํ์ผ์ด ๋์ต๋๋ค. ์ด๊ฒ์ ์ด๋ป๊ฒ ๋ ๊ณต๊ฐ๋์ง ์์ ์์ด์ง๋ง Powershel์ ์ด๋ฏธ ๋ฏธ๋ฌํ ๋ณ๊ฒฝ ์ฌํญ ์ด ์์์ ๋ณด์ฌ ์ฃผ๋ฉฐ ์ ๋ช
ํ ์ธ์ด์์ ๊ธฐ์ดํจ๊ณผ ์ง๊ด์ ์ธ ๋์์ ์ ๊ฑฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ข์ต๋๋ค. Windows ์ธ๋ถ์์ ์ ๊ณต๋๋ ํฌ๋ก์ค ํ๋ซํผ Powershell์ด โโ์๊ณ Windows Powershell์ด โโ"์ ์ง ๊ด๋ฆฌ"๋ชจ๋์ ์์ผ๋ฉฐ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ ์์ํ ์ฌ์ฉํ ์ ์์์ ์๊ณ ์์ผ๋ฏ๋ก Powershel ํ์ด ๋ณ๊ฒฝ ์ฌํญ์ ๊นจ๋ ๋ฐ ์ข ๋ ๊ด๋ํ๋ค๋ฉด ์ข์ ๊ฒ์
๋๋ค. ์ต์ ๋ฒ์ ์ Powershell์์ ์ค๋จ ๋ ์ค๋๋ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๊ธฐ๋ฅผ ์ํฉ๋๋ค.
RE : ๋ณ๊ฒฝ ์ฌํญ์ ๋ง์ง๋ง ์ง์ ์ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. ๋ค์ํ ์ด์ ๋ก ์ธํด _many_ ๊ฐ์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ํ์ฉ๋์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ์ ๋ ์์ฃผ ์ผ๋ถ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์ ํธ์ ์ด์ ๋ก ๋์ด์ ์ฐํธ๋ฆฌ๊ณ ์ค์ ๊ฐ์น์ ๋ํ ์ ์ ํ ๊ณ ๋ ค๊ฐ ์ฃผ์ด์ง์ง ์๋ ๊ฒฝ์ฐ๊ฐ ์ ์ ๋ ๋ง์์ง๊ณ ์์ต๋๋ค.
์ด์ ๊ฐ์ ๋ช ๊ฐ์ง ๋ณ๊ฒฝ ์ฌํญ์ ํญ์ ๋ฐ์ํ๋ ์์ ์ ์ํํ๊ธฐ ์ํด PowerShell ์ธ๋ถ์ ์ ๊ทผํด์ผํ๋ ๋ชจ๋ ์ฌ๋์ ์ํด ์ ๋ฐ์ ์ธ ์ ธ ํ๊ฒฝ์ _ ๋๋ _ ๊ฐ์ ํฉ๋๋ค. ํ์ฌ์ ๋์์ด ์ ์ง ๋ ์์๊ณ ๊ฐ์ฅ ๋จ์ํ ์ฉ๋๋ฅผ ์ ์ธํ๊ณ ๋ ์ด๋ฏธ ๋๋ถ๋ถ ์์๋์๋ค๋ ๊ฒ์ด ๋ช ๋ฒ์ด๊ณ ํฉ์๋์์ต๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์ฐ๋ฆฌ๋ ์ด๋ฏธ ์น์ธ ๋ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ ์ค ์ผ๋ถ๊ฐ ๋น์ทํ๊ฒ ํฐ ์ํฅ์ ๋ฏธ์น๋ ์์ญ ๊ฐ์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์์์๋ ๋ถ๊ตฌํ๊ณ ์ฌ์ ํ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํ ์ด๋ฌํ ๊ณ ๋์ ์ง๋ฉดํ๊ณ ์์ต๋๋ค.
์์ ๋ฅผ ์์ฒญํ๋ ์ฌ๋๋ค์ ์ํด ์ ์ ์๊ฐ์๋ด์ด Stack Overflow๋ฅผ ๋ฐฉ๋ฌธํ์ญ์์ค. @ mklement0 ์๋ ์ต์ ๋ฒ์ ์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ค๋ช ํ๊ธฐ ์ํด ์ปค๋ฎค๋ํฐ ๋์์ด ํ์ํ ์๊ฐ ๋ง์ด ์์ต๋๋ค. _ ํญ์ _ ๋ฐ์ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋์์ด๋๋ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ง๋ค์ง ์์ ๋ณ๋ช ์ ์ฌ์ง ๊ฐ ์์ต๋๋ค.
MSFT ํ์ด ๋์ผํ ๋ด์ฉ์ ๋ฐ๋ณตํด์ ๋ฐ๋ณต ํ ๋๋ง๋ค ๊ณต๊ฐ์ ์ผ๋ก ๋งํ ์์๋ ๊ฒ๋ณด๋ค ๋ ๋ง์ด ์๊ณ ์๋ค๋ ๊ฒ์ ํ์ ํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๋ค์ ๋ด์ ๊ท์จ์ ์กด์คํ๊ณ ์๋ ฅ์ ๊ฐํด์๋ ์๋ฉ๋๋ค. _ ์ด์ฉ๋ฉด ํํ์ ์ ์ฐพ์ ์์์ ๊ฒ ๊ฐ์ต๋๋ค. ์ค๋ ์๊ฐ์ด ์ง์ฐ๋ ๋ง์ด๊ทธ๋ ์ด์ ์ ๋์ฒด ๊ฒฝ๋ก๋ฅผ ์ค๋ช ํ ์๊ฐ์ด ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋๋ ๊ทธ๊ฒ์ ์๊ณ ์์ผ๋ฉฐ ๊ทธ๊ฒ์ด ๋ด๊ฐ ๊ทธ๊ฒ์ ๋ํด ๊ฑฐ์ ์ง๋ฌธํ์ง ์๋ ์ด์ ์ ๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ ์คํ ์์ค ํ๋ก์ ํธ์ ๋๋ค. ๊ทธ๋ฌํ ๊ฒฐ์ ์ ๋ํ ๊ฐ์์ฑ์ด ์๋ค๋ฉด, ์ฌ๋๋ค์ ํ์ฐ์ ์ผ๋ก ์ข์ ํ๊ฒ ๋ ๊ฒ์ ๋๋ค. ๊ทธ ๋์ ์ ์์ชฝ์ ๋์ง๋ ์ฑ ์์ ์์ต๋๋ค. ๊ทธ๊ฒ์ด ๋ฐ๋ก ์ฌ๊ธฐ ์ํฉ์ ํ์ค์ ๋๋ค, IMO. ๊ทธ๋ ์ต๋๋ค. ๋ง์ด๊ทธ๋ ์ด์ ๊ฒฝ๋ก๊ฐ ์์ผ๋ฉด ๊ทธ ๊ณ ํต์ด ๋ค์ ์ํ ๋ ์ ์์ง๋ง ๊ฐ๋ฅํ ํ ๋ง์ ์ฌ๋๋ค์ด ์์ ์ ์ํ ํ ์ ์๋๋ก ์๋ํด์ผํ๋ ๋ฐฉ์์ ๋ํ ๋ช ํํ ์ ์ฑ ์ด ํ์ํฉ๋๋ค. ํ์ง๋ง ์ ๋ณด๊ฐ ๋ถ์กฑํ๋ฉด ํํ์ ๋๋ฌํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค.
๋๋ ๋น์ ์ด ๋น์ ์ ์๋งค์ ๋ฌด์์ ๊ฐ์ง๊ณ ์๋์ง๋ณด๊ธฐ๋ฅผ ๊ณ ๋ํฉ๋๋ค. ๐
@ mklement0 ๋น์ ์ด ์ ๋์ ์ผ๋ก ์ณ์ต๋๋ค. ๊ทธ๋์ ์ง๊ธ์ ๋น์ ์ ๋ฉํ ํฌ์ธํธ์๋ง ์๋ต ํ ์ ์์ต๋๋ค. ์ํ๊น๊ฒ๋ ์ด์ ๊ฐ์ ์ง๋ฌธ์ ๋ตํ๋ ๋ฐ ํ์ํ ๊น์ด ์์ค์ ๋๋ฌ ํ ์์๋ ๊ฒฝ์ฐ ๋ ์์ ํ ์ ๊ทผ ๋ฐฉ์์ ์๊ฐ์ด ๋์์ ๋๊น์ง ์ค๋จ ๋ณ๊ฒฝ์ ์ฐ๊ธฐํ๊ฑฐ๋ ๊ฑฐ๋ถํ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํ ๋ ๋ค๋ฅธ ๋ฉํ ํฌ์ธํธ๋ฅผ ๋ง๋ค๊ณ ์ถ์ต๋๋ค. ์ฐ๋ฆฌ์ ์๊ฒฉ ๋ถ์ ์ ๋๋ถ๋ถ์ PowerShell 7 ์ฌ์ฉ์๊ฐ ์์ ์ ๋ฒ์ ์ ๊ด๋ฆฌํ์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๊ทธ๋ค์ ํธ์ํ ๊ด๋ฆฌ ํ๊ฒฝ์์ ์๋ํ ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๊ณ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ฌ์ฉ์๋ฅผ 6.2์์ 7.0์ผ๋ก ์ ๊ทธ๋ ์ด๋ํฉ๋๋ค (6.2 ์ฌ์ฉ์๊ฐ 8/3๋ถํฐ 7.0 ์ฌ์ฉ์๊ฐ๋๋ 2 ์ผ ์ฆ๊ฐ๋ฅผ ์ฐธ์กฐํ์ญ์์ค. ์ฌ๊ธฐ์์ ์ ์ผํ ๋ฐ์ดํฐ ํฌ์ธํธ๋ ์๋์ง๋ง ์์ ์ ๋ง๋๋ ๊ฒ์ ์ง๊ธ ํธ๋ฆฌํ ๊ฒ์ ๋๋ค). ์ด๋ฌํ ์ฌ์ฉ์์๊ฒ๋ ์๋ฒฝํ๊ฒ ์๋ํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์๋ํ์ง ์๋ ์คํฌ๋ฆฝํธ๋ก ๋ฐ๊พธ๋ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ํ์ฉ๋์ง ์์ต๋๋ค.
๋๋ ๋ํ ์ปค๋ฎค๋ํฐ์ ๋ธ๋ ์ดํน ์ฒด์ธ์ง์ ์ํฅ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ๋์ง์ ๋ํ ๋ธ๋ก๊ทธ๋ฅผ ๋น์ง๊ณ ์์ต๋๋ค. ์ฆ, ๋ธ๋ ์ดํฌ์ ์๋ณ ๋ฐ ์์ ์ ์ฉ์ด์ฑ์ ๋นํด ๋ธ๋ ์ดํฌ์ ๊ธฐ์กด ์ฌ์ฉ๋ฅ ๊ณผ ์ฌ๊ฐ๋๋ฅผ ์์ํ๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ๊ธฐ์กด ์คํฌ๋ฆฝํธ์์ ๋งค์ฐ ๋๋ฆฌ ํผ์ ธ์ ์๋ณํ๊ณ ์์ ํ๋ ๋ฐ ํผ๋์ค๋ฝ๊ณ ๊นจ์ง๋ ๋์์ ์ ์ฒด ์ฑ๊ณต์์ ์ ์ฒด ์คํจ๊น์ง์ด๋ฏ๋ก ์ฌ๊ธฐ์์ ๋ฌด์์ด๋ ํ ์์๋ ๊ทน๋์ ๊ณผ๋ฌตํฉ๋๋ค.
๋๋ ์ฐ๋ฆฌ๊ฐ 7.1์์ ์ฌ๊ธฐ์ ์๋ฌด๊ฒ๋ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ๋งํ๋ ๊ฒ์ด ๊ณตํํ๋ค๊ณ ์๊ฐํ๋ค. ๊ทธ๋ฌ๋ ๋๋ ์ด๊ฒ์ 7.2์ ๋ํ ์กฐ์ฌ ์ฐ์ ์์๋ก ๋ง๋๋ ๊ฒ์ ๋ํด ํ์คํ ์ด๋ ค์๋ค (์ฆ ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ๋ ผ์ํ๋๋ฐ ์ฐ๋ฆฌ์์ํ ์๊ฐ๋ณด๋ค ๋ ๋ง์ ์๊ฐ์ ํ ์ ํ๋ค).
์์ํ๊ฐ ํ์ํ๋ ์ฃผ์ ๋ณ ์์์ํ๋ฅผ ์๋ช ํ๋ ๊ฒ์ ์ด๋จ๊น์?
์ฐ๋ฆฌ๋ ์ด๊ฒ์ ์ํด ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค. ์ด์ ์ ๋ง์ ๋๋ฆฐ ์ ์ด ์์ง๋ง ์ฐ๋ฆฌ๋ ๋งค์ฐ ๊ฐ๊น์ต๋๋ค (์๋ฅผ ๋ค์ด, ๋ธ๋ก๊ทธ๋ฅผ ๋ง๋ค๊ณ ์์ผ๋ฉฐ ๊ณง ์๋ก์ด ๋ ์ด๋ธ์ด ํ์๋๋ ๊ฒ์ ๋ณด๊ฒ ๋ ๊ฒ์ ๋๋ค).
๋ชจ๋ ๋ถ๋ค์ ์ธ๋ด์ฌ์ ๊ฐ์ฌ ๋๋ฆฌ๋ฉฐ, ํ ๋ก ์ ์์ฒญ๋ ์์ ์๊ฐ๊ณผ ๋ฐฐ๋ ค๋ฅผ ์์ ๋ถ์ ๋ 2 ์ฃผ๋ง๋ค์์ํ์์ ๊ฐ์ ํ ๋ต๋ณ์๋ฐ๋ ๊ฒ์ด ์ฑ๊ฐ์ ์ผ์์ ์๊ณ ์์ต๋๋ค. ๊ทธ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ฌ๋ฌผ์ ๋ํด ๊น์ด ์๊ฐํ์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง, ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์์ํ๋ ๊ฒ๋ง ํผ ์ธ๋ถ์ ์ผ๋ก ํ ๋ก ์ ๊น์ด๋ฅผ ํํํ์ง ์๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ด ๋ฐฑ ๋ก๊ทธ์๋์์ํ ๋ด์์ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ๊ฒ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ๋์ง์ ๋ํ ๋ธ๋ ์ดํน ์ฒด์ธ์ง์ ๊ฐ์ ์ ์ฒด ๋ธ๋ก๊ทธ ์ฃผ์ ๊ฐ ์์ง๋ง, ์์์์ด๋ฅผ ํํ ํ ๊ธฐํ๋ฅผ ์ป์ง ๋ชปํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ๋ ์ฌ๊ธฐ์ ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ๋ํด ๋ง์ ๊ฐ์น๋ฅผ ์ฐพ์ ์ ์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
์ด ํ ๋ก ์์ ๋๋ฌด ๋ฉ๋ฆฌ ๋จ์ด์ ธ ์์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ด ๋ฌธ์ ๊ฐ ํ๋ก์ ํธ ๊ด๋ฆฌ์ ๋ํ ๋ฉํ ๋ฌธ์ ๊ฐ๋๋ ๊ฒ์ ์ํ์ง๋ ์์ง๋ง ์ฌ๊ธฐ์์ ๋ณผ ์์๋ ์ดํดํ ์์๋ ์ข์ ๊ฐ์ ์ผ๋ถ ํด๊ฒฐํ๊ณ ์ถ์์ต๋๋ค. ์ด ๋ฌธ์ ์ ๋ํด ๋ ์์ธํ ์ด์ผ๊ธฐํ๊ณ ์ถ์ ๋ถ์ ๋ค์ ์ฃผ ์ปค๋ฎค๋ํฐ ์ฝ์ ์ฐธ์ฌํด ์ฃผ์๊ธฐ๋ฅผ ๊ฐ์ฒญํฉ๋๋ค ( ์ฌ๊ธฐ์ ์ง๋ฌธ๊ณผ ์๊ฐ์ ์ถ๊ฐํ์๋ฉด ์ฝ์์ ํด๊ฒฐํ๊ฒ ์ต๋๋ค).
๋ฉํ ํฌ์ธํธ์ ๋ํ ๊ฐ๋จํ ๋ฉ๋ชจ : @joeyaiello๋ผ๋ ์ฌ๋ ค ๊น์ ๋ต๋ณ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๋ธ๋ ์ดํน ์ฒด์ธ์ง์ ์ฌ๊ฐ๋์ ๊ดํด์๋ ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ด ์์ถฉ๋๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ค์ ์๋๋ฆฌ์ค์์ ์ค์ ๋ก ์ค์ํ์ด ์ฌ๋ก๊ฐ์๋ ์ฌ๋์ด ์์ต๋๊น?
๋
์ด๊ฒ์ ๊ธฐ์กด ์คํฌ๋ฆฝํธ์์ ๋งค์ฐ ๋๋ฆฌ ํผ์ ธ์ ์๋ณํ๊ณ ์์ ํ๋ ๋ฐ ํผ๋ ์ค๋ฝ์ต๋๋ค.
์ด๋ฏธ ๋๋ฆฌ ํผ์ ธ์๋ ๊ฒฝ์ฐ ํ์ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ด์ํจ๊ณผ ๋ชจํธํจ์ด ์ต์ข ์ ์ผ๋ก์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผํ๋ ๋ ๋ง์ ์ด์ ์ ๋๋ค. ํนํ ์ผ์ด์ค ์๊ฐ ์ฆ๊ฐ ํ ๊ฒ์ผ๋ก ์์ํด์ผํฉ๋๋ค.
๊ธฐ์กด์ ๋ชจ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์ค๋จ๋๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
์ด๋ฅผ ํผํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํ๋ค๋ฉด ์ด์ ์ ์ ์ ๋์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ด
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋
Native
๋ชจ๋์์ie
ํจ์์ ๊ฐ์ _new ์ฐ์ฐ์ ๋๋ ํจ์ _๋ฅผ ์ ๊ณตํ๊ณ ์ธ๋ถ ์คํ ํ์ผ์ ํธ์ถํ๋ ์ ์ผํ ์ ๋ขฐํ ์์๋ ๋ฐฉ๋ฒ์ผ๋ก ๋๋ฆฌ ๊ณต๊ฐํฉ๋๋ค.
ie
์ ๊ฐ์ _function_์ ์ฌ์ฉํ๋ฉด _ ์ธ์ด _์ ์๋ก์ด ๊ตฌ๋ฌธ ์์ (์ฐ์ฐ์)์ ๋ํ ๋ถ๋ด์์ฃผ์ง ์๊ณ _minimal fuss_, _ ์ค๋จ ์ ์ผ๋ก _ ์ฌ๋ฐ๋ฅธ ๋์์ ์ ํํ ์ ์์ต๋๋ค. ๋๋ฌด ๊นจ์ ธ์ ๊ณ ์น ์์๋ ๋ ๊ฑฐ์ ๋ฒ๊ทธ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด :
๊ธฐ๋ณธ ๋์์ด ์์ ๋๋ ๊ฒฝ์ฐ :
ie์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ์ฌ๋๋ค์ด ์ต์ํ์ ์๋์ผ๋ก ์ฌ๋ฐ๋ฅธ ํ๋์ ์ ํํ ์ ์์ต๋๋ค.
# 13428์ ํตํด ์ฑํ์ ๋จ์ํ ํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด๊ฒ์ Engine์์ @ mklement0 ์ ์กฐ์ฌ์ ํฌ๋ช ํ๊ฒ ์ฃผ์ ํ ์ ์์ต๋๋ค.
๋ฟก ๋นต๋จ
๊ธฐ๋ณธ์ ์ผ๋ก ์์ธ๋ฅผ ์์ฉํ๋ ๊ฒ์ ์ฌ๋๋ค์ด PowerShell์ "์ ์ฉ์ฑ"์ ๋๋๋ ค ์ผํ๋ ํ์ฌ ์ํฉ๊ณผ ์ ์ฌํ ์ํฉ์ผ๋ก ์ด์ด์ง ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์์ธ๊ฐ์๋ ๊ฒฝ์ฐ ์ ์ฉ๋๊ณ ์์์ด ๋ถ๋ช ํด์ผํฉ๋๋ค.
๋ด๊ฐ ์ ์ํ๋ ํธ์ ๊ธฐ๋ฅ์ ๋๋ถ๋ถ์ ํธ์ถ์ "๊ทธ๋ฅ ์๋"ํ๋๋ก ๋ง๋ญ๋๋ค. Windows ๋ช ๋ น ์ค ๋ฌด์ ๋ถ ์ํ์์ ์ฌ์ฉ์๋ฅผ ๋ณดํธํ๊ธฐ ์ํด ์ต์ ์ ๋คํด์ผํ๋ ์ ์ฉํ ์ถ์ํ์ ๋๋ค.
์ ๋นํ ๊ฐ์ ์์ด ์ฐจํ๊ฐ _legacy_ ์คํ ํ์ผ์ ๋ํ ์ผํ์ฑ ๋ ธ๋ ฅ์ด๋ฉฐ ์๋ก ์์ฑ ๋ ๊ฒ์ Microsoft C / C ++ ๊ท์น์ ์ค์ํ๋ค๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ _all_ ์ผ์ด์ค์์ ๊ทธ๋ ๊ฒํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ์๋์ผ๋ก ์์ฉ ๋ ์์๋ ๊ฒฝ์ฐ --%
์์ต๋๋ค.
๊ฐ์ธ์ ์ผ๋ก, ์ฃผ์ด์ง ์ ํธ๋ฆฌํฐ foo
๊ฐ foo.bat
๋๋ foo.cmd
๋ก ๊ตฌํ๋๋์ง ๋๋ foo="bar none"
ํ์ํ์ง์ ๋ํด ์๊ฐํ๊ณ ์ถ์ง ์์ต๋๋ค "foo=bar none"
ํ์ฉํ์ง ์๊ณ ๊ท์น์ ์ค์ํ๋ ์คํ ํ์ผ๊ณผ ๋์ผํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ &[bat]
์ ๊ฐ์ ๋ค์ํ ์์ธ์ ๋ํด ๋ณ๋์ ๊ตฌ๋ฌธ ํ์์ ์ํ์ง๋ ์์ต๋๋ค.
๋์ , --%
์ (๋) ๋์ ํ๋ก๊ทธ๋จ์ ๊ตฌ์ฒด์ ์ด๊ณ ๋น ๊ด์ต์ ์ธ ์๊ตฌ ์ฌํญ์ด ๋ฌด์์ด๋ ๊ฐ์ ๋ช
๋ น ์ค์ ์ ๋ฌํ๋ ค๋๋๋ก ์ ํํ๊ฒ ๊ณต์ํํ๊ธฐ์ํ (Windows ์ ์ฉ) ํฌ๊ด์ ์ธ ๋๊ตฌ์
๋๋ค.
๊ตฌ์ฒด์ ์ผ๋ก ์ ์ ๋ ํธ์ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ ธํธ :
์ธ๊ธํ๋ฏ์ด _Windows์์๋ง _ ํ์ํฉ๋๋ค. Unix์์ ProcessStartInfo.ArgumentList
๋ก ์์ํ๋ฉด ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
์ ์ด๋ ๋์ ์์ค์์ ์ด๋ฌํ ํธ์๋ ๊ฐ๋ ํํ๊ณ ๋ฌธ์ํํ๊ธฐ ์ฝ์ต๋๋ค.
_after_ PowerShell์ ์ผ๋ฐ์ ์ธ ๊ตฌ๋ฌธ ๋ถ์์ด (Windows ์ ์ฉ) ํ๋ก์ธ์ค๋ก์ ๋ณํ ๋ช ๋ น ์ค ๋จ๊ณ์์ ์ ์ฉ๋ฉ๋๋ค. ์ฆ, PowerShell์ ์์ฒด ๋งค๊ฐ ๋ณ์ ๊ตฌ๋ฌธ ๋ถ์์ ๊ด๋ จ๋์ง ์์ผ๋ฉฐ _shouldn't_ be , @ yecril71pl์ ๋๋ค.
์ด๋ฌํ ์กฐ์ ์ผ๋ก ๋ค๋ฃจ์ง ์๋ ์ง์ ์ผ๋ก ์ด๊ตญ์ ์ธ ๊ฒฝ์ฐ๋ ์ฌ์ฉ์๊ฐ ์ง์ ์ฒ๋ฆฌํด์ผํฉ๋๋ค.
--%
-๋๋ Native
๋ชจ๋์ด ์ค์น๋ ์ํ์์ ins
/ Invoke-NativeShell
๋ฅผ ์ฌ์ฉํ๋ฉด PowerShell ๋ณ์ ๋ฐ ์ ๊ฐ์ ํธ์ถ์ ํฌํจํ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค.
Native
๋ชจ๋์ dbea
( Debug-ExecutableArguments
) ๋ช
๋ น์ ๊ถ๊ทน์ ์ผ๋ก ์ฌ์ฉ๋๋ ํ๋ก์ธ์ค ๋ช
๋ น ์ค์ ์ง๋จํ๊ณ ์ดํดํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ์๋ ์์ ์น์
์ ์ฐธ์กฐํ์ญ์์ค.์๋ฐ ์์ค ๋ชฉ๋ก :
๋ฐฐ์น ํ์ผ์ ๊ฒฝ์ฐ (์ด ์ฌ๋ก๋ฅผ ์๋์ผ๋ก ์์ฉํ๋ ๊ฒ์ ์ค์์ฑ์ Azure์ ๊ฒฝ์ฐ az.cmd
์ ๊ฐ์ด ๋ฐฐ์น ํ์ผ์ ์ง์
์ ์ผ๋ก _ ์ฌ์ฉํ๋ ๊ณ ํ๋กํ์ผ CLI์ ๋ณด๊ธ์
๋๋ค).
""
( \"
์๋)๋ก ์ด์ค์ผ์ดํ๋ฉ๋๋ค.cmd.exe
๊ฐ์ ๋ฉํ ๋ฌธ์๋ฅผ &
๋ฐ์ดํ (PowerShell์ ๋ฐ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ง ๋ฐ์ดํ์ ๊ณต๋ฐฑ์ด ์ธ์๋ฅผ ๋๋ฌ์ผ)๋ก ๋ฌถ์ฌ; ์๋ฅผ ๋ค์ด PowerShell์์ a&b
๋ก ํ์๋๋ ์ฝ์ด ์ธ์๋ ๋ฐฐ์น ํ์ผ์ ์ ๋ฌ ๋ ๋ช
๋ น ์ค์์ "a&b"
๋ก ๋ฐฐ์น๋ฉ๋๋ค.msiexec.exe
/ msdeploy.exe
๋ฐ cmdkey.exe
์ ๊ฐ์ ์ฃผ์ CLI์ ๊ฒฝ์ฐ (ํ๋ ์ฝ๋ฉ ์์ธ ์์) :
๋ค์ ํ์์ ์ธ์๊ฐ ํ๋ ์ด์ ํฌํจ ๋ ํธ์ถ์ ์๋ ์ค๋ช
๋ ๋์์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค. <word>
๋ ๋ฌธ์, ์ซ์ ๋ฐ ๋ฐ์ค๋ก ๊ตฌ์ฑ ๋ ์ ์์ต๋๋ค.
<word>=<value with spaces>
/<word>:<value with spaces>
-<word>:<value with spaces>
๊ทธ๋ฌํ ์ธ์๊ฐ์๋ ๊ฒฝ์ฐ :
""
( \"
์๋)๋ก ์ด์ค์ผ์ดํ๋ฉ๋๋ค.<value with spaces>
์ _embedded_ "
๋ฌธ์๊ฐ์๋ ๋๋ฌธ ๊ฒฝ์ฐ์ --%
์ฌ์ฉํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค. ์ :msiexec ... --% PROP="Nat ""King"" Cole"
<value with spaces>
๋ถ๋ถ ๋ง ํฐ ๋ฐ์ดํ๋ก ๋ฌถ์ฌ ์์ผ๋ฉฐ ์ธ์ ์ ์ฒด๊ฐ ์๋๋๋ค (ํ์๋ PowerShell-์ ๋นํ๊ฒ-๊ธฐ๋ณธ์ ์ผ๋ก ์ํํ๋ ์์
์
๋๋ค). ์๋ก์ PowerShell์ ๋ณผ ์ถ ์ด์ ์ธ์ foo=bar none
๋ก ๋ฐฐ์น foo="bar none"
(๋ณด๋ค ์คํ๋ ค ๊ฐ์ ํ๋ก์ธ์ค์ ์ปค๋งจ๋ ๋ผ์ธ์ "foo=bar none"
).msiexec
๊ท์น-์ค์ ๊ฒฝ๊ธฐ ์ ํ ์ง์๊ฐ ํ๋ช
ํ๊ฒ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ์คํ์ผ CLI, ์ ํ ํด๋ฅผ ๋ผ์น์ด ์ํ๋์ง ์์ต๋๋ค <word>="<value with spaces>"
๋ฐ "<word>=<value with spaces>"
_equivalent_, ๋ชจ๋ ๋ํ๋ด๋ ๊ทธ๋๋ก <word>=<value with spaces>
""
์ \"
๋ฅผ ์๋ก ๋ฐ๊ฟ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋จ, PowerShell์ ์์ฒด CLI, Ruby ๋ฐ Perl (_not_performance)์ ์ ์ธํ๊ณ ๋ ํฌํจ ๋ "
๋ฌธ์๋ฅผ ์ด์ค์ผ์ดํํฉ๋๋ค. ์ ์ด๋ PowerShell CLI๊ฐ ํธ์ถ๋๋ ๊ฒฝ์ฐ ํธ์๋ ๊ฐ์น๊ฐ ์์ง๋ง ํ๋ ์ฝ๋ฉ Ruby ๋ฐ Perl๋ ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.)CommandLineToArgvW
WinAPI ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์
์ด ""
-escaping์ ์ง์ํ์ง _ ์๋๋ค๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค.Windows์์ ๋ชจ๋ ๋ค๋ฅธ ๊ฒฝ์ฐ๋ ํจ๊ป ์ฒ๋ฆฌ ํ ์ ProcessStartInfo.ArgumentList
์์ ์ ์ผ๋ก ์ ์ฉ๋๋, ๋ง์ดํฌ๋ก ์ํํธ C / C ++ ๊ท์น (ํนํ ์๋ฏธ \"
์ํด "
-escaping).
ie
(ํ์ฌ ๋ฒ์ ํจ์ 1.0.7
)์ Native
๋ชจ๋ ๊ตฌํ PowerShell์ ๋ฒ์ 3 ๋ฐ ์ต๋ ๋ (๊นจ์ง ์ธ์ ํ์ฑ ๊ณ ์ ์ด์ธ์)์ด ํธ์ ( Install-Module Native
).
๋๋ถ๋ถ์ ์ธ๋ถ ์คํ ๊ฐ๋ฅ ํธ์ถ์ ๋ํด "๊ทธ๋ฅ ์๋ํ๋ค"๋ ์ฃผ์ฅ์ ํ ์คํธํ๊ธฐ ์ํด ์ฌ๊ธฐ์๋ ๋ชจ๋ ์ฌ๋๊ณผ ํจ๊ป
ํ์ฌ ํผํ ์์๋ ์ ํ :
์ฐธ๊ณ : ์ด๋ฌํ ๊ธฐ์ ์ ์ ํ์ ie
๊ฐ _function_์ผ๋ก ๊ตฌํ๋๋ ๋ฐ์ ๋ฐ์ํฉ๋๋ค (์์ง ์์ฒด์ ์ ์ ํ ์์ ์ ์ด๋ฌํ ๋ฌธ์ ๊ฐ _ ์๋๋๋ค _).
$LASTEXITCODE
๊ฐ ํ๋ก์ธ์ค์ ์ข
๋ฃ ์ฝ๋๋ก ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋์ด ์์ง๋ง $?
๋ ํญ์ $true
๋๋ฉ๋๋ค. ํ์ฌ ์ฌ์ฉ์ ์ฝ๋๋์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋๋ผ๋ $?
๋ช
์ ์ ์ผ๋ก ์ค์ ํ ์ ์์ต๋๋ค. ๋
น์์ผ๋ก ์ผ์ ธ ์์ต๋๋ค -https://github.com/PowerShell/PowerShell/issues/10917#issuecomment -550550490์ ์ฐธ์กฐ &&
๋ฐ ||
, ํ์ดํ ๋ผ์ธ ์ฒด์ธ ์ฐ์ฐ์ ์ธ &&
์ ํจ๊ป ie
์๋ฏธ์๊ฒ ์ฌ์ฉํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
๊ทธ๋ฌ๋ 0์ด ์๋ ์ข
๋ฃ ์ฝ๋๋ฅผ ๊ฐ์งํ๋ ์คํฌ๋ฆฝํธ๋ฅผ _aborting_ํ๋ ค๋ ๊ฒฝ์ฐ iee
๋ํผ ํจ์๋ฅผ โโ์ฌ์ฉํ ์ ์์ต๋๋ค.
--
์ธ์๋ ํญ์ PowerShell ๋งค๊ฐ ๋ณ์ ๋ฐ์ธ๋์ ์ํด "๋จน ํ๋๋ค". ๋จ์ํ ์ ๋ฌํ๋ ์์๋ฅผ ํต๊ณผ _twice_ --
(๋์ ์คํ๊น์ง foo -- --
๋์ foo --
).
,
์ ์ธ์ฉ๋์ง ์์ ํ ํฐ์ ๋ฐฐ์ด๋ก ํด์๋๊ณ ์ฌ๋ฌ ์ธ์๋ก ์ ๋ฌ๋์ง ์๋๋ก ์ธ์ฉํด์ผํฉ๋๋ค. ์๋ฅผ ๋ค์ด์ด ํต๊ณผ 'a,b'
๋ณด๋ค๋ a,b
; ์ ์ฌํ๊ฒ -foo:bar
(์ด๋ฆ์ด ์ง์ ๋ PowerShell ์ธ์์ฒ๋ผ ๋ณด์ด๋ ๊ฒ)๋ฅผ '-foo:bar'
(ํ์ํ ๊ฒ์ ์๋์ง๋ง ๋ฒ๊ทธ ๋๋ฌธ์
๋๋ค. # 6360); ์ ์ฌํ๊ฒ '-foo.bar must be passed as
'-foo.bar'` (์ธ๋ถ ์คํ ํ์ผ์ ๋ํ ์ง์ ํธ์ถ์๋ ์ํฅ์ ๋ฏธ์น๋ ๋ ๋ค๋ฅธ ๋ฒ๊ทธ : # 6291)
์ด ๊ธฐ๋ฅ์ด PowerShell _Core_์์ ๊ฐ๋ ฅํ๊ฒ ์๋ ํ ๊ฒ์ผ๋ก ๊ธฐ๋ํฉ๋๋ค. ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ _Windows PowerShell_์ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ์ธํด ๋ค์ ๋ ๊ฐ์ง๋ง ์๊ณ ์์ง๋ง ์ ๋๋ก ์ฒ๋ฆฌ๋์ง ์๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
msiexec
์คํ์ผ CLI์ ๋ํ ๋ถ๋ถ ์ธ์ฉ ์กฐ์ ์ ๋ฒ์ 3 ๋ฐ 4์ ์ ์ฉ๋ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ฒ์ ์ ์ ์ฒด ์ธ์๋ฅผ ์ถ๊ฐ ํฐ ๋ฐ์ดํ ์ธํธ๋ก ๋ํํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋ฌ๋ v5.1์์๋ ์๋ํฉ๋๋ค.
""
-escaping์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉ๋์ง๋ง \"
๊ฐ ํ์ํ ๊ฒฝ์ฐ (PowerShell CLI, Perl, Ruby) 3" of snow
์ ๊ฐ์ ํ ํฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋ชจ๋ Windows PowerShell ๋ฒ์ ์ ์ด๋ฌํ ์ธ์๋ฅผ ํฐ ๋ฐ์ดํ๋ก ๋ฌถ์ง ์๊ธฐ ๋๋ฌธ์ ์ค์๋ก _3_ ์ธ์๋ก ์ ๋ฌ๋์์ต๋๋ค. ์ด๊ฒ์ ๊ณต๋ฐฑ ๋ฌธ์๊ฐ ์์ ์์ง ์์ ์ด๊ธฐ "
๋ฌธ์๊ฐ ์๋ ์ธ์์ ๋ํด ๋ฐ์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ฐธ๊ณ : dbea
( Debug-ExecutableArguments
) ํจ์๋ ์ธ๋ถ ์คํ ํ์ผ / ๋ฐฐ์น ํ์ผ์์ ์ธ์๋ฅผ๋ฐ๋ ๋ฐฉ๋ฒ์ ์ค๋ช
ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
dbea
์ฌ์ฉ๋๋ .NET ์ฝ์ ์ ํ๋ฆฌ์ผ์ด์
) :# Note the missing 2nd argument and the effective loss of embedded double quotes,
# due to the embedded " chars. not having been escaped.
PS> dbea -- 'a&b' '' '{ "foo": "bar" }'
2 argument(s) received (enclosed in <...> for delineation):
<a&b>
<{ foo: bar }>
Command line (helper executable omitted):
a&b "{ "foo": "bar" }"
-UseBatchFile
๋ฅผ ์ฌ์ฉํ์ฌ dbea
๋์ ์ธ์๋ฅผ ๋์ฐ๋ฏธ _batch file_์ ์ ๋ฌํฉ๋๋ค.
# Note that only *part of the first argument* is passed and that the `&` is interpreted as cmd.exe's
# statement separator, causing `b` to be run as a command (which fails).
PS> dbea -UseBatchFile -- 'a&b' '' '{ "foo": "bar" }'
1 argument(s) received (enclosed in <...> for delineation):
<a>
'b' is not recognized as an internal or external command,
operable program or batch file.
msiexec
-style CLI ํธ์ถ, cmdkey.exe
:# The call fails, because `cmdkey.exe` requires the password argument to
# to be quoted exactly as `/password:"bar none"` (double-quoting of the option value only),
# whereas PowerShell - justifiably - passes `"/password:bar none"` (double-quoting of the whole argument).
PS> cmdkey.exe /generic:foo /user:foo /password:'bar none'
The command line parameters are incorrect.
ie
๋ฌธ์ ํด๊ฒฐ :dbea
ํธ์ถ์์ -ie
๋ฅผ ์ฌ์ฉํ๋ฉด ํธ์ถ์ ie
๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
dbea
์ฌ์ฉ๋๋ .NET ์ฝ์ ์ ํ๋ฆฌ์ผ์ด์
) :# OK
# Note that the empty 2nd argument is correctly passed, and that \" is used for embedded "-escaping.
PS> dbea -ie -- 'a&b' '' '{ "foo": "bar" }'
3 argument(s) received (enclosed in <...> for delineation):
<a&b>
<>
<{ "foo": "bar" }>
Command line (helper executable omitted):
a&b "" "{ \"foo\": \"bar\" }"
# OK
# - `a&b` was enclosed in "...", due to the presence of metacharacter `&`
# - "" is used for escaping of embedded " chars.
# Note that `echo %1`, for instance, prints the argument exactly as passed on the command line, including quoting.
# `echo %~1` strips the surrounding double quotes, but embedded escaped ones still print as "".
# However, if you pass these arguments (`%*`) through to convention-compliant CLIs, they are parsed correctly.
PS> dbea -ie -UseBatchFile -- 'a&b' '' '{ "foo": "bar" }'
3 argument(s) received (enclosed in <...> for delineation):
<"a&b">
<"">
<"{ ""foo"": ""bar"" }">
msiexec
-style CLI ํธ์ถ, cmdkey.exe
:# The call now succeeds, because `ie` ensure the value-only double-quoting that cmdkey.exe requires.
# (Use `cmdkey /del:foo` to remove the credentials again.)
PS> ie cmdkey.exe /generic:foo /user:foo /password:'bar none'
CMDKEY: Credential added successfully.
dbea
๋ฅผ ํตํด ์ค์ ๋ช
๋ น ์ค์ ๊ฐ ์ ์ฉ ํฐ ๋ฐ์ดํ๊ฐ ์ ์ฉ๋์์์ ํ์ํ๋ ค๋ฉด ๋ค์์ ์ํํ์ญ์์ค.
PS> dbea -ie -- cmdkey.exe /generic:foo /user:foo /password:'bar none'
<cmdkey.exe>
</generic:foo>
</user:foo>
</password:bar none>
Command line (helper executable omitted):
cmdkey.exe /generic:foo /user:foo /password:"bar none"
๋ค์ ์ฝ๋๋ ๋ฐ์ดํฐ ์์ค์ ์ ๋ฐํฉ๋๋ค.
{ PARAM($A) $A } | OUT-FILE A.PS1
PWSH A.PS1 -A:(1,2)
1
@JamesWTruher ์ ์ ์ ๋ ์์ ์ฌํญ์ด
์ ์ ๋ ์์ ์ฌํญ์ ๋ํ ํ ์์ฒญ์ด ์์ต๋๊น? PR์ ๋ํด ์ธ๊ธ ํ ์ ์์ผ๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๊ฒ์ ๊ณ ์น๋ ๊ฒ์ IMO๊ฐ ๊ฒฐ์ฝ ๋ณต์กํ ๋ถ๋ถ์ด ์๋์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ณต์กํ ๋ถ๋ถ์ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ์ ๋ ์์ ์ด ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง ๋ณผ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค ....
์ข์ ์์์ ๋๋ค. @ SteveL-MSFT-์ฌ๊ธฐ์ ๋ ผ์ ๋ _all_ ๋ฌธ์ ์ ๋ํ ์์ ์ฌํญ์ ๋๊น? ๊ฒฐ๊ตญ v7.1์ ๊ฒฝ์ฐ? ๊ทธ๋ฆฌ๊ณ ๋ ๋ฒ์งธ @TSlivede ์ ์์ฒญ์ ๋๋ค.
@ yecril71pl , ์ด๊ฒ์ ์ข์ ๋ฐ๊ฒฌ์ ๋๋ค. ๋น๋ก ์ด๊ฒ์ด ์ค์ ๋ก PowerShell์ ์์ฒด ๊ตฌ๋ฌธ ๋ถ์ (์ธ๋ถ ์คํ ํ์ผ์ ๋ํ _some_ ํน์ ์ผ์ด์ค๊ฐ ์์)๊ณผ ๊ด๋ จ์ด ์์ง๋ง ๊ธฐ๋ณธ ๋ช ๋ น ์ค์ด ๊ตฌ์ฑ๋๋ ๋ฐฉ๋ฒ _after_ ๊ตฌ๋ฌธ ๋ถ์ (์ด์ ์ ๋ ผ์ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ณณ)๊ณผ๋ ๊ด๋ จ์ด ์์ต๋๋ค. ์์).
Unix์์ ๋ฌธ์ ๋ฅผ๋ณด๋ค ๊ฐ๊ฒฐํ๊ฒ ์ฌํํฉ๋๋ค.
PS> printf '<%s>\n' -a:(1,2,3)
<-a:1>
<2>
<3>
์ฆ, _first_ ๋ฐฐ์ด ์์ ๋ง -a:
์ ์ง์ ์ฐ๊ฒฐ๋๊ณ ๋ค๋ฅธ ์์๋ ๋ณ๋์ ์ธ์๋ก ์ ๋ฌ๋์์ต๋๋ค.
PowerShell ๋งค๊ฐ ๋ณ์์ ๋น์ทํ์ง๋ง ๊ทธ๋ ์ง ์์ ์ธ์์ ๊ด๋ จ๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
$args
/ @args
: # 6360์ ์ฌ์ฉํ๋ _PowerShell_ ๋ช
๋ น์ ๋ํ ํธ์ถ์๋ง ์ํฅ์์ฃผ๋ ๊ด๋ จ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
& { $args.Count; $args } -foo:bar
2, '-foo:', 'bar'
์ฐ์ถํฉ๋๋ค.PowerShell ๋ช
๋ น๊ณผ ์ธ๋ถ ์คํ ํ์ผ ๋ชจ๋์ ์ํฅ์์ฃผ๋ # 6291๋ ์์ต๋๋ค ( .
).
& { $args.Count; $args } -foo.bar
2, '-foo', '.bar'
์ฐ์ถํฉ๋๋ค.ํ ๊ฐ์ง ์ฃผ๋ชฉํ ์ ์ (...)
๋ฅผ ๋ฒ ์ด ์๋์ ์ผ๋ถ๋ก ์ฌ์ฉํ๋ฉด ์ผ๋ฐ์ ์ผ๋ก (...)
์ ์ถ๋ ฅ์ด ์ ์ฒด์ ์ผ๋ก _separate_ ์ธ์๊ฐ๋๋ฏ๋ก ์ฒซ ๋ฒ์งธ ์์ _is_๊ฐ printf
์ฒจ๋ถ๋๋ค๋ ์ฌ์ค์
๋๋ค
& { $args.Count; $args.ForEach({ "$_" }) } foo('bar', 'baz')
2, 'foo', 'bar baz'
& { $args.Count; $args.ForEach({ "$_" }) } foo('bar', 'baz')
์ฐ์ถํ๊ณ ๋ ๋ฒ์งธ ์ธ์๋ ๋ฐฐ์ด 'bar', 'baz'
์ ๋ฌธ์์ด ํ์
๋๋ค.
PowerShell์ด โโ์ธ๋ถ ์คํ ํ์ผ์ ๋ํด -A:(1,2)
๋ฅผ ์ ๋ฌํด์ผํ๋ ๊ฒฝ์ฐ -A:
๋ ๋ฌธ์์ด์ด๊ณ (1,2)
๋ '1 2'๋ก ๋ง์ฌ๋ง๋์ด์ผํ๋ ๋ฐฐ์ด์์ ์์๋
๋๋ค. PowerShell์ ํธ์ถ์ ์๋ ๊ตฌ๋ฌธ์ ์ ์งํ๋ ค๊ณ ์๋ํ๋ฏ๋ก ๋ชจ๋ ํฉ์น๋ฉด '-A : 1 2'๊ฐ ํ์๋์ง๋ง ์ฌ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๋ '-A : "1 2"'๊ฐ๋ฉ๋๋ค. ๋ง์ฌ๋ง ์ฝ๋์์ ์ฌ์ํ ๋๋ฝ์ฒ๋ผ ๋ณด์
๋๋ค.
@ yecril71pl ์ ํน์ ๋ฌธ์ ๊ฐ ๊ตฌ๋ฌธ ๋ถ์๊ณผ ๊ด๋ จ์ด ์๋ค๊ณ ๋งํ์ง๋ ์๊ฒ ์ต๋๋ค (์ด ๋ฌธ์ ์์ ๋ ผ์๋๋ "๋ฐฐ์ด์ ๋ช ๋ น
PowerShell์ด โโ์ธ๋ถ ์คํ ํ์ผ์ ๋ํด -A : (1,2)๋ฅผ ์ ๋ฌํด์ผํ๋ ๊ฒฝ์ฐ -A :๊ฐ ๋ฌธ์์ด์ด๊ณ (1,2)๊ฐ ๋ฐฐ์ด์์ ํ์ ํฉ๋๋ค.
๊ฑฐ์ : -A:
๋ ๋ช
๋ช
๋ ๋งค๊ฐ ๋ณ์์ด๊ณ ๋ฐฐ์ด์ ํด๋น ๋งค๊ฐ ๋ณ์์ ๊ฐ์
๋๋ค (ํ
์คํธํ๋ ค๋ฉด -
์์์๋ @
์๋ $
์ฌ์ฉํ๋๋ผ๋ ํญ์ (๊ฑฐ์) ํญ์ ์คํ๋ ํ
๋๋ค๋ ๊ฒ์
๋๋ค. ๋ฐฐ์ด์ด (1,2)
์ ๊ฐ์ ํํ์์์ ์์๋ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค.
์๋ฅผ ๋ค์ด ํ
์คํธ printf '<%s>\n' -a:('a b',2)
: ๋ฌธ์์ด a b
์ ๊ณต๋ฐฑ์ด ํฌํจ๋์ด ์์ผ๋ฏ๋ก ์ฌ๋ฐ๋ฅด๊ฒ ์ธ์ฉ๋์ง๋ง 2
๊ฐ ๋ค์ ๋ฐฐ์ด ์์์ ์๊ณ ๋ฐฐ์ด์ด ํ์๋๋ฏ๋ก 2
๋ ์ฒซ ๋ฒ์งธ ์ธ์์ ์ผ๋ถ๊ฐ ์๋๋๋ค.
๋ง๋ฒ์ NativeCommandParameterBinder.cs์์ ๋ฐ์ํฉ๋๋ค.
170 ํ์์ powershell์ ํ์ฌ ์ธ์ ๊ฐ์ ๋ํ ์ด๊ฑฐ์๋ฅผ ๊ฐ์ ธ ์ค๋ ค๊ณ ํฉ๋๋ค.
IEnumerator list = LanguagePrimitives.GetEnumerator(obj);
list
๊ฐ null
list
๊ฐ ์๋ ๊ฒฝ์ฐ powershell์ ๋ชฉ๋ก์ ๊ฐ ์์ (๊ณต๋ฐฑ์ด ํฌํจ ๋ ๊ฒฝ์ฐ ๋ฐ์ดํ๋ก ๋ฌถ์)๋ฅผ lpCommandLine์ ์ถ๊ฐํฉ๋๋ค.
์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ณต๋ฐฑ ( 449 ํ )์ผ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค. ์ ์ผํ ์์ธ๋ ๋ฐฐ์ด์ด ๋ฆฌํฐ๋ด ์ธ ๊ฒฝ์ฐ์
๋๋ค.
( printf '<%s>\n' -a:1,2
).
๊ทธ๋ฐ ๋ค์ powershell์ ์คํฌ๋ฆฝํธ ์ค์์ ์ฌ์ฉ ๋ lpCommandLine์์ ๋์ผํ ๊ตฌ๋ถ ๊ธฐํธ๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํฉ๋๋ค.
์ค๋น๋๋ฉด PR์ ๊ธฐ๋ํฉ๋๋ค. 7.1๋ก ๋ง๋ค๋ฉด ๊ฐ์ ธ ๊ฐ๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด 7.2๊ฐ๋ฉ๋๋ค. ์ญ ํธํ์ฑ์ ๊ทธ๊ฐ ๋ค๋ฃจ๊ณ ์๋ ๊ฒ์
๋๋ค. ์๋ง๋ ๋์์ด๋๋ ๊ฒ์ Pester ํ
์คํธ๋ฅผ ์์ฑํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์
๋๋ค (build.psm1์์ publish-pstesttools
๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋ ํ ์์๋ testexe -echoargs
์ฌ์ฉ).
์ค๋น๋๋ฉด PR์ ๊ธฐ๋ํฉ๋๋ค
์ด๊ฒ์ด ๋ฐ๋ก ์ ๊ฐ ํผํ๊ณ ์ถ์๋ ๊ฒ์ ๋๋ค. ์ค๋น๋์ง ์์ ์ฝ๋๋ฅผ ๋ณด์ฌ์ฃผ์ธ์ (PR์ ์งํ์ค์ธ ์์ ์ผ๋ก ํ์).
๋๋ ์ ์ด๋ ๊ทธ๊ฐํ๊ณ ์ถ์ ์ผ์ ๋ํด ์ธ๊ธํ์ญ์์ค.
๊ทธ๊ฐ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๊ณ ์ถ์์ง ๋ ผ์ ํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
@TSlivede , PowerShell _CLI_๊ฐ ํธ์ถ ๋์๊ธฐ ๋๋ฌธ์-์ธ๋ถ ์คํ ํ์ผ- -A:(1,2)
์ด ํ์ฑ ๋จ _before_์ด ํ ํฐ์ด ๊ฒฐ๊ตญ _named_ -A
๋งค๊ฐ ๋ณ์์ ๋ฐ์ธ๋ ๋จ-์ด๋ฌํ ๋งค๊ฐ ๋ณ์ _eventually_๊ฐ ์๋ํ๊ฒ ๋จ ๋ฌธ์ ์ ๋ถ์์ ์
๋๋ค.
@ yecril71pl :
-A:
์ด ๋ฌธ์์ด์์ ์์๋ ๋๋ค.
์๋์, PowerShell ๋งค๊ฐ ๋ณ์์ _ ๊ฐ์ด ๋ณด์ด๊ธฐ ๋๋ฌธ์ ๊ตฌ๋ฌธ ๋ถ์ ์ค์ ํน์ํ ๊ฒฝ์ฐ์ ๋๋ค.
์ด ํน์ํ ๊ฒฝ์ฐ๋ $args
๋ฅผ ์ฌ์ฉํ๋ PowerShell ๋ช
๋ น์ ๋ํ ํธ์ถ์์๋ ๋ฐ์ํ์ง๋ง (๋ฐ์ธ๋ฉ ๋ ์ค์ ์ ์ธ ๋ ๋งค๊ฐ ๋ณ์๊ฐ์๋ ๊ฒ๊ณผ๋ ๋ฐ๋) ์ธ๋ถ ์คํ ํ์ผ์ ๋ํด _ ๋ค๋ฅด๊ฒ _ ๋ฐ์ํฉ๋๋ค (์ผ๋ฐ์ ์ผ๋ก ๋ณ๋์ ์ธ์๋ ์ฐ๊ฒฐ๋ ์ํ๋ก ์ ์ง๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ปฌ๋ ์
์ ๊ฒฝ์ฐ _first_ ์์ ๋ง).
๋ฏธ๋ฆฌ --
๋ฅผ ์ ๋ฌํ๋ฉด ์ค์ ๋ก์ด ํน์ ์ผ์ด์ค๋ฅผ ์ตํธ ์์ ํ ์ ์์ง๋ง, ๋ฌผ๋ก _PowerShell_ ๋ช
๋ น์ ๋ํ ํธ์ถ์ ๋ํด์๋ง ์ ๊ฑฐ๋๋ --
๋ ์ ๋ฌ๋ฉ๋๋ค.
PS> printf '<%s>\n' -- -a:(1,2,3)
<--> # !! not removed
<-a:>
<1> # array elements are *all* now passed as indiv. arguments, because (...) output is separate (splatted) argument
<2>
<3>
์ธ์ _doesn't_๊ฐ PowerShell ๋งค๊ฐ ๋ณ์์ฒ๋ผ ๋ณด์ด๋ฉด, ์ผ๋ฐ์ ์ธ ๋์ ( (...)
์ถ๋ ฅ์ด ๋ณ๋์ ์ธ์๊ฐ ๋จ)์ ์ธ๋ถ ์คํ ํ์ผ (_array_์ ์ผ๋ฐ์ ์ธ ๋์์ด splatted, ์ฆ ์ธ๋ถ ์คํ ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ ๊ฐ๋ณ ์ธ์).
# Note: No "-" before "a:" -> output from `(...)` becomes separate argument(s)
PS> printf '<%s>\n' a:(1,2,3)
<a:>
<1>
<2>
<3>
์ด ๋์์ _consistently_ ์ ์ฉํ๋ฉด ์๋ฏธ๊ฐ ์์ต๋๋ค. (...)
ํํ์์ด ๋ฒ ์ด ์๋์ ์ผ๋ถ๋ก _always_ ๋ณ๋์ ์ธ์๊ฐ๋์ด์ผํฉ๋๋ค. # 13488์ ์ฐธ์กฐํ์ญ์์ค.
ํ๋์ ์ธ์ ํต๊ณผํ๊ธฐ ์ํด์๋ '-A:1 2 3'
๋ฐฐ์ด _stringified_์ผ๋ก,์ด ๊ฒฝ์ฐ ๋น์ ์ด ํ์๋กํ๋ (N ์์ ์ ) _expandable string_๋ฅผ ์ฌ์ฉ $(...)
๋ณด๋ค๋ (...)
_AND_ - ๋๋ผ ์ธ -ํ์ฌ "..."
:
PS> printf '<%s>\n' "-a:$(1,2,3)" # quotes shouldn't be needed; `-a:"$(1,2,3)"` would work too.
<a:1 2 3> # SINGLE argument with stringified array.
์ด ๊ฒฝ์ฐ์๋ "..."
ํ์ํ์ง ์์ต๋๋ค.-๋งค๊ฐ ๋ณ์์ ์ ์ฌํ ํ ํฐ๊ณผ ๊ด๋ จ๋ ์ด์ (์ผ๋ฐ์ ์ผ๋ก _both_ PowerShell ๋ฐ ์ธ๋ถ ์คํ ๊ฐ๋ฅ ํธ์ถ์ ์ ์ฉ๋จ-# 13489 ์ฐธ์กฐ)๊ณผ ๊ด๋ จ๋ ์์ธ ๋๋ฌธ์ ๋ค์ ํ์ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์ธ์ฉ ํ ํ์๊ฐ ์์ต๋๋ค.
# Anomaly due to looking like a parameter: $(...) output becomes separate argument
PS> Write-Output -- -a:$(1,2,3)
-a:
1
2
3
# Otherwise (note the absence of "-"): no quoting needed; treated implicitly like
# "a:$(1,2,3)"
PS> Write-Output -- a:$(1,2,3)
a:1 2 3 # SINGLE argument with stringified array.
์ธ์ ๋ชจ๋์์ ๋ณตํฉ ํ ํฐ์ ์ธ๊ณ๋ ์ฌ๋ฌ ๊ฐ์ง ๋ถ์ผ์น๊ฐ์๋ ๋ณต์กํ ๊ฒ์ ๋๋ค. # 6467์ ์ฐธ์กฐํ์ธ์.
@ SteveL-MSFT
ํ์ฌ ํ์์์ testexe -echoArgs
๋ ์์ ๋ช
๋ น ์ค ์์ฒด๊ฐ ์๋๋ผ ์์ ๋ช
๋ น ์ค (Windows)์์ .NET Core ์คํ ํ์ผ์ด ๊ตฌ๋ฌธ ๋ถ์ ํ ๊ฐ๋ณ ์ธ์ ๋ง ์ธ์ํฉ๋๋ค.
๋ฐ๋ผ์ ๋ฐฐ์น ํ์ผ ๋ฐ msiexec
์คํ์ผ CLI์ ๋ํ ์ ํ์ ์ธ์ฉ์ ์ฌ์ฉํ์ฌ ์กฐ์ ์ ํ
์คํธ ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์กฐ์ ์ด ๊ตฌํ ๋ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, PROP='foo bar'
๊ฐ PROP="foo bar"
๋ก ์ ๋ฌ๋์๋์ง ํ์ธํ ์ ์์ผ๋ฉฐ ๊ฐ ๋ถ๋ถ์ ํฐ ๋ฐ์ดํ๋ก ๋ฌถ์ ๊ฒ์
๋๋ค.
๊ทธ๋ฌ๋, ์์ ๋ช
๋ น ์ค์ ์ธ์ํ๊ธฐ ์ํด, testexe
.NET ์ฝ์ด๊ฐ ํญ์ ์ฌ์ฉํ๋ ๊ฐ์์ ๋ช
๋ น line_์ _recreates ๋๋ฌธ์, ๋ท๋ท _Core_ ์คํ ํ์ผ์ด ์๋์ด์ผํฉ๋๋ค \"
์๋ฒ ๋๋์ ๋ํ -escaping์ "
chars., ""
๊ฐ ์ฌ์ฉ ๋ ๊ฒฝ์ฐ์๋ ์ผ๋ฐ์ ์ผ๋ก ์ด๋ค ์ธ์๊ฐ ํฐ ๋ฐ์ดํ๋ก ๋ฌถ ์๋์ง, ๊ทธ๋ ์ง ์์์ง ์ ํํ๊ฒ ๋ฐ์ํ์ง ์์ต๋๋ค. ๋ฐฐ๊ฒฝ์ https://github.com/ ์ฐธ์กฐ dotnet / runtime / issues / 11305 # issuecomment -674554010.
.NET _Framework_- ์ปดํ์ผ ๋ ์คํ ํ์ผ ๋ง Environment.CommandLine
์ ์ค์ ๋ช
๋ น ์ค์ ํ์ํ๋ฏ๋ก testexe
๋ ๊ทธ๋ฐ ๋ฐฉ์์ผ๋ก ์ปดํ์ผํด์ผํฉ๋๋ค (์ ํ์ ์ผ๋ก ์์ ๋ช
๋ น ์ค์ ์ธ์ํ๋๋ก ๋ณ๊ฒฝ).
๋ฐฐ์น ํ์ผ์ ๋ํ ์กฐ์ ์ ํ
์คํธํ๋ ค๋ฉด ๋ณ๋์ ํ
์คํธ _batch_ ํ์ผ์ด ํ์ํฉ๋๋ค. 'a&b'
๊ฐ "a&b"
๋๊ณ 'a"b'
๊ฐ "a""b"
๋ก ์ ๋ฌ๋์๋์ง ํ์ธํฉ๋๋ค. ์.
@ mklement0 .NET Framework ์ฉ ์ปดํ์ผ์ ๊ฐ๋ฅํ์ง ์์ผ๋ฉฐ ์ฌ๋ฐ๋ฅธ ๋์์ ์ป์ผ๋ ค๋ฉด .NET Framework์์ ์คํํด์ผ ํ ๊ฒ์ ๋๋ค. PS ๋ฆฌํฌ์งํ ๋ฆฌ์์ ๋ชจ๋ ๋ค์ดํฐ๋ธ ์ฝ๋ ์ปดํ์ผ์ ์๋์ ์ผ๋ก ์ ๊ฑฐํ์ผ๋ฉฐ ๋ค์ ์ถ๊ฐํ๊ณ ์ถ์ง๋ ์์ต๋๋ค ... ํ ๊ฐ์ง ์ต์ ์ ๋ฏธ๋ฆฌ ๋น๋ ๋ ๋ค์ดํฐ๋ธ testexe (Windows, macOS, ๊ทธ๋ฆฌ๊ณ ๋ค์ํ Linux ๋ฐฐํฌํ (์ : Alpine ๋ณ๋). testexe๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ฝ์ต๋๋ค. ๊ฒ์ํ๋ ๋ชจ๋ ์์ ์ ์ํํ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค.
๋๋ Linux / macOS ์ฉ ๊ฐ๋จํ bash ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ args๋ฅผ ๋ด๋ณด๋ผ ์ ์์ต๋๊น?
#!/bin/bash
for i; do
echo $i
done
๊ทธ๋ฆฌ๊ณ Windows์์๋ ๋ฐฐ์น ํ์ผ๊ณผ ๋น์ทํ ๊ฒ์ ๋๋ค.
.js ์คํฌ๋ฆฝํธ์ ํจ๊ป ๋ ธ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น?
console.log(process.execArgv.join('\n')
๋๋ ๋น์ ์ ์ฒ๋ฆฌํ๋ ์ด๋ค ๋ฌธ์์ด
์ถ๋ ฅ๋ฌผ์ ๋ฉ์ง๊ฒ ๋ง๋ค๊ณ ์ถ์ต๋๊น?
@cspotcode , ์์ ๋ช ๋ น ์ค์ ๊ฐ์ ธ ์ค๋ ค๋ฉด WinAPI ํธ์ถ์ด ํ์ํฉ๋๋ค.
@ SteveL-MSFT :
Windows ์์๋ CLI๋ฅผ ํตํด ์ปดํ์ผ์ _Windows PowerShell_์ ์์ ํ ์ ์์ต๋๋ค. ์ด ์์
์ dbea
. ๋ค์์ ์์ ๋ช
๋ น ์ค (์ ์ฉ)์ ๋ฐ์ํ๋ .NET _Framework_ ์คํ ํ์ผ์ ์์ฑํ๋ ๊ฐ๋จํ ์์
๋๋ค. ./rawcmdline.exe
:
powershell.exe -noprofile -args ./rawcmdline.exe -c {
param([string] $exePath)
Add-Type -ErrorAction Stop -OutputType ConsoleApplication -OutputAssembly $exePath -TypeDefinition @'
using System;
static class ConsoleApp {
static void Main(string[] args) {
Console.WriteLine(Environment.CommandLine);
}
}
'@
}
์ํ ํธ์ถ :
PS> ./rawcmdline.exe --% "a&b" PROP="foo bar"
"C:\Users\jdoe\rawcmdline.exe" "a&b" PROP="foo bar"
์ธ์๋ฅผ ๋ฐ์ํ๋ _batch file_์ ๊ฒฝ์ฐ dbea
๋ ์์ฒญ์ ํ๋๋ฅผ ๋ง๋ญ๋๋ค .
Unix ์์๋ ์๊ฒฌ์ ํ์๋ ๊ฒ์ฒ๋ผ ๊ฐ๋จํ ์ ์คํฌ๋ฆฝํธ๋ก ์ถฉ๋ถ ํ๋ฉฐ /bin/sh
์ _argument_๋ก ์ ๋ฌํ๋ ์์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค .
@ PowerShell / powershell-committee๋ ์ค๋ ์ด๊ฒ์ ๋ ผ์ํ์ต๋๋ค. ์ฐ๋ฆฌ๋ @JamesWTruher ์๊ฒ ์์ ์ PR์ ์ ๋ฐ์ดํธํ์ฌ ์ธ์ ๋ฐฐ์ด์ ๋ค์ ๋ฌธ์์ด๋ก ์ฌ๊ตฌ์ฑํ๋ ๋ค์ดํฐ๋ธ ๋ช ๋ น ํ๋ก์ธ์์ ๋จ๊ณ๋ฅผ ๊ฑด๋ ๋ฐ๊ณ ํต๊ณผํ๋ ์คํ ๊ธฐ๋ฅ์ ์ผ๋ถ๋ก ํฌํจํ๋๋ก ์์ฒญํฉ๋๋ค. ProcessStartInfo์ ์ ๋ฐฐ์ด ์ธ์์ ์ถ๊ฐํฉ๋๋ค (๋งค๊ฐ ๋ณ์ ์ด๋ฆ๊ณผ ๊ฐ์ด ์ ์ ํ๊ฒ ์ผ์นํ๋์ง ํ์ธํ๋ ์ฝ๊ฐ์ ์ฝ๋๊ฐ ์์ต๋๋ค). ๋ํ ์ ์ ๋ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ์ฌ์ ํ ์คํจํ๊ณ ๋์ค์ ์ถ๊ฐ ํ ์์๋ ํน์ํ ๊ฒฝ์ฐ ์๋ ค์ง ๋ช ๋ น์ ๋ํ ํ์ฉ ๋ชฉ๋ก์ด ํ์ํ ์ ์์์ ๋ฐ์๋ค์ ๋๋ค.
๋์น ์ฑ์ง ๋ชปํ ๋ถ๋ค์ ์ํด : PR์ด (WIP๋ก) ๊ฒ์๋์์ผ๋ฉฐ ์ด๋ฏธ ๋ ผ์ ์ค์ ๋๋ค : https://github.com/PowerShell/PowerShell/pull/13482
PS, @ SteveL-MSFT, Windows์์ ์์ ๋ช
๋ น ์ค ๊ฐ์ ธ ์ค๊ธฐ์ ๊ด๋ จํ์ฌ : ๋ฌผ๋ก ์ปดํ์ผ์ Windows PowerShell / .NET _Framework_์ ์์ํ๋ ๋์์ ๊ธฐ์กด .NET _Core_ ์ฝ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฐํํ์ฌ (ํ๋ซํผ ์กฐ๊ฑด๋ถ) ์๋์ ์ค๋ช
๋๋๋ก GetCommandLine()
WinAPI ํจ์์ ๋ํ P / Invoke ํธ์ถ.
using System;
using System.Runtime.InteropServices;
namespace demo
{
static class ConsoleApp
{
[DllImport("kernel32.dll")]
private static extern System.IntPtr GetCommandLineW();
static void Main(string[] args)
{
Console.WriteLine("\n{0} argument(s) received (enclosed in <...> for delineation):\n", args.Length);
for (int i = 0; i < args.Length; ++i)
{
Console.WriteLine(" <{0}>", args[i]);
}
// Windows only: print the raw command line.
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
Console.WriteLine("\nCommand line:\n\n {0}\n", Marshal.PtrToStringUni(GetCommandLineW()));
}
}
}
}
@ SteveL-MSFT
์ญ ํธํ์ฑ์ ๊ทธ๊ฐ ๋ค๋ฃจ๊ณ ์๋ ๊ฒ์ ๋๋ค.
ProcessStartInfo.ArgumentList
(Unix์์์๋ ๊ทธ๋๋ก ์ฌ์ฉํ๊ณ .NET Core ์์ฒด์ ์ํด Windows์์ MS C / C ++-์ปจ๋ฒค์
์ค์ ๋ช
๋ น ์ค๋ก ๋ณํ๋๋ _verbatim_ ์ธ์์ _collection_) )๋ฅผ ์ฌ์ฉํด์ผํ์ง๋ง ๋ช
์ ์ ์ผ๋ก ์ค๋ช
ํ๊ฒ ์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ์ ์ ํ๊ฒ ์์ ํ๋ฉด _ ์ด์ ํธํ์ฑ์ ๋ํ ์๋ณด๊ฐ ๋ฐฐ์ ๋ฉ๋๋ค _.
@JamesWTruher ์ PR์์ด ๊ธ์ ์ฐ๋ ์์ ์์ ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ผ๋ก ๊ฐ๊ณ ์์ต๋๋ค. ์ ์ผํ ๋ฌธ์ ๋ ๋น ์ธ์๊ฐ ์ฌ์ ํ ์ ๋ฌ๋์ง ์๋๋ค๋ ๊ฒ ์ ๋๋ค.
์ ์ ๋ ๋ณ๊ฒฝ์ผ๋ก ์ฌ์ ํ ์คํจํ๊ณ ๋์ค์ ์ถ๊ฐ ํ ์์๋ ํน์ํ ๊ฒฝ์ฐ ์๋ ค์ง ๋ช ๋ น์ ๋ํ ํ์ฉ ๋ชฉ๋ก์ด ํ์ํ ์ ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ ๋์ค์๊น์ง ๋ฏธ๋ฃจ์ง ๋ง ๊ฒ์ ์ด๊ตฌํ๋ค .
_allowlist_ (ํน์ ์คํ ํ์ผ์ ๋ํ ํน์ ์ฌ๋ก) ๋์ , @TSlivede ์ ์ข ๋ ๋ ผ์ํ ํ ์์ ๊ท์น ์์ ๊ฐ์ ๋
_Windows์์๋ง ํ์ _ํ๋ ๋ค์ ์กฐ์ :
Windows์์ ๋๋ถ๋ถ์ ํธ์ถ์ด ์ ๋๋ก ์๋ํฉ๋๋ค.
์ ์ ๋ about_Native_Calls
๋์๋ง ํญ๋ชฉ ์์ ์ฝ๊ฒ ๊ฐ๋
ํํ๊ณ ๋ฌธ์ํ ํ ์ ์์ต๋๋ค.
๊ตฌํ์ด ๊ฐ๋จํฉ๋๋ค. ์ฌ๊ธฐ์ ํ ์คํธ์ ํจ๊ป PowerShell๋ก ์์ฑ๋ ๊ฐ๋ ์ฆ๋ช ์ด ์์ต๋๋ค.
๊ตฌ์ฒด์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Unix์ ๋ง์ฐฌ๊ฐ์ง๋ก ProcessStartInfo.ArgumentList
๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ๋จ, ๋ค์ ์กฐ๊ฑด ์ค _ ํ๋ ๋๋ ๋ ๋ค _๊ฐ ์ถฉ์กฑ๋๋ ๊ฒฝ์ฐ _์ด ๊ฒฝ์ฐ ํ๋ก์ธ์ค ๋ช
๋ น ์ค์ ์๋์ผ๋ก ๊ตฌ์ฑํด์ผํฉ๋๋ค _ (๊ทธ๋ฆฌ๊ณ ๋ค์๊ณผ ๊ฐ์ด ProcessStartInfo.Arguments
ํ ๋นํด์ผ ํจ). ํ์ฌ) :
.cmd
, .bat
) ๋๋ cmd.exe
์ง์ ํธ์ถ๋ฉ๋๋ค."
๋ ""
( \"
์๋) ๋ฐ ๋ค์ cmd.exe
๋ฉํ ๋ฌธ์๋ฅผ ํฌํจํ๋ ๊ณต๋ฐฑ์๋ ์ธ์๋ก ์ด์ค์ผ์ดํ๋ฉ๋๋ค. ๋ํ ํฐ ๋ฐ์ดํ๋ก ๋ฌถ์ฌ ์์ต๋๋ค (์ผ๋ฐ์ ์ผ๋ก _ ๊ณต๋ฐฑ์ด์๋ ์ธ์ ๋ง ํฐ ๋ฐ์ดํ๋ก ํ์๋จ) : " & | < > ^ , ;
-์ด๋ ๊ฒํ๋ฉด ๋ฐฐ์น ํ์ผ์ ๋ํ ํธ์ถ์ด ์์ ์ ์ผ๋ก ์๋ํฉ๋๋ค. ์ด๋ ๋ง์ ์ ๋ช
CLI๊ฐ ๋ฐฐ์น ํ์ผ์ _entry๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์
๋๋ค. ํฌ์ธํธ๋ค_.๋
๋ฆฝ์ ์ผ๋ก (๋ฐ ๊ฐ๋ฅํ๋ฉด ์ถ๊ฐ๋ก) ์ ๊ท์๊ณผ ์ผ์นํ๋ ์ธ์๊ฐ ํ๋ ์ด์์๋ ๊ฒฝ์ฐ
'^([/-]\w+[=:]|\w+=)(.*? .*)$'
์ด (๊ฐ) ์กด์ฌํฉ๋๋ค. ์ด๋ฌํ ๋ชจ๋ ์ธ์๋ _value ๋ถ๋ถ์๋ง _partial_ ํฐ ๋ฐ์ดํ๋ฅผ ์ ์ฉํด์ผํฉ๋๋ค _ ( :
๋๋ =
๋ค์ ์ค๋ ๋ด์ฉ)
msiexec.exe
/ msdeploy.exe
๋ฐ cmdkey.exe
-PowerShell์์ ๋ค์๊ณผ ๊ฐ์ ํ์์ผ๋ก ํ์๋๋ ์คํ์ผ ์ธ์FOO=bar baz
๋ฐ /foo:bar baz
/ -foo:bar baz
๋ ํ๋ก์ธ์ค ๋ช
๋ น ์ค์ ๋ค์๊ณผ ๊ฐ์ด ๋ฐฐ์น๋ฉ๋๋ค.foo="bar baz"
๋๋ /foo:"bar baz"
/ -foo:"bar baz"
์ด ์คํ์ผ์ ๊ฒฌ์ ์ด ํ์ํ _any_ CLI๋ฅผ ๋ง์กฑ์ค๋ฝ๊ฒ ๋ง๋ญ๋๋ค.์ธ์์์๋ ๊ทธ๋๋ก \
๋ฌธ์๋ MS C / C ++ ๊ท์น์ ๋ฐ๋ผ ์ฒ๋ฆฌ๋์ด์ผํฉ๋๋ค.
์ด๋ฌํ ํธ์์ ์ํด ๋ณด์ฅ๋์ง _ ์๋ __ :
msiexec.exe
(๊ทธ๋ฆฌ๊ณ ์๋ง๋ msdeploye.exe
๋)๋ _only_ ""
-_embedded_ "
๋ฌธ์์ ์ด์ค์ผ์ดํ๋ฅผ ์ง์ํฉ๋๋ค cmd /c
๋ฅผ ํตํด ํธ์ถํ๋ ๊ฒฝ์ฐ๋ ์์ธ์
๋๋ค.
msiexec.exe /i example.msi PROPERTY="Nat ""King"" Cole"
),ํ์ง๋ง misexec
ํธ์ถ์ ์ผ๋ฐ์ ์ผ๋ก ์ค์น๊ฐ ๋๋ ๋๊น์ง _ ๋๊ธฐํ ๋จ _๋๋ฏ๋ก ๋ค์ ์ค ํ๋์์ ๋ฌธ์ ๋ฅผ ํผํ ์ ์์ต๋๋ค. ๋ ๊ฐ์ง ๋ฐฉ๋ฒ:cmd /c start /wait msiexec /i example.msi PROPERTY='Nat "King' Cole'
- cmd.exe
ํธ์ถ์ ์์กดํ์ฌ ""
-escaping ํธ๋ฆฌ๊ฑฐStart-Process -Wait msiexec '/i example.msi PROPERTY="Nat ""King"" Cole"'
- -ArgumentList
( -Args
) ๋งค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๋จ์ผ ๋ฌธ์์ด ์ธ์๋ฅผ ํ๋ก์ธ์ค ๋ช
๋ น ์ค๋ก ๊ทธ๋๋ก ์ ๋ฌํฉ๋๋ค (์ด ๋งค๊ฐ ๋ณ์๊ฐ ์๋ํ๋ ๋ฐฉ์์ ์๋์ง๋ง- # 5576 ์ฐธ์กฐ).์์ ์กฐ์ ์ผ๋ก ์ถฉ๋ถํ์ง ์์ ๋ค๋ฅธ ๋น ์ ํต์ ์ธ CLI-๊ฐ์ธ์ ์ผ๋ก ์์ง ๋ชปํฉ๋๋ค.
ํ๋ฃจ๊ฐ ๋๋๋ฉด ํญ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. cmd /c
๋ฅผ ํตํด ํธ์ถํ๊ฑฐ๋ ์ฝ์์ด ์๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฒฝ์ฐ Start-Process
๋ฅผ ํตํด ํธ์ถํ๊ฑฐ๋ --%
. ins
( Invoke-NativeShell
) cmdlet์ ์ ๊ณตํ๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ต์
์
๋๋ค. dbea
( Debug-ExecutableArguments
echoArgs.exe
์ ์ ์ฌํ ๊ธฐ๋ฅ์ ๊ฐ์ง Debug-ExecutableArguments
cmdlet์ ํ์์ ๋ฐ๋ผ ๋ฐฐ์น ํ์ผ์ ๋ํด์๋ _diagnose_ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด๋ฉ๋๋ค.
๋ธ๋ ์ดํน ์ฒด์ธ์ง์ ์ตํธ ์ธ์ ๊ฒฝ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด ๊ธฐ๋ฅ์ ์คํ์ ๊ธฐ๋ฅ์ผ๋ก ๊ตฌํํ๋ฉด ์ถฉ๋ถํ ๊ด์ฌ์ด ํ์๋๋ฉด _default_ ๋์์ด๋์ด (์ฌ์ํ) ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ ๊ฒ์ด๋ผ๋ ์๋ฏธ์ ๋๊น?
์ด ์คํ์ ๊ธฐ๋ฅ์ด ๊ทธ ์ค์์ฑ์ ๊ฐ์ํ ๋ ๋๋ฆฌ ๊ณต๊ฐ๋์๋์ง ํ์ธํด ์ฃผ์๊ฒ ์ต๋๊น?
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด๊ฒ์ ๋ํ ํน์ ์ฐ์ฐ์๋ฅผ ๋ง๋๋ ๊ฒ์ ๋ช ๋ น ์ค ์ ธ์ ์ ํ ์๋ฏธ๊ฐ ์์ต๋๋ค. ์ฃผ๋ ์์ ์ ํ๋ก๊ทธ๋จ์ ์์ํ๊ณ ์ธ์๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค. ์ด ์์ ์ ์ํด
system()
๋ฅผ ์ํํ๋ ์ ์ฐ์ฐ์๋ฅผ ๋์ ํ๋ ๊ฒ์ ์ฐ์ ์ ๋ฒ๊ทธ๊ฐ ์๊ธฐ ๋๋ฌธ์calc.exe
๋ฅผ ํธ์ถํ๋ ๋ฐฉ๋ฒ์ ๋์ ํ๋ Matlab๊ณผ ๊ฐ์ต๋๋ค. ๋์ ํด์ผ ํ ์ผ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.Start-Process
์๋ ๋์ผํ๊ฒ ์ ์ฉ๋ฉ๋๋ค. (์ฌ์ค-QuotingBehavior Legacy
...์ ๊ฐ์ ์ผ๋ถ ์ต์ ์ด์๋ "new"cmdlet์ ๋ํ ๊ฝค ์ข์ ํ๋ณด์ ๋๋ค.) # 13089๋ฅผ ์ฐธ์กฐํ์ญ์์ค.