개발/Visual Studio Code

커맨드 팔레트 15부: VS Code Task Shell을 Windows PowerShell로 고정하기

반응형
VS CODE 초보자 시리즈 · 커맨드 팔레트 15부

Task가 사용할 Shell을 명시해 인용 오류 줄이기

options.shell.executable과 options.shell.args로 이 Task의 자동화 Shell을 Windows PowerShell로 고정하고, 기본 Terminal Profile과 관계없이 공백이 든 값을 그대로 출력하는지 확인합니다.

shell pin check Task Terminal에 VALUE=alpha beta, SHELL_PROCESS=powershell, PS_EDITION=Desktop 세 줄이 표시되고 종료 코드 0으로 끝나면 완료입니다.

통합 Terminal의 기본 Profile과 Task 자동화에 쓰이는 Shell은 같을 수도 있지만 항상 같아야 하는 것은 아닙니다. Task별 options.shell을 명시하면 명령을 해석할 Shell과 command-mode 인수를 예제 안에 고정할 수 있습니다.

1. 시작하기 전에

난이도는 초급입니다. 비어 있는 연습 폴더에서 .vscode/tasks.json을 만들고 Command Palette로 한 번 실행합니다. 확장 설치, 관리자 권한, 네트워크 전송은 필요하지 않습니다.

준비할 것

  • Windows 11과 VS Code Stable 1.133.0 — 확인: 도움말 > 정보에서 버전을 확인합니다.
  • Windows PowerShell 실행 파일 — 확인: 통합 Terminal에서 Get-Command powershell.exe를 실행해 실제 경로가 표시되는지 봅니다.
  • 비어 있는 연습 폴더 — 확인: 기존 소스와 .vscode/tasks.json이 없는 새 폴더인지 탐색기에서 확인합니다.

적용 환경 한국어 초보자 · Windows 11 · VS Code Stable 1.133.0 · Windows PowerShell · 단일 Workspace Folder

안전하게 시작하기 아래 절차는 Workspace에 .vscode/tasks.json을 새로 만들어 Task 목록을 바꿉니다. 영향: 이 폴더에서 실행 가능한 Task가 하나 추가됩니다. 보호 대상: 기존 Task, 사용자 Terminal 설정, 팀의 빌드·배포 명령. 백업: 기존 파일이 보이면 덮어쓰지 말고 Workspace 밖에 복사본을 만든 뒤 실습용 새 폴더로 이동합니다. Human Gate: 예제가 세 줄의 표식만 출력하고 삭제·설치·권한 변경·외부 전송을 하지 않는지 저장 전에 확인합니다. 중단 조건: 기존 tasks.json이 있거나 Workspace가 Restricted Mode이거나 powershell.exe 경로를 확인할 수 없는 경우.

2. 알아둘 핵심 개념

type: shell

shell Task는 command 문자열을 Shell이 해석해 실행합니다. 따라서 공백, 따옴표, 변수 기호처럼 Shell마다 의미가 다른 문자가 있으면 어떤 Shell을 쓰는지가 결과에 영향을 줍니다. 실행 파일을 Shell 해석 없이 직접 시작하는 process Task와 구분합니다.

options.shell.executable

options는 Object이며 Task 범위에서 실행 기본값을 덮어쓸 수 있습니다. 그 안의 shell도 Object이고, executable은 사용할 Shell을 적는 필수 String입니다. 이 예제는 Windows에서 확인된 powershell.exe를 사용합니다.

options.shell.args

args는 Shell 실행 파일이 command mode로 동작하도록 전달하는 선택적 String Array입니다. 이 글의 ["-NoLogo", "-NoProfile", "-Command"]는 Windows PowerShell의 로고와 Profile 로딩을 생략하고 뒤의 Task 명령을 실행하도록 합니다. 다른 Shell의 인수를 그대로 복사하면 안 됩니다.

기본 Terminal Profile과 자동화 Shell

terminal.integrated.defaultProfile.windows는 새 일반 Terminal의 기본 Profile 이름을 정하는 String 설정입니다. Tasks와 Debug의 공통 자동화 Profile은 terminal.integrated.automationProfile.windows Object로 따로 설정할 수 있고, 특정 Task는 options.shell로 다시 override할 수 있습니다. 이번 실습은 사용자 설정을 바꾸지 않고 Task 하나만 고정합니다.

범위 판단 공식 문서가 보장하는 것은 Task별 options.shell override와 Shell 설정 구조입니다. 표시 언어별 Command Palette 문구와 Task Terminal의 장식 문장은 달라질 수 있어 고정하지 않습니다.

3. 순서대로 진행하기

각 단계의 정상 결과를 확인한 뒤 다음 단계로 이동합니다.

1. Stable 버전과 Windows PowerShell 확인하기

목적 첫 변경 전에 이 가이드의 적용 범위와 Shell 실행 파일을 확인합니다.

  1. VS Code에서 Terminal > New Terminal을 열고 아래 명령을 한 줄씩 실행합니다.

입력 위치 현재 Integrated Terminal

code --version
Get-Command powershell.exe | Select-Object -ExpandProperty Source
정상 결과 첫 명령의 첫 줄에 1.133.0이 보이고, 두 번째 명령이 존재하는 powershell.exe 경로를 반환합니다.

확인 두 출력 원문을 보존하고 VS Code Stable과 Windows PowerShell을 모두 확인합니다.

실패 신호 버전이 다르거나 code 또는 powershell.exe를 찾지 못합니다.

주의 확인되지 않은 실행 파일 경로를 추측해 입력하지 않습니다. 되돌리기: 아직 파일을 바꾸지 않았으므로 변경 사항은 없습니다. 경로가 확인되지 않으면 실습을 중단합니다.

2. 현재 기본 Terminal Profile 이름만 확인하기

목적 일반 Terminal Profile과 Task별 Shell이 서로 다른 설정 층이라는 비교 기준을 만듭니다.

  1. Ctrl+Shift+P를 누르고 Terminal: Select Default Profile을 연 뒤 체크 표시가 있는 Profile 이름을 기록하고 Esc로 닫습니다.

입력 위치 Command Palette의 Terminal Profile 선택 목록

기록 예시: 현재 기본 Terminal Profile = <PROFILE_NAME>
정상 결과 현재 기본 Profile 이름을 하나 기록했고 아무 Profile도 새로 선택하지 않았습니다. <PROFILE_NAME>은 화면에 보인 실제 이름으로 바꿉니다.

확인 선택 목록을 닫은 뒤 새 Terminal이 열리거나 사용자 설정이 변경되지 않았는지 확인합니다.

실패 신호 실수로 다른 Profile을 선택했거나 기본 Profile을 확인할 수 없습니다.

주의 이 단계는 읽기 전용 비교입니다. 되돌리기: 실수로 바꿨다면 같은 명령을 다시 열어 원래 기록한 Profile을 선택합니다. 원래 값을 기록하지 못했다면 임의 복구하지 말고 사용자 설정 변경 상태를 보존한 채 중단합니다.

3. 빈 연습 Workspace 열기

목적 기존 프로젝트 Task와 분리된 안전한 실습 공간을 준비합니다.

  1. Windows 파일 탐색기에서 C:\Users\<USER>\Documents\vscode-task-shell-lab 폴더를 만든 뒤 VS Code의 파일 > 폴더 열기로 엽니다. <USER>는 자신의 Windows 사용자 폴더 이름으로 바꿉니다.

입력 위치 Windows 파일 탐색기와 VS Code의 파일 > 폴더 열기

C:\Users\<USER>\Documents\vscode-task-shell-lab
정상 결과 탐색기 루트에 vscode-task-shell-lab만 보이고 내부는 비어 있습니다.

확인 창 제목과 탐색기 루트가 연습 폴더와 같은지, Restricted Mode 표시가 없는지 확인합니다.

실패 신호 기존 파일이나 .vscode 폴더가 보이거나 Workspace Trust 판단이 끝나지 않았습니다.

주의 기존 폴더를 비우거나 파일을 삭제하지 않습니다. 되돌리기: 창을 닫고 다른 이름의 새 빈 폴더를 만든 뒤 STEP-03부터 다시 시작합니다.

4. Windows PowerShell을 고정한 shell Task 만들기

목적 Task의 명령 해석기와 command-mode 인수를 파일에 명시합니다.

  1. 탐색기에서 .vscode 폴더와 그 안의 tasks.json을 만든 뒤 아래 JSON 전체를 저장합니다.

입력 위치 연습 Workspace의 .vscode/tasks.json

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "shell pin check",
      "type": "shell",
      "command": "Write-Output 'VALUE=alpha beta'; Write-Output ('SHELL_PROCESS=' + (Get-Process -Id $PID).ProcessName); Write-Output ('PS_EDITION=' + $PSVersionTable.PSEdition)",
      "options": {
        "shell": {
          "executable": "powershell.exe",
          "args": [
            "-NoLogo",
            "-NoProfile",
            "-Command"
          ]
        }
      },
      "presentation": {
        "reveal": "always",
        "panel": "new",
        "clear": true
      },
      "problemMatcher": []
    }
  ]
}
정상 결과 편집기에 JSON 오류가 없고 type은 String shell, options.shell.executable은 String powershell.exe, options.shell.args는 세 String을 가진 Array입니다.

확인 Ctrl+S로 저장하고 문제 패널에 JSON 오류가 없는지 확인합니다.

실패 신호 Property expected, 중괄호·쉼표 오류, shell 또는 args 자료형 경고가 표시됩니다.

주의 기존 tasks.json에 전체 예제를 붙여 덮어쓰지 않습니다. Human Gate: 새 연습 파일이고 명령이 세 줄을 출력하기만 하는지 확인합니다. 되돌리기: 오류가 있으면 실행하지 말고 위 전체 예제로 복구합니다. 실습 취소 시 실행 중인 Task가 없는지 확인한 뒤 연습 폴더를 휴지통으로 이동합니다.

5. Shell 설정의 자료형과 범위 확인하기

목적 실행 전에 Shell override가 Task 하나에만 적용되는지 구조를 읽어 확인합니다.

  1. tasks.json에서 options가 shell pin check Task Object 안에 있고, shell이 options 안에 있는지 들여쓰기와 중괄호를 따라 확인합니다.

입력 위치 .vscode/tasks.json 편집기

Task Object
└─ options: Object
   └─ shell: Object
      ├─ executable: String
      └─ args: Array<String>
정상 결과 options.shell은 전역 사용자 설정이 아니라 이 Task Object의 실행 옵션이며, executable과 args의 자료형을 설명할 수 있습니다.

확인 STEP-02에서 기록한 기본 Terminal Profile 이름을 바꾸지 않았고 terminal.integrated.* 설정을 파일에 추가하지 않았는지 확인합니다.

실패 신호 options가 Task 밖에 있거나 args가 하나의 String이거나 사용자 settings.json까지 수정했습니다.

주의 범위를 넓히기 위해 사용자 설정을 추가하지 않습니다. 되돌리기: 사용자 설정을 건드렸다면 원래 값을 알고 있을 때만 복구하고, 알 수 없으면 변경 내용을 보존한 채 중단합니다. Task 구조는 STEP-04로 복구한 뒤 STEP-05에 재합류합니다.

6. Command Palette에서 Task 실행하기

목적 VS Code가 명시된 Windows PowerShell과 인수로 Task 명령을 해석하게 합니다.

  1. Ctrl+Shift+P를 누르고 Tasks: Run Task를 실행한 뒤 shell pin check를 선택합니다.

입력 위치 Command Palette와 새 Integrated Terminal

Tasks: Run Task
shell pin check
정상 결과 새 Task Terminal이 열리고 명령이 한 번 실행된 뒤 종료됩니다.

확인 선택한 label이 shell pin check인지, Task가 계속 실행 중이지 않은지 확인합니다.

실패 신호 Task가 목록에 없거나 powershell.exe를 찾지 못하거나 PowerShell parser 오류가 표시됩니다.

주의 오류가 나면 반복 실행하지 말고 전체 오류 원문을 보존합니다. 되돌리기: 실행 중이면 Tasks: Terminate Task로 중단하고 STEP-04의 JSON과 STEP-01의 실행 파일 확인 결과를 대조한 뒤 STEP-06으로 재합류합니다.

7. 고정된 Shell과 공백 값 출력 확인하기

목적 공백이 든 값과 실제 Shell 프로세스가 기대한 결과인지 독립적으로 확인합니다.

  1. shell pin check Task Terminal에서 아래 세 줄이 같은 순서로 표시되는지 확인합니다.

입력 위치 shell pin check Task Terminal

VALUE=alpha beta
SHELL_PROCESS=powershell
PS_EDITION=Desktop
정상 결과 세 줄이 정확히 표시되고 Task가 종료 코드 0으로 끝납니다. STEP-02의 기본 Terminal Profile 이름과 달라도 이 Task는 powershell.exe를 사용합니다.

확인 공백이 있는 alpha beta가 한 줄에 보이는지, 프로세스 이름과 PowerShell Edition이 각각 powershell·Desktop인지, 종료 코드가 0인지 교차 확인합니다.

실패 신호 값이 두 줄로 갈라지거나 Write-Output을 찾지 못하거나 프로세스·Edition이 다르거나 종료 코드가 0이 아닙니다.

주의 예상과 다른 결과를 성공으로 간주하지 않습니다. 되돌리기: 오류 원문을 보존하고 executable·args·command를 STEP-04와 대조합니다. 복구 후 STEP-06을 다시 실행하고 세 줄의 완료 기준을 재확인합니다.

4. 완료 확인하기

편집기의 JSON 구조, 변경하지 않은 기본 Terminal Profile, 실제 Task Terminal 출력을 서로 다른 Evidence로 교차 확인합니다.

  • VS Code Stable 1.133.0과 실제 powershell.exe 경로를 첫 변경 전에 확인했습니다.
  • 기본 Terminal Profile 이름은 기록만 했고 선택하거나 사용자 설정을 바꾸지 않았습니다.
  • options.shell.executable은 String powershell.exe, options.shell.args는 -NoLogo·-NoProfile·-Command String Array입니다.
  • Task Terminal에 VALUE=alpha beta가 한 줄로 표시되어 공백 값이 보존됐습니다.
  • 동일 출력에서 SHELL_PROCESS=powershell과 PS_EDITION=Desktop을 확인했고 종료 코드 0으로 끝났습니다.
  • 설치·삭제·권한 변경·외부 전송·사용자 Terminal 설정 변경은 수행하지 않았고, 연습 폴더를 휴지통으로 이동하는 Rollback 경로를 확인했습니다.
완료 기준 Task 하나에 Windows PowerShell 실행 파일과 command-mode 인수를 명시하고, 일반 Terminal의 기본 Profile을 바꾸지 않은 상태에서 공백 값·Shell 프로세스·PowerShell Edition 세 줄과 종료 코드 0을 확인했습니다.

5. 문제가 생겼다면

Task 목록에 shell pin check가 없습니다

먼저 확인 단일 파일이 아니라 폴더를 열었는지, 경로가 정확히 .vscode/tasks.json인지, 파일을 저장했는지 확인합니다.

복구 JSON 오류 원문을 보존하고 STEP-04 예제와 중괄호·쉼표·따옴표를 비교합니다. 원인을 확인하지 못하면 새 빈 연습 폴더에서 전체 예제를 다시 만듭니다.

재합류 STEP-04

powershell.exe를 찾지 못합니다

먼저 확인 STEP-01의 Get-Command powershell.exe 출력과 executable 철자를 대조합니다.

복구 실제 경로가 확인되지 않으면 임의 경로를 만들지 말고 실습을 중단합니다. 확인된 경우에만 STEP-04의 String을 복구합니다.

재합류 STEP-04

Write-Output을 찾지 못하거나 cmd 오류가 납니다

먼저 확인 type이 shell인지, options.shell이 Task 안에 있는지, executable이 powershell.exe인지 확인합니다.

복구 오류 원문과 실제 출력 Shell을 보존하고 STEP-04의 options Object 전체를 복구합니다. 원인이 확인되지 않으면 상태를 UNKNOWN으로 두고 실제 명령 적용을 중단합니다.

재합류 STEP-05

VALUE=alpha beta가 한 줄로 나오지 않습니다

먼저 확인 command 안의 작은따옴표가 ASCII 문자로 한 쌍인지, JSON 바깥 큰따옴표가 닫혔는지 확인합니다.

복구 일부만 고치지 말고 STEP-04의 command String 전체를 복구한 뒤 저장합니다.

재합류 STEP-06

Profile 스크립트 때문에 필요한 명령을 찾지 못합니다

먼저 확인 이 예제는 의도적으로 -NoProfile을 사용합니다. 필요한 명령이 PowerShell Profile에서만 추가되는 alias·함수·PATH인지 확인합니다.

복구 자동화는 Profile에 의존하지 않는 실행 파일 경로와 스크립트를 쓰는 것이 권장됩니다. -NoProfile을 무작정 제거하지 말고 의존성을 명시적으로 옮긴 뒤 별도 검토합니다.

재합류 STEP-04

출력은 맞지만 종료 코드가 0이 아닙니다

먼저 확인 Task Terminal의 전체 오류와 마지막 종료 문장, -Command 뒤 명령 문자열을 확인합니다.

복구 출력 일부만 보고 성공으로 판단하지 말고 STEP-04 전체 예제로 복구한 뒤 다시 실행합니다.

재합류 STEP-06

핵심 판단 원인을 확인하지 못하면 기본 Terminal Profile과 Task Shell을 같은 것으로 단정하지 않습니다. 오류 원문, tasks.json, 확인된 실행 파일 경로를 보존하고 Recovery 뒤 4장의 완료 기준을 다시 확인합니다.

6. 핵심 정리와 공식 자료

  • shell Task는 Shell이 명령 문자열을 해석하므로 Shell 종류와 인수가 인용 결과에 영향을 줍니다.
  • options.shell.executable은 Shell String, options.shell.args는 command-mode 인수의 String Array입니다.
  • 일반 Terminal의 기본 Profile, Tasks/Debug 공통 자동화 Profile, Task별 options.shell은 서로 다른 설정 층입니다.
  • 사용자 설정을 바꾸지 않고 Task 하나를 Windows PowerShell에 고정해 공백 값과 실제 Shell 정보를 확인했습니다.

공식 자료

아래 자료는 2026-08-14 Asia/Seoul에 접근했습니다. Stable Update API와 1.133 Release Notes는 현재 Windows x64 Stable 기준을, Tasks 문서와 Appendix는 options.shell override와 CommandOptions.shell의 자료형을 설명합니다. Terminal Profiles 문서는 기본 Profile과 terminal.integrated.automationProfile.windows의 범위를, Microsoft Learn의 PowerShell 문서는 powershell.exe와 -NoProfile의 적용 범위를 설명합니다. 공식 저장소의 JSON Schema 소스는 현재 구현을 보조 확인하는 용도이며 후속 버전에서 바뀔 수 있습니다. 정확한 한국어 UI 문구는 표시 언어에 따라 달라질 수 있어 UNCONFIRMED로 남깁니다.

다음 편 예고 커맨드 팔레트 16부 — 기본 빌드 Task를 지정해 한 번에 실행하기. group.kind: build와 isDefault: true로 기본 Build Task를 정하고 Tasks: Run Build Task 실행 결과를 확인합니다.
반응형
이 글이 유용했다면 링크를 공유해 보세요.