Powershell: ์™ธ๋ถ€ ์‹คํ–‰ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ธ์ˆ˜๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ด์Šค์ผ€์ดํ”„๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2016๋…„ 08์›” 21์ผ  ยท  170์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: PowerShell/PowerShell

์žฌํ˜„ ๋‹จ๊ณ„

  1. ARGV๋ฅผ ํš๋“ํ•˜๋Š” C ํ”„๋กœ๊ทธ๋žจ native.exe ์ž‘์„ฑ
  2. 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
Committee-Reviewed WG-Engine

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด๊ฒƒ์— ๋Œ€ํ•œ ํŠน์ˆ˜ ์—ฐ์‚ฐ์ž๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋ช…๋ น ์ค„ ์…ธ์— ์ „ํ˜€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ฃผ๋œ ์ž‘์—…์€ ํ”„๋กœ๊ทธ๋žจ์„ ์‹œ์ž‘ํ•˜๊ณ  ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ž‘์—…์„ ์œ„ํ•ด system() ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ƒˆ ์—ฐ์‚ฐ์ž๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ์‚ฐ์ˆ ์— ๋ฒ„๊ทธ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— calc.exe ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋„์ž…ํ•˜๋Š” Matlab๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ ํ•ด์•ผ ํ•  ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • pwsh ํŒ€์€ ๊ธฐ๋ณธ ์ œ๊ณต cmdlet ๋’ค์— ํ˜„์žฌ ๋™์ž‘์„ ์ด๋™ํ•˜์—ฌ ๋ช…๋ น ์ค„ ํ•ญ๋ชฉ์„ ์ˆ˜์ •ํ•˜๋Š” ์ƒˆ๋กœ์šด ์ฃผ์š” ๋ฆด๋ฆฌ์Šค๋ฅผ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž„์‹œ ๋ฐฉํŽธ ์†”๋ฃจ์…˜์œผ๋กœ ๊ณง ์ถœ์‹œ ๋  pwsh ๋ฒ„์ „์—๋Š” ๋ช…๋ น ์ค„ ์ „๋‹ฌ์— ๋Œ€ํ•œ ์ƒˆ๋กญ๊ณ  ์˜ฌ๋ฐ”๋ฅธ ๋™์ž‘์„ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ณธ ์ œ๊ณต cmdlet์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

Start-Process ์—๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. (์‚ฌ์‹ค -QuotingBehavior Legacy ...์™€ ๊ฐ™์€ ์ผ๋ถ€ ์˜ต์…˜์ด์žˆ๋Š” "new"cmdlet์— ๋Œ€ํ•œ ๊ฝค ์ข‹์€ ํ›„๋ณด์ž…๋‹ˆ๋‹ค.) # 13089๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

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

"\"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 ์—์„œ ์˜๊ฐ์„

  • ๊ฐ„๋‹จํ•œ ์Šค์œ„์น˜๋ฅผ ์ธ์šฉํ•˜์ง€ ์•Š์Œ
  • ์—ฌ์ „ํžˆ ๋นˆ ์ธ์ˆ˜๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ์ธ์ˆ˜๊ฐ€ ์—†์œผ๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ๋Œ€๋ถ€๋ถ„ msiexec, cmdkey ๋“ฑ๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ์—ฌ์ „ํžˆ ๊ณตํ†ต ๊ทœ์น™ ์„ ๋”ฐ๋ฅด๋Š” ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„ํ‘œ์ค€ "" ๋ฅผ ์ด์Šค์ผ€์ดํ”„ ๋œ " ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ .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 ๊ด€๋ จ :
๋‚˜๋Š” ๊ทธ๋Ÿฌํ•œ ์ปค๋งจ๋“œ ๋ ›์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  ์ด๊ฒƒ์ด ๊ธฐ๋ณธ ๋™์ž‘์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

https://github.com/PowerShell/PowerShell-RFC/issues/90

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_์—์„œ๋Š”์ด ๋™์ž‘์ด ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์—ฌ๊ธฐ์„œ ๋ณด์—ฌ ์ฃผ๋ ค๊ณ ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ์š”์•ฝํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ž‘์€ ๋”ฐ์˜ดํ‘œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ _cmd.exe-style_ ( %var% )์ž…๋‹ˆ๋‹ค.
  • ๊ธ€ ๋กœ๋น™ ๋ฐ ๋‹จ์–ด ๋ถ„ํ• ๊ณผ ๊ฐ™์€ ์ค‘์š”ํ•œ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

--% ๋ฅผ ๋„์ž… ํ•œ ์ฃผ๋œ ๋™๊ธฐ๋Š” ๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•œ๋‹ค๋ฉด _ ๊ธฐ์กด cmd.exe ๋ช…๋ น ์ค„์„ ๊ทธ๋Œ€๋กœ _ ์žฌ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋„๋กํ•˜๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ๋”ฐ๋ผ์„œ --% ๋Š” ํ˜„์žฌ ๋™์ž‘์œผ๋กœ Unix์—์„œ ์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • _ ์œ ๋‹‰์Šค์—์„œ _analogous_ ๊ธฐ๋Šฅ์„ ์›ํ–ˆ๋‹ค๋ฉด ์œ„์—์„œ ์ œ์•ˆํ•œ ๊ฒƒ์ฒ˜๋Ÿผ /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 ์—์„œ ๋ฆฌ๋””๋ ‰์…˜์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ค„ ์—ฐ์† ๋ฌธ์ž๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. PowerShell ( ` ) ๋˜๋Š” 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 ์ž์ฒด์˜ ์ผ๋ถ€๊ฐ€๋˜๋„๋ก ํ˜„๋ช…ํ•˜๊ฒŒ ํ˜ธ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค.
    • @ SteveL-MSFT๋Š” ์˜ค๋ฅ˜ ๋ ˆ์ฝ”๋“œ์— ๊ฒฐ๊ณผ ๋ช…๋ น ์ค„์„ ํฌํ•จํ•˜์—ฌ ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, 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_ ๊ธฐ๋Šฅ์œผ๋กœ ์˜ฌ๋ฐ”๋ฅธ ๋™์ž‘์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

  • ์ด๋Ÿฌํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๊ธฐ๋ณธ ์„ค์ • ๋ณ€์ˆ˜์— ์˜ํ•ด ๋ฐœ์ƒํ•˜์ง€๋งŒ ์ ์  ๋” ์ฆ๊ฐ€ํ•˜๋Š” 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์—์„œ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ง€๊ธˆ๊นŒ์ง€๋Š” ๋ฌธ์ œ์—†์ด ์ค„ ๋ฐ”๊ฟˆ ๋ฐ ๊ธฐํƒ€ ํŠน์ˆ˜ ๋ฌธ์ž๋กœ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

GitHub
GitHub์—์„œ ๊ณ„์ •์„ ๋งŒ๋“ค์–ด choovick / ps-invoke-externalcommand ๊ฐœ๋ฐœ์— ๊ธฐ์—ฌํ•˜์„ธ์š”.
GitHub
GitHub์—์„œ ๊ณ„์ •์„ ๋งŒ๋“ค์–ด 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์—์„œ

  • ... oreach ($ ArgumentList์˜ $ a) {$ proc.StartInfo.ArgumentList.Add ($ a)}
  • ~ ~ ~ ~ ~ ~ ~ ~

    • CategoryInfo : InvalidOperation : (:) [], RuntimeException

    • FullyQualifiedErrorId : InvokeMethodOnNull

      ```

์‚ฌ์šฉ์ž ์ง€์ • ์ธ์ˆ˜ ์ด์Šค์ผ€์ดํ”„ ๋…ผ๋ฆฌ ์ดํ›„ ....

๊ฐ€๋ฒผ์šด ๋Œ€ํ™”

NodeJS์˜`\ ^ "`์— ๊ด€ํ•ด์„œ๋Š” ๋ช‡ ๋…„ ์ „์—ํ•ด์•ผํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. :) ์ œ๋Œ€๋กœ ์ž‘๋™ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

System.Diagnostics.Process๋Š” ์™ธ๋ถ€ ์‹คํ–‰ ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

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

๋‹ค์Œ์€ PowerShell์ด โ€‹โ€‹ํ˜ธ์ถœ์„ ์ˆ˜ํ–‰ํ•˜๋„๋กํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ํ•„์š”ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์š”์•ฝ์ž…๋‹ˆ๋‹ค (ํ™•์‹คํžˆ ๋ฐ”๋žŒ์ง ํ•จ) .

  • _embedded_ " ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ, ๊ฐ€๋Šฅํ•˜๋ฉด Windows์—์„œ _double_ ๋˜๋Š” \ ์ด์Šค์ผ€์ดํ”„ :

    • Windows์—์„œ _batch files_๋ฅผ ํ˜ธ์ถœ ํ•  ๋•Œ ๋Œ€์ƒ ํ”„๋กœ๊ทธ๋žจ์ด "" ๋ฅผ ์ด์Šค์ผ€์ดํ”„ ๋œ " ์ธ์‹ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ ์žˆ๋Š” ๊ฒฝ์šฐ $arg -replace '"', '""'

      • Windows์—์„œ๋Š” "" ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์ง€๋งŒ (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 ๋Œ€ํ•œ ์ž๋™ ํŠน์ˆ˜ ์ผ€์ด์Šค๋ฅผ ํฌํ•จํ•˜์—ฌ ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋ชจ๋“  ์ด์Šค์ผ€์ดํ”„๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋Œ€์ƒ ํ”„๋กœ๊ทธ๋žจ์— ๋”ฐ๋ผ \" ๋ณด๋‹ค "" ์ด์Šค์ผ€์ดํ”„๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

    • ์•„์ด๋””์–ด๋Š” _PowerShell_์˜ ๋ฌธ์ž์—ด ๊ตฌ๋ฌธ์—๋งŒ ์ง‘์ค‘ํ•˜์—ฌ ๋ชจ๋“  ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, PowerShell์ด โ€‹โ€‹๋ณด๋Š” ์ถ•์–ด ๊ฐ’๋„ ๋Œ€์ƒ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํ•„์š”ํ•œ ์ด์Šค์ผ€์ดํ”„๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜์— ์˜์กด ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    • PowerShell _Core_์—์„œ ์ด๊ฒƒ์€ ๋งค์šฐ ๊ฐ•๋ ฅํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. Windows PowerShell์—๋Š” \" ์ด์Šค์ผ€์ดํ”„๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ ์ค‘๋‹จ๋˜๋Š” ํฐ ๋”ฐ์˜ดํ‘œ๊ฐ€ ํฌํ•จ ๋œ ์˜ˆ์™ธ์  ์ธ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค (์œ„์—์„œ ์„ค๋ช…ํ•œ๋Œ€๋กœ).

  • ์‰˜ ๋ช…๋ น ํ˜ธ์ถœ ๊ตฌ๋ฌธ์„ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค.

    • ๋ช…๋ น ์ค„ ์•ž์— iepย  ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ๋งŒํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค.

  • ์ง์ ‘ ํ˜ธ์ถœ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    • PowerShell์˜ ์ŠคํŠธ๋ฆผ๊ณผ ํ†ตํ•ฉ

    • ํŒŒ์ดํ”„ ๋ผ์ธ์„ ํ†ตํ•ด ํ•œ ์ค„์”ฉ ์ถœ๋ ฅ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

    • ์™ธ๋ถ€ ํ”„๋กœ๊ทธ๋žจ์˜ ์ข…๋ฃŒ ์ฝ”๋“œ์— ๋”ฐ๋ผ $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 ์ฐธ์กฐ ์ž์„ธํ•œ ๋‚ด์šฉ์€.

Function 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 ์Šคํƒ€์ผ ์ฐธ์กฐ๋ฅผ ํ™•์žฅํ•˜๊ณ  '...' ์ธ์‹ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
    • _does_๊ฐ€ ๊ฐ๊ฐ์˜ ํ”Œ๋žซํผ ๋„ค์ดํ‹ฐ๋ธŒ ์…ธ์„ ํฌํ•จํ•˜๋Š” ๋Œ€์•ˆ์€ ์•„๋ž˜๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
  • PowerShell์—๋Š” ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ธ์šฉ / ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ _additional_ ๋ฉ”ํƒ€ ๋ฌธ์ž๊ฐ€ ์žˆ์Œ์„ ์•Œ๊ณ  ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค ( @ ๋Š” ์ธ์ˆ˜์˜ _first_ char๋กœ๋งŒ ๋ฌธ์ œ๊ฐ€๋ฉ๋‹ˆ๋‹ค.) :

    • POSIX ์œ ์‚ฌ ์…ธ (์˜ˆ : Bash) : @ { } ` (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"")'

Bash ๊ตฌ๋ฌธ :

โฏ node -e 'console.log("hey")'
hey

Powershell ์ œ์•ˆ :

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

GitHub
GitHub์—์„œ ๊ณ„์ •์„ ๋งŒ๋“ค์–ด 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์˜ ์ž‘์—…์ž…๋‹ˆ๋‹ค.

  • Unix์™€ ์œ ์‚ฌํ•œ ํ”Œ๋žซํผ์—์„œ ์ด์ œ .NET Core ์ง€์›์ด ์ œ๊ณต๋˜๋ฏ€๋กœ ํ”„๋กœ๊ทธ๋žจ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ธ์ˆ˜๋ฅผ๋ฐ›๋Š” ๋ฐฉ๋ฒ• ์ธ _array_ ์ธ์ˆ˜์˜ ์š”์†Œ๋กœ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌ ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ์ด ์ž‘์—…์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. .
  • Windows์—์„œ ์™ธ๋ถ€ ํ”„๋กœ๊ทธ๋žจ์€ ์ธ์ˆ˜๋ฅผ _single ๋ช…๋ น ์ค„ ๋ฌธ์ž์—ด _ (์œ ๊ฐ์Šค๋Ÿฌ์šด ์—ญ์‚ฌ์  ๋””์ž์ธ ๊ฒฐ์ •)๋กœ ์ˆ˜์‹ ํ•˜๊ณ  ์ž์ฒด ๋ช…๋ น ์ค„ ๊ตฌ๋ฌธ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ๋ฌธ์ž์—ด์˜ ์ผ๋ถ€๋กœ ์—ฌ๋Ÿฌ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋ ค๋ฉด ์ธ์ˆ˜๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์ธ์šฉ ๋ฐ ๊ตฌ๋ฌธ ๋ถ„์„ ๊ทœ์น™์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ถ๊ทน์ ์œผ๋กœ ์ž์œ ๋กญ์ง€ ๋งŒ (ํ”„๋กœ๊ทธ๋žจ์€ ์ž์œ ๋กญ๊ฒŒ ๊ตฌ๋ฌธ ๋ถ„์„ ํ•  ์ˆ˜ ์žˆ์Œ), ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๊ตฌ๋ฌธ ๊ทœ์น™ (์ด์ „์— ์–ธ๊ธ‰๋˜์—ˆ์œผ๋ฉฐ ํ˜„์žฌ๋Š” ํฌ๊ธฐํ•œ RFC ์—์„œ๋„ ์ œ์•ˆ Microsoft์˜ C / C ++ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค . ๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.

    • _Update_ : Windows์—์„œ๋„ .NET Core์—์„œ 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 ๋ชจ๋“ˆ์„ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ ๋‹ค๊ฐ€์˜ค๋Š” ์…ธ ๊ฐœ์„ ์„ ๊ธฐ๋‹ค๋ ค์•ผํ•ฉ๋‹ˆ๋‹ค.

GitHub
GitHub์—์„œ ๊ณ„์ •์„ ๋งŒ๋“ค์–ด choovick / ps-invoke-externalcommand ๊ฐœ๋ฐœ์— ๊ธฐ์—ฌํ•˜์„ธ์š”.

@ mklement0 ์ด ์Šค๋ ˆ๋“œ๋Š” ๋๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค (: ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ ํ•ฉํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ์— ์ถฉ๋ถ„ํžˆ ๊ฐ„๋‹จ ํ•  ps ๊ฐค๋Ÿฌ๋ฆฌ์— ๊ฒŒ์‹œ ๋œ PowerShell ๋ชจ๋“ˆ์„ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ ๋‹ค๊ฐ€์˜ค๋Š” ์…ธ ๊ฐœ์„ ์„ ๊ธฐ๋‹ค๋ ค์•ผํ•ฉ๋‹ˆ๋‹ค.

PowerShell ํŒ€์ด ํ”„๋กœ๊ทธ๋žจ ์ž์ฒด์—์„œ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๋ฉด ์™ธ๋ถ€ ํ”„๋กœ๊ทธ๋žจ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜์—†๋Š” ์…ธ์ด ๋‚ด๊ฐ€ ์„ ํƒํ•œ ์…ธ์ด ์•„๋‹ˆ๋ผ๊ณ  ๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค! ์ด๋“ค์€ PowerShell์—์„œ ๋ˆ„๋ฝ ๋œ ๊ธฐ๋ณธ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค.

@aminya ์˜ˆ , ๋‚˜๋Š” ๋ฌธ์ œ๋กœ ์ด๋™ํ•ด์•ผ ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋งค์šฐ ์งœ์ฆ๋‚˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์€ ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์œ ์—ฐํ•œ ๋งค๊ฐœ ๋ณ€์ˆ˜ ํ”„๋ ˆ์ž„ ์›Œํฌ, ์•ˆ์ •์ ์ธ CMDlet์„ ์‰ฝ๊ฒŒ ๊ตฌ์ถ• ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ชจ๋“ˆ ๋ฐ ๋‚ด๋ถ€ ๋ชจ๋“ˆ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋Š” ์กฐ์ง ์ „์ฒด์—์„œ ๊ณตํ†ต ๋กœ์ง์„ ๊ณต์œ ํ•˜์—ฌ ๋งŽ์€ ์ฝ”๋“œ ์ค‘๋ณต์„ ๋ฐฉ์ง€ํ•˜๊ณ  ํ•œ ๊ณณ์—์„œ ๋ฆฌํŒฉํ† ๋ง ํ•  ์ˆ˜์žˆ๋Š” ํ•ต์‹ฌ ๊ธฐ๋Šฅ์˜ ์ค‘์•™ ์ง‘์ค‘ํ™”๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ํฌ๋กœ์Šค ํ”Œ๋žซํผ. PS 5.1์˜ Windows์™€ PS 6/7์˜ linux / mac์—์„œ ๋‚ด ๋„๊ตฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” 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๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ ํ•ด์•ผ ํ•  ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • pwsh ํŒ€์€ ๊ธฐ๋ณธ ์ œ๊ณต cmdlet ๋’ค์— ํ˜„์žฌ ๋™์ž‘์„ ์ด๋™ํ•˜์—ฌ ๋ช…๋ น ์ค„ ํ•ญ๋ชฉ์„ ์ˆ˜์ •ํ•˜๋Š” ์ƒˆ๋กœ์šด ์ฃผ์š” ๋ฆด๋ฆฌ์Šค๋ฅผ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž„์‹œ ๋ฐฉํŽธ ์†”๋ฃจ์…˜์œผ๋กœ ๊ณง ์ถœ์‹œ ๋  pwsh ๋ฒ„์ „์—๋Š” ๋ช…๋ น ์ค„ ์ „๋‹ฌ์— ๋Œ€ํ•œ ์ƒˆ๋กญ๊ณ  ์˜ฌ๋ฐ”๋ฅธ ๋™์ž‘์„ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ณธ ์ œ๊ณต cmdlet์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

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์˜ ์‚ฌ์†Œํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ํ•˜๋‚˜๋งŒ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Windows PowerShell์€ ํ›„ํ–‰ \ ๊ฒฝ์šฐ ๋ธ”๋ผ์ธ๋“œ ํฐ ๋”ฐ์˜ดํ‘œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. '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_ ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ๊ทœ์น™์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

    • _ ๋ช…๋ น ์ด๋ฆ„ ๋˜๋Š” ๊ฒฝ๋กœ๊ฐ€ _quoted_- '/foo bar/someutil '-๋ฐ / ๋˜๋Š” _variable ์ฐธ์กฐ (๋˜๋Š” ํ‘œํ˜„์‹)๊ฐ€ ํฌํ•จ ๋œ ๊ฒฝ์šฐ- $HOME/someutil - & ๊ฐ€ _required_ ์ธ ๊ฒฝ์šฐ์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ์š”๊ตฌ๊ฐ€ ๋ถˆํ–‰ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ PowerShell ์–ธ์–ด์˜ ํ•ต์‹ฌ์ด๋ฉฐ ๋‘ ๊ฐ€์ง€ ๊ธฐ๋ณธ ๊ตฌ๋ฌธ ๋ถ„์„ ๋ชจ๋“œ ์ธ ์ธ์ˆ˜ ๋ชจ๋“œ์™€ ํ‘œํ˜„์‹ ๋ชจ๋“œ๋ฅผ ๊ตฌ๋ฌธ ์ ์œผ๋กœ ๊ตฌ๋ณ„ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

    • ์ด ๋ฌธ์ œ๋Š” _external ํ”„๋กœ๊ทธ๋žจ _ ํ˜ธ์ถœ์—๋งŒ ๊ตญํ•œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์ธ ๋ฌธ์ž์—ด / ๋ณ€์ˆ˜ ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ์ง€์ •๋œ ๊ฒฝ์šฐ ๊ธฐ๋ณธ 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 ๋Ÿฐํƒ€์ž„). ๋”ฐ๋ผ์„œ ํ˜„๋ช…ํ•œ ํ•ด๊ฒฐ์ฑ…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

      • ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋ช…๋ น ์ค„์„ ๋นŒ๋“œ ํ•  ๋•Œ PowerShell์ด์ด ๊ทœ์น™์„ ์ค€์ˆ˜ํ•˜๋„๋กํ•ฉ๋‹ˆ๋‹ค.
      • 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"'
    • _expandable_ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ช…๋ น ๋ฌธ์ž์—ด์— PowerShell ๊ฐ’์„ ํฌํ•จ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

      • $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 ์ง์ ‘ ์ „ํ™”ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

    • _PowerShell's_ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์™ธ๋ถ€ ์‹คํ–‰ ํŒŒ์ผ์„ ์ง์ ‘ (์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋ฉด) ๋˜๋Š” 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 ๋ฐฐํ›„์—์„œ ์‚ฌ์šฉํ•˜์—ฌ _ ๋Œ€๋ถ€๋ถ„ _ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

    • ์—ฃ์ง€ ์ผ€์ด์Šค ( "๋ถˆ๋Ÿ‰"CLI)์˜ ๊ฒฝ์šฐ ( ์ž˜๋ชป ๊ตฌํ˜„ ๋จ ) --%
    • _ ์˜ˆ์˜๋กœ, ์šฐ๋ฆฌ๋Š” --% ์˜ ํ•„์š”์„ฑ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ž˜ ์•Œ๋ ค์ง„ ํŠน์ • ์ผ€์ด์Šค๋ฅผ ๋ณด์ƒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋”ฐ๋ผ์„œ _ ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ _ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  • ์ธ์ˆ˜ ์ „๋‹ฌ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋„๋กํ•˜๋Š” ๊ฒƒ์˜ ์ค‘์š”์„ฑ์„ ์ธ์‹ํ•˜๊ณ  _ ์—ญ ํ˜ธํ™˜์„ฑ์„ ํฌ์ƒํ•˜์—ฌ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค _.

  • ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์ด ์ •๋ง ์ค‘์š”ํ•˜๋‹ค๋ฉด 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์—์„œ ํ˜ธ์ถœ์ด ์ธ์šฉ๋˜๋Š” ๋ฐฉ์‹์„ ๋”ฐ๋ผ์•ผํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ:

  1. ํ…์ŠคํŠธ์— ํฐ ๋”ฐ์˜ดํ‘œ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ํ˜ธ์ถœ์€ ์ „์ฒด ๊ฐ’์„ ํฐ ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  2. ํฐ ๋”ฐ์˜ดํ‘œ๊ฐ€ ํฌํ•จ ๋œ ํ˜ธ์ถœ์€ _if possible_ ์Šคํฌ๋ฆฝํŠธ์— ์“ฐ์—ฌ์ง„๋Œ€๋กœ ์œ ์ง€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ:
| ์Šคํฌ๋ฆฝํŠธ ์ธ์ˆ˜ | ๋ช…๋ น ์ค„ |
| ----------------- | ---------------- |
| 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_, _ ์ค‘๋‹จ ์ ์œผ๋กœ _ ์˜ฌ๋ฐ”๋ฅธ ๋™์ž‘์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๊นจ์ ธ์„œ ๊ณ ์น  ์ˆ˜์—†๋Š” ๋ ˆ๊ฑฐ์‹œ ๋ฒ„๊ทธ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด :

  • ์ž„์‹œ ๊ฒฉ์ฐจ๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋™์ž‘์— ๋Œ€ํ•œ _ ๊ณต์‹์ ์œผ๋กœ ์Šน์ธ ๋œ _ ์•ก์„ธ์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค (_experimental_ ๊ธฐ๋Šฅ์— ์˜์กดํ•˜์ง€ ์•Š์Œ).
  • ์ž„์‹œ ๋ฐฉํŽธ์ด ํ•„์š”ํ•œ ํ•œ ๋„๋ฆฌ ๊ณต๊ฐœ๋˜๊ณ  ์ ์ ˆํ•˜๊ฒŒ ๋ฌธ์„œํ™”๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๋™์ž‘์ด ์ˆ˜์ •๋˜๋Š” ๊ฒฝ์šฐ :

  • ํ•จ์ˆ˜๋Š” ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๊นจ์ง€ ์•Š๋„๋ก ๊ทธ๋ƒฅ ์—ฐ๊ธฐํ•˜๋„๋ก ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋” ์ด์ƒ ํ•จ์ˆ˜์—†์ด ์ƒˆ๋กœ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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>
    • ๊ทธ๋Ÿฌํ•œ ์ธ์ˆ˜๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ :

      • ํฌํ•จ ๋œ ํฐ ๋”ฐ์˜ดํ‘œ (์žˆ๋Š” ๊ฒฝ์šฐ)๋Š” ๋ชจ๋“  ์ธ์ˆ˜์—์„œ "" ( \" ์•„๋‹Œ)๋กœ ์ด์Šค์ผ€์ดํ”„๋ฉ๋‹ˆ๋‹ค. -https://github.com/PowerShell/PowerShell/pull/13482#issuecomment -677813167์—์„œ์ด ์ž‘์—…์„ _ํ•˜์ง€ ๋ง์•„์•ผํ•˜๋Š” ์ด์œ ๋ฅผ ํ™•์ธ ํ•˜์‹ญ์‹œ์˜ค . ์ด๊ฒƒ์€ <value with spaces> ์— _embedded_ " ๋ฌธ์ž๊ฐ€์žˆ๋Š” ๋“œ๋ฌธ ๊ฒฝ์šฐ์— --% ์‚ฌ์šฉํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ :
        msiexec ... --% PROP="Nat ""King"" Cole"
      • <value with spaces> ๋ถ€๋ถ„ ๋งŒ ํฐ ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์—ฌ ์žˆ์œผ๋ฉฐ ์ธ์ˆ˜ ์ „์ฒด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค (ํ›„์ž๋Š” PowerShell-์ •๋‹นํ•˜๊ฒŒ-๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค). ์˜ˆ๋กœ์„œ PowerShell์„ ๋ณผ ์ถ• ์–ด์  ์ธ์ˆ˜ foo=bar none ๋กœ ๋ฐฐ์น˜ foo="bar none" (๋ณด๋‹ค ์˜คํžˆ๋ ค ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค์˜ ์ปค๋งจ๋“œ ๋ผ์ธ์— "foo=bar none" ).
    • ๋…ธํŠธ :

      • ๋Œ€์ƒ ์‹คํ–‰ ํŒŒ์ผ์ด _not_ ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ๋กœ 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๋„ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.) https://github.com/PowerShell/PowerShell/pull/13482#issuecomment -677813167์€ 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_ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ณต๋ฐฑ ๋ฌธ์ž๊ฐ€ ์•ž์— ์žˆ์ง€ ์•Š์€ ์ดˆ๊ธฐ " ๋ฌธ์ž๊ฐ€ ์•„๋‹Œ ์ธ์ˆ˜์— ๋Œ€ํ•ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.


Windows 10์—์„œ PowerShell Core 7.1.0-preview.5์˜ ์ถœ๋ ฅ์„ ์‚ฌ์šฉํ•œ ์˜ˆ :

์ฐธ๊ณ  : 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์€์ด ๊ธ€์„ ์“ฐ๋Š” ์‹œ์ ์—์„œ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ์ผํ•œ ๋ฌธ์ œ๋Š” ๋นˆ ์ธ์ˆ˜๊ฐ€ ์—ฌ์ „ํžˆ ์ „๋‹ฌ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

    • ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋ฉด _Unix_์—์„œ ์ˆ˜์ •์ด ์™„๋ฃŒ๋˜์ง€๋งŒ _Windows_์˜ CLI์— ๋Œ€ํ•œ ์ค‘์š”ํ•œ ์กฐ์ •์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค (์•„๋ž˜ ์ฐธ์กฐ).

์ œ์•ˆ ๋œ ๋ณ€๊ฒฝ์œผ๋กœ ์—ฌ์ „ํžˆ ์‹คํŒจํ•˜๊ณ  ๋‚˜์ค‘์— ์ถ”๊ฐ€ ํ•  ์ˆ˜์žˆ๋Š” ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ ์•Œ๋ ค์ง„ ๋ช…๋ น์— ๋Œ€ํ•œ ํ—ˆ์šฉ ๋ชฉ๋ก์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ๋‚˜์ค‘์—๊นŒ์ง€ ๋ฏธ๋ฃจ์ง€ ๋ง ๊ฒƒ์„ ์ด‰๊ตฌํ•œ๋‹ค .

_allowlist_ (ํŠน์ • ์‹คํ–‰ ํŒŒ์ผ์— ๋Œ€ํ•œ ํŠน์ˆ˜ ์‚ฌ๋ก€) ๋Œ€์‹ , @TSlivede ์™€ ์ข€ ๋” ๋…ผ์˜ํ•œ ํ›„ ์œ„์˜ ๊ทœ์น™ ์—์„œ ๊ฐœ์„  ๋œ

_Windows์—์„œ๋งŒ ํ•„์š” _ํ•˜๋Š” ๋‹ค์Œ ์กฐ์ • :

๊ตฌ์ฒด์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Unix์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ProcessStartInfo.ArgumentList ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‹จ, ๋‹ค์Œ ์กฐ๊ฑด ์ค‘ _ ํ•˜๋‚˜ ๋˜๋Š” ๋‘˜ ๋‹ค _๊ฐ€ ์ถฉ์กฑ๋˜๋Š” ๊ฒฝ์šฐ _์ด ๊ฒฝ์šฐ ํ”„๋กœ์„ธ์Šค ๋ช…๋ น ์ค„์„ ์ˆ˜๋™์œผ๋กœ ๊ตฌ์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค _ (๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ProcessStartInfo.Arguments ํ• ๋‹นํ•ด์•ผ ํ•จ). ํ˜„์žฌ) :

    • ๋ฐฐ์น˜ ํŒŒ์ผ ( .cmd , .bat ) ๋˜๋Š” cmd.exe ์ง์ ‘ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
    • ์ด ๊ฒฝ์šฐ _embedded_ " ๋Š” "" ( \" ์•„๋‹Œ) ๋ฐ ๋‹ค์Œ 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_ ๋™์ž‘์ด๋˜์–ด (์‚ฌ์†Œํ•œ) ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋  ๊ฒƒ์ด๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๊นŒ?

  • ์ด ์‹คํ—˜์  ๊ธฐ๋Šฅ์ด ๊ทธ ์ค‘์š”์„ฑ์„ ๊ฐ์•ˆํ•  ๋•Œ ๋„๋ฆฌ ๊ณต๊ฐœ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

    • ์‹คํ—˜์  ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ์šฐ๋ ค๋Š” _all_ ์‹คํ—˜์  ๊ธฐ๋Šฅ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ผœ์ ธ ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ฒ„์ „์—์„œ ์ข…์ข… _ ๋ฌด์˜์‹์  _ ์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์‚ฌ๋žŒ๋“ค์ด์ด ๊ธฐ๋Šฅ์„ ์˜๋„์ ์œผ๋กœ ์•Œ๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.
์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰