Windows 명령 프롬프트에서 "cut"을 어떻게 바꿀 수 있나요?

Windows 명령 프롬프트에서 "cut"을 어떻게 바꿀 수 있나요?

다음과 같은 이름 패턴과 일치하는 하위 폴더 집합이 있는 디렉터리가 있습니다.

sub-123
sub-0815
sub-4711

이 폴더 안에는 폴더 이름에서 발견된 이름과 동일한 번호를 가진 파일이 몇 개 있습니다. 예를 들어 sub-123 폴더에는 파일이 포함되어 있습니다.

input-123
output-123

폴더를 반복하고, 작업 디렉터리를 현재 폴더로 변경하고, 적절한 파일 세트로 일부 처리를 수행하고 싶습니다. 폴더를 반복할 수 있는 동안

for /d %%d in (sub-*) do .

위의 예에서 "123"과 같이 별표와 일치하는 폴더 이름 부분이 필요합니다. 폴더 이름에서 123을 추출하고 다음과 같은 명령을 작성하려면 어떻게 해야 합니까?

cd sub-123
copy input-123 output-123

Windows-7 배치 파일 안에 있습니까? Linux 환경에서는 cut 명령이나 정규식을 사용할 수 있습니다. 그런데 Windows 명령 프롬프트로 어떻게 들어가야 합니까?

답변1

나는 그것을 스스로 발견했다. set 명령에는 향상된 변수 대체 기능이 있습니다. 하지만 신체 자체에는 사용할 수 없습니다 for. 새로운 bacth 호출 컨텍스트를 시작해야 합니다.

for /d %%d in (sub-*) do (
  set item=%%d
  pushd %%d
  call :build
  popd
)
goto :eof

:build
  set item=%item:sub-=%
  copy input-%item% output-%item%
:eof

"항목"은 별표와 일치하는 문자열에서 정확히 빌드되지는 않지만 동일합니다.

답변2

나는 또한 직접적인 대답을 찾았습니다. 컷 의미론에 가깝습니다.

set 명령에는 하위 문자열 구문도 있습니다. n자를 건너뛰려면 %variable:~n%. 오프셋 k에서 시작하는 n 문자를 얻으려면 다음을 사용하세요.%variable:~k,n%

for /d %%d in (sub-*) do (
  set item=%%d
  set num=%item:~4%
  pushd %%d
  copy input-%num% output-%num%
  popd
)

관련 정보