파일 확장자 없이 현재 실행중인 배치 파일의 이름을 얻고 싶습니다 .
덕분에 이 링크는 , 나는 파일 이름이 가진 확장을 …하지만 배치 파일에서 문자열을 할 수있는 가장 좋은 방법은 무엇입니까?
아니면 확장자가없는 파일 이름을 얻는 다른 방법이 있습니까?
이 시나리오에서는 3 글자 확장명을 사용하는 것이 안전합니다.
답변
배치의 파일 이름을 얻는 가장 쉬운 방법은을 사용하는 것 %~n0
입니다.
@echo %~n0
는 현재 실행중인 배치 파일의 이름 (확장자없이)을 출력합니다 (에 의해 호출 된 서브 루틴에서 실행되지 않은 경우 call
). 경로 이름에 대한 이러한 “특별한”대체 목록은 help for
도움말 맨 끝에서 찾을 수 있습니다 .
또한 FOR 변수 참조의 대체가 향상되었습니다. 이제 다음과 같은 선택적 구문을 사용할 수 있습니다.
%~I - expands %I removing any surrounding quotes (") %~fI - expands %I to a fully qualified path name %~dI - expands %I to a drive letter only %~pI - expands %I to a path only %~nI - expands %I to a file name only %~xI - expands %I to a file extension only %~sI - expanded path contains short names only %~aI - expands %I to file attributes of file %~tI - expands %I to date/time of file %~zI - expands %I to size of file %~$PATH:I - searches the directories listed in the PATH environment variable and expands %I to the fully qualified name of the first one found. If the environment variable name is not defined or the file is not found by the search, then this modifier expands to the empty string
수정자를 결합하여 복합 결과를 얻을 수 있습니다.
%~dpI - expands %I to a drive letter and path only %~nxI - expands %I to a file name and extension only %~fsI - expands %I to a full path name with short names only
그러나 귀하의 질문에 정확하게 대답하기 위해 : 부분 문자열은 다음 :~start,length
표기법을 사용하여 수행 됩니다.
%var:~10,5%
환경 변수의 위치 10에서 5자를 추출합니다 %var%
.
참고 : 문자열의 인덱스는 0부터 시작하므로 첫 번째 문자는 위치 0에 있고 두 번째 문자는 1에 있습니다.
같은 인수 변수의 문자열을 얻으려면 %0
, %1
등 당신은 정상적인 환경 변수 사용에 할당해야 할 set
첫째 :
:: Does not work:
@echo %1:~10,5
:: Assign argument to local variable first:
set var=%1
@echo %var:~10,5%
구문은 훨씬 강력합니다.
%var:~-7%
에서 마지막 7자를 추출합니다%var%
%var:~0,-4%
마지막 네 개를 제외한 모든 문자를 추출하여 파일 확장자를 제거합니다 (마침표 [.
] 뒤에 세 문자를 가정 ).
help set
해당 구문에 대한 자세한 내용을 참조하십시오 .
답변
위의 멋진 설명!
현지화 된 Windows 에서이 작업을 수행하는 데 어려움을 겪을 수있는 모든 사람들 (광산은 슬로바키아어에서 XP입니다) %
에 대해!
그래서:
SET TEXT=Hello World
SET SUBSTRING=!TEXT:~3,5!
ECHO !SUBSTRING!
답변
Joey의 답변에 대한 추가 정보로 set /?
nor 의 도움으로 설명되지 않았습니다 for /?
.
%~0
입력 한대로 정확하게 자신의 배치 이름으로 확장됩니다.
따라서 배치를 시작하면 다음과 같이 확장됩니다.
%~0 - mYbAtCh
%~n0 - mybatch
%~nx0 - mybatch.bat
그러나 한 가지 예외가 있습니다. 서브 루틴 확장은 실패 할 수 있습니다
echo main- %~0
call :myFunction
exit /b
:myFunction
echo func - %~0
echo func - %~n0
exit /b
결과는
main - myBatch
Func - :myFunction
func - mybatch
함수 %~0
에서 배치 파일이 아닌 함수 이름으로 항상 확장됩니다.
그러나 하나 이상의 수정자를 사용하면 파일 이름이 다시 표시됩니다!