개발/Visual Studio Code

VS Code 커맨드 팔레트 7부|Task 입력값으로 재사용 가능한 명령 만들기

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

Task 입력값으로 재사용 가능한 명령 만들기

promptString과 pickString을 한 Task에 연결해, 실행할 때마다 대상과 모드를 바꿔 쓰고 민감정보는 구성에 남기지 않습니다.

이번 편의 핵심

같은 Task를 두 번 실행해 첫 번째는 sample-one · dry-run, 두 번째는 sample-two · normal이 Terminal에 표시되면 완료입니다.

비슷한 Task를 여러 개 복사하지 않고, 실행 시점의 비민감 입력값만 바꿔 반복 작업을 재사용합니다.

1. 시작하기 전에

이 실습은 JSON 파일 하나를 편집하고 고정된 PowerShell 출력 명령을 실행하는 중간 난이도 작업입니다. 데이터 삭제는 없지만 Task가 셸을 실행하므로 명령 전체를 먼저 읽어야 합니다.

준비할 것

  • 직접 만든 빈 task-input-demo 폴더 — Explorer에서 기존 프로젝트 파일과 .vscode/tasks.json이 없는지 확인합니다.
  • VS Code Stable — 이 Run은 Windows x64의 1.131.0에서 버전을 확인했습니다.
  • PowerShell — 새 Terminal의 프로필 이름으로 확인합니다.
  • 공개해도 되는 연습용 문자열 — 암호·토큰·API 키는 입력하지 않습니다.

적용 환경 Windows 11 · VS Code Stable 1.131.0 Windows x64 · PowerShell · 일반 사용자 권한 · 확장 기능 불필요

UI 언어는 확인하지 못했으므로 Command Palette에서 영문 명령명과 핵심 검색어를 사용합니다. macOS·Linux에서는 inputs 구조는 같지만 아래 PowerShell 셸 예제를 그대로 실행하지 말고 해당 셸용 명령을 별도로 검증해야 합니다.

실행 전 Human Gate Task의 command가 Write-Output 두 번만 수행하는지 확인하세요. 삭제, 파일 쓰기, 다운로드, 권한 상승, 외부 전송 또는 알 수 없는 실행 파일이 보이면 실행하지 않습니다. 보호 대상: 기존 프로젝트 파일, 사용자 설정, 계정 자격 증명. 중단 조건: 기존 Task 파일, 이해하지 못한 명령, 실제 민감정보. 되돌리기: 실행 중이면 Tasks: Terminate Task로 중단하고 연습 Workspace를 닫습니다.

2. 알아둘 핵심 개념

inputs

tasks.json과 launch.json에서 사용자 입력 변수를 정의하는 배열입니다. 각 항목은 고유한 id를 가지며 Task에서는 ${input:id} 형식으로 참조합니다.

promptString

실행 시 텍스트 입력 상자를 엽니다. description은 질문 문구이고 default는 사용자가 바꾸지 않았을 때의 값입니다. password: true는 입력 화면의 글자를 숨길 뿐 보안 저장소를 제공한다는 뜻이 아닙니다.

pickString

실행 시 미리 정한 선택지를 Quick Pick 목록으로 보여 줍니다. 객체 형식의 option은 화면에 보이는 label과 Task에 전달되는 value를 나눌 수 있습니다. default는 label이 아니라 실제 value 중 하나여야 합니다.

${input:...} 치환

Task 실행 시 input ID의 결과를 문자열로 바꿉니다. 공식 문서상 Task 변수 치환은 command, args, options에서 지원되며 input 변수 중첩은 지원되지 않습니다. 이 예제는 비민감 값을 셸 명령 문자열에 붙이지 않고 options.env로 전달합니다.

민감정보 금지 password: true는 화면 표시만 가립니다. 실제 암호·토큰·API 키를 default, options, command, args, options.env에 저장하지 마세요. 실제 비밀값이 필요하면 조직이 승인한 자격 증명 관리자나 대상 도구의 로그인 흐름을 사용합니다.

3. 순서대로 진행하기

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

1. 빈 연습 폴더 열기

목적 기존 프로젝트와 Task 설정을 보호합니다.

  1. 직접 만든 빈 task-input-demo 폴더를 File > Open Folder...로 엽니다.

입력 위치 VS Code 메뉴와 Explorer

Artifact 직접 만든 빈 Workspace 폴더

정상 결과 Explorer 최상위에 task-input-demo만 보입니다.

확인 기존 파일과 .vscode/tasks.json이 없는지 확인합니다.

실패 신호 다른 프로젝트 파일이나 기존 Task 설정이 보입니다.

주의 기존 파일이 있으면 아무것도 만들지 않습니다. 되돌리기: 폴더를 닫고 새 빈 폴더로 다시 시작합니다.

2. Task 구성 파일 만들기

목적 Workspace 전용 Task 파일을 승인된 위치에 만듭니다.

  1. Ctrl+Shift+P에서 Tasks: Configure Task를 실행하고 Create tasks.json file from template > Others를 선택합니다.

입력 위치 Command Palette

Artifact .vscode/tasks.json

정상 결과 .vscode/tasks.json 편집 탭이 열립니다.

확인 Explorer에서 파일 경로가 현재 Workspace 아래인지 확인합니다.

실패 신호 User Tasks나 다른 폴더의 파일이 열립니다.

주의 다른 범위의 Task 파일을 수정하지 않습니다. 되돌리기: 저장하지 말고 닫은 뒤 STEP-01의 Workspace 이름을 다시 확인합니다.

3. 입력형 Task 구성 저장하기

목적 한 Task에 텍스트 입력과 선택 입력을 연결합니다.

  1. .vscode/tasks.json 전체를 아래 JSON으로 바꾸고 저장합니다.

입력 위치 Workspace 루트의 .vscode/tasks.json

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "입력값 확인: 대상과 모드",
      "type": "shell",
      "command": "Write-Output ('대상: ' + $env:VSC_TASK_TARGET); Write-Output ('모드: ' + $env:VSC_TASK_MODE)",
      "options": {
        "shell": {
          "executable": "powershell.exe",
          "args": ["-NoLogo", "-NoProfile", "-Command"]
        },
        "env": {
          "VSC_TASK_TARGET": "${input:targetName}",
          "VSC_TASK_MODE": "${input:runMode}"
        }
      },
      "problemMatcher": []
    }
  ],
  "inputs": [
    {
      "id": "targetName",
      "type": "promptString",
      "description": "실행 대상을 입력하세요 (민감정보 금지)",
      "default": "sample-one"
    },
    {
      "id": "runMode",
      "type": "pickString",
      "description": "실행 모드를 선택하세요",
      "options": [
        { "label": "미리 보기", "value": "dry-run" },
        { "label": "일반 실행", "value": "normal" }
      ],
      "default": "dry-run"
    }
  ]
}
정상 결과 파일이 저장되고 빨간 JSON 오류 표시가 없습니다.

확인 targetName, runMode ID와 두 ${input:...} 참조가 정확히 대응하는지 비교합니다.

실패 신호 빨간 밑줄, 알 수 없는 속성, 닫는 괄호 오류가 보입니다.

주의 실제 비밀값을 예제 문자열 대신 넣지 않습니다. 되돌리기: 입력 ID의 대소문자, 쉼표, 중괄호를 예제와 한 줄씩 비교합니다.

4. 실행 전 명령 확인하기

목적 Task가 읽기 전용 출력만 수행하는지 Human Gate에서 확인합니다.

  1. tasks[0].command가 Write-Output 두 번만 포함하는지 읽습니다.

입력 위치 .vscode/tasks.json의 command

Write-Output ('대상: ' + $env:VSC_TASK_TARGET); Write-Output ('모드: ' + $env:VSC_TASK_MODE)
정상 결과 삭제·쓰기·다운로드·권한 상승·외부 전송 명령이 없습니다.

확인 Set-Content, Remove-Item, Invoke-WebRequest, 관리자 실행 문자열이 없는지 확인합니다.

실패 신호 예제에 없는 명령이나 파이프가 보입니다.

주의 확인 전에는 Task를 실행하지 않습니다. 되돌리기: STEP-03의 정확한 예제로 복원합니다.

5. Task 목록에서 시작하기

목적 구성한 Task의 입력 흐름을 시작합니다.

  1. Command Palette에서 Tasks: Run Task를 실행하고 입력값 확인: 대상과 모드를 선택합니다.

입력 위치 Command Palette

Artifact Tasks: Run Task → 입력값 확인: 대상과 모드

정상 결과 실행 대상을 입력하세요 (민감정보 금지) 입력 상자가 나타납니다.

확인 질문 문구와 기본값 sample-one을 확인합니다.

실패 신호 Task가 목록에 없거나 질문 없이 Terminal이 열립니다.

주의 Task label과 실행 명령을 다시 확인합니다. 되돌리기: 실행됐다면 Tasks: Terminate Task로 중단하고 STEP-03을 확인합니다.

6. 첫 대상 이름 입력하기

목적 promptString이 실행 시 값을 받는지 확인합니다.

  1. 입력 상자의 값을 sample-one으로 두고 Enter를 누릅니다.

입력 위치 VS Code Quick Input

Artifact 비민감 문자열 sample-one

정상 결과 실행 모드를 선택하세요 목록이 나타납니다.

확인 목록에 미리 보기와 일반 실행이 보이는지 확인합니다.

실패 신호 입력 후 Task가 취소되거나 목록이 비어 있습니다.

주의 민감정보는 입력하지 않습니다. 되돌리기: runMode input과 참조를 확인하고 STEP-05로 돌아갑니다.

7. 첫 실행 모드 선택하기

목적 pickString의 label과 전달 value를 구분합니다.

  1. 미리 보기를 선택합니다.

입력 위치 VS Code Quick Pick

화면 label: 미리 보기
전달 value: dry-run
정상 결과 Task Terminal에 대상: sample-one과 모드: dry-run이 출력됩니다.

확인 화면 label이 아니라 value dry-run이 출력됐는지 확인합니다.

실패 신호 미리 보기가 그대로 출력되거나 환경 변수 값이 비어 있습니다.

주의 Terminal 전체 출력은 문제 해결 Evidence입니다. 되돌리기: option의 label·value와 options.env 키를 확인하고 STEP-05로 돌아갑니다.

8. 같은 Task를 다시 시작하기

목적 Task 복사 없이 값을 다시 받을 수 있는지 확인합니다.

  1. Tasks: Run Task에서 같은 입력값 확인: 대상과 모드를 다시 선택합니다.

입력 위치 Command Palette

Artifact 같은 Task label

정상 결과 대상 입력 상자가 다시 나타납니다.

확인 새 Task 항목을 만들지 않았는데 입력 흐름이 다시 시작되는지 확인합니다.

실패 신호 이전 값으로 질문 없이 실행됩니다.

주의 Rerun Last Task는 이전 해석값을 재사용하는 설정의 영향을 받을 수 있습니다. 되돌리기: 이 실습에서는 Tasks: Run Task로 다시 시작합니다.

9. 두 번째 대상 이름 입력하기

목적 promptString 값 변경이 같은 Task에 반영되는지 확인합니다.

  1. 입력 상자에 sample-two를 입력하고 Enter를 누릅니다.

입력 위치 VS Code Quick Input

Artifact 비민감 문자열 sample-two

정상 결과 실행 모드 선택 목록이 나타납니다.

확인 입력 상자를 닫지 않고 선택 목록으로 진행했는지 확인합니다.

실패 신호 Task가 취소되거나 이전 Terminal 출력만 남습니다.

주의 입력값은 연습용 문자열로 제한합니다. 되돌리기: STEP-08에서 다시 시작합니다.

10. 두 번째 실행 모드 선택하기

목적 다른 pickString value가 출력에 반영되는지 확인합니다.

  1. 일반 실행을 선택합니다.

입력 위치 VS Code Quick Pick

화면 label: 일반 실행
전달 value: normal
정상 결과 Task Terminal에 대상: sample-two와 모드: normal이 출력됩니다.

확인 첫 실행의 두 값과 두 번째 실행의 두 값이 모두 다르게 보이는지 비교합니다.

실패 신호 sample-one 또는 dry-run이 다시 출력됩니다.

주의 default와 실제 선택을 구분합니다. 되돌리기: STEP-08부터 다시 실행합니다.

11. 구성에 비밀값이 없는지 확인하기

목적 재사용 입력을 비밀 저장소로 오해하지 않게 합니다.

  1. .vscode/tasks.json에서 암호·토큰·API 키 형태의 실제 literal이 없는지 검색합니다.

입력 위치 .vscode/tasks.json에서 Ctrl+F

Artifact 읽기 전용 파일 검색과 육안 검토

정상 결과 실제 자격 증명 문자열이 0개입니다.

확인 default, options, command, args, options.env 값을 교차 확인합니다.

실패 신호 실제 비밀값 또는 외부 전송 명령이 보입니다.

주의 실제 비밀을 입력했다면 Terminal을 지우는 것만으로 끝내지 않습니다. 되돌리기: Task를 중단하고 literal을 제거한 뒤 해당 서비스에서 자격 증명을 폐기·재발급합니다.

4. 완료 확인하기

입력 화면과 독립된 방법을 포함해 결과를 교차 확인합니다.

  • .vscode/tasks.json을 닫았다 다시 열어 targetName, runMode ID와 두 참조가 남아 있는지 확인합니다.
  • Tasks: Run Task로 첫 실행해 sample-one · dry-run 출력을 확인합니다.
  • 같은 Task를 다시 실행해 sample-two · normal 출력을 확인합니다.
  • Task 배열은 1개, input 배열은 2개이며 복제 Task가 없는지 확인합니다.
  • 파일 검색과 육안 검토로 실제 민감정보 literal이 0개인지 확인합니다.
완료 기준 Task를 복제하지 않고 실행할 때마다 텍스트와 선택 값을 새로 받아 Terminal 출력이 바뀌며, 구성 파일에는 실제 민감정보가 없습니다.

5. 문제가 생겼다면

Task가 목록에 나타나지 않는다

먼저 확인 .vscode/tasks.json 경로, 저장 여부, Problems 탭의 JSON 오류를 보존하고 확인합니다.

복구 Workspace 루트 아래 경로와 쉼표·괄호를 수정한 뒤 저장합니다.

재합류 STEP-05

Variable input targetName can not be resolved처럼 input ID 오류가 난다

먼저 확인 Terminal 오류 원문을 보존하고 ${input:targetName}과 inputs[].id의 대소문자·철자를 비교합니다.

복구 두 위치를 같은 ID로 맞추고 중첩된 input 변수 형태를 제거합니다.

재합류 STEP-03

Quick Pick 기본값 오류 또는 기본 선택이 없다

먼저 확인 runMode input 전체와 JSON 진단을 보존하고, default가 label이 아니라 option value인지 확인합니다.

복구 default를 dry-run 또는 normal 중 하나로 바꿉니다.

재합류 STEP-05

Terminal의 대상 또는 모드가 비어 있다

먼저 확인 Terminal 두 줄 전체와 options.env 객체를 보존하고 환경 변수 키·input 참조 철자를 확인합니다.

복구 키를 예제와 맞추고 PowerShell 프로필을 확인합니다.

재합류 STEP-05

예상하지 못한 명령이 실행된다

먼저 확인 Task Terminal 전체 출력, 변경하지 않은 tasks.json, 실행 프로세스 이름을 보존합니다. 원인은 확인 전까지 UNKNOWN입니다.

복구 Tasks: Terminate Task로 중단하고 Workspace를 닫습니다. 원인을 확인하기 전에는 재실행하지 않습니다.

재합류 원인이 확인되고 보호 대상이 정상일 때만 STEP-04

핵심 판단 입력 상자를 숨기는 것과 비밀을 안전하게 저장하는 것은 다릅니다. 실제 자격 증명이 노출됐다면 Task를 중단하고 해당 서비스에서 폐기·재발급해야 합니다.

6. 핵심 정리와 공식 자료

  • inputs의 고유 ID를 ${input:id}로 참조하면 같은 Task가 실행 시 값을 받을 수 있습니다.
  • promptString은 자유 텍스트, pickString은 제한된 선택지를 받습니다.
  • label과 value를 나누면 화면 문구와 Task 전달값을 각각 안정적으로 관리할 수 있습니다.
  • Task 변수 치환은 command, args, options에서 사용하고 input 중첩은 피합니다.
  • password: true는 화면 마스킹일 뿐 비밀 관리 계약이 아닙니다. 실제 민감정보를 Task 구성에 저장하지 않습니다.

공식 자료

아래 자료는 2026-08-06 19:00 Asia/Seoul 기준으로 접근했습니다. 이 Run은 로컬 VS Code Stable 1.131.0 Windows x64를 확인했으며 후속 버전·UI 언어·셸에 따라 표시 이름과 동작 차이가 생길 수 있습니다. 보안 저장소에 관한 문장은 공식 Schema가 보장하는 범위가 입력 화면의 글자 숨김뿐이라는 점에 근거한 안전 측 추론입니다.

다음 편 예고 커맨드 팔레트 8부 — Task 출력 패널을 전용 Terminal로 정리하기: presentation.reveal, panel, group, clear로 여러 Task의 출력을 섞지 않고 확인하는 방법을 다룹니다.
반응형
이 글이 유용했다면 링크를 공유해 보세요.