변수에서 경로와 파일 이름을 어떻게 추출 할 수 있습니까?
Setlocal EnableDelayedExpansion
set file=C:\Users\l72rugschiri\Desktop\fs.cfg
함수 나 GOTO를 사용하지 않고하고 싶습니다. 가능할까요?
답변:
@ECHO OFF
SETLOCAL
set file=C:\Users\l72rugschiri\Desktop\fs.cfg
FOR %%i IN ("%file%") DO (
ECHO filedrive=%%~di
ECHO filepath=%%~pi
ECHO filename=%%~ni
ECHO fileextension=%%~xi
)
아니 정말 당신이 어떤 "기능"는 무엇을 의미하는
분명히 ECHOing보다는 변수를 설정 ECHO
하도록 SET
로 변경하십시오 .
전체 목록 은 for
설명서 를 참조하십시오 .
ceztko의 테스트 케이스 (참고 용)
@ECHO OFF
SETLOCAL
set file="C:\Users\ l72rugschiri\Desktop\fs.cfg"
FOR /F "delims=" %%i IN ("%file%") DO (
ECHO filedrive=%%~di
ECHO filepath=%%~pi
ECHO filename=%%~ni
ECHO fileextension=%%~xi
)
코멘트 : 코멘트를 참조하십시오.
/f
.
(1) BAT 자체 %1
의 매개 변수 또는 (2) CALL의 매개 변수 %1
또는 (3) 로컬 FOR 변수 에서만 경로와 파일 이름을 추출 할 수 있습니다 %%a
.
에서 HELP CALL
또는 HELP FOR
더 자세한 정보를 찾을 수 있습니다.
% ~ 1-주변 따옴표 ( ")를 제거
하여 % 1을 확장합니다. % ~ f1-% 1을 정규화 된 경로 이름으로
확장합니다. % ~ d1-% 1을 드라이브 문자로만
확장 합니다. % ~ p1-% 1을 경로로만 확장합니다.
% ~ n1-% 1을 파일 이름으로 만
확장 합니다. % ~ x1-% 1을 파일 확장명으로 만 확장합니다.
% ~ s1-확장 된 경로에 짧은 이름 만 포함됩니다.
% ~ a1-% 1을 파일 속성으로
확장 합니다. % ~ t1-확장합니다. 1
~ 파일 % ~ z1 의 날짜 / 시간 -% 1을 파일 크기로 확장
그리고 다음을 시도하십시오.
구문 분석 할 문자열을 매개 변수로 CALL에 전달하십시오.
call :setfile ..\Desktop\fs.cfg
echo %file% = %filepath% + %filename%
goto :eof
:setfile
set file=%~f1
set filepath=%~dp1
set filename=%~nx1
goto :eof
또는 동등한 파일 이름을 로컬 FOR 변수로 전달하십시오.
for %%a in (..\Desktop\fs.cfg) do (
set file=%%~fa
set filepath=%%~dpa
set filename=%%~nxa
)
echo %file% = %filepath% + %filename%
이 모든 것이 저에게 효과적입니다.
@Echo Off
Echo Directory = %~dp0
Echo Object Name With Quotations=%0
Echo Object Name Without Quotes=%~0
Echo Bat File Drive = %~d0
Echo Full File Name = %~n0%~x0
Echo File Name Without Extension = %~n0
Echo File Extension = %~x0
Pause>Nul
산출:
Directory = D:\Users\Thejordster135\Desktop\Code\BAT\
Object Name With Quotations="D:\Users\Thejordster135\Desktop\Code\BAT\Path_V2.bat"
Object Name Without Quotes=D:\Users\Thejordster135\Desktop\Code\BAT\Path_V2.bat
Bat File Drive = D:
Full File Name = Path.bat
File Name Without Extension = Path
File Extension = .bat
실제 실행중인 배치 파일에서 정보를 얻으려면 다음을 시도하십시오.
@echo off
set myNameFull=%0
echo myNameFull %myNameFull%
set myNameShort=%~n0
echo myNameShort %myNameShort%
set myNameLong=%~nx0
echo myNameLong %myNameLong%
set myPath=%~dp0
echo myPath %myPath%
set myLogfileWpath=%myPath%%myNameShort%.log
echo myLogfileWpath %myLogfileWpath%
더 많은 샘플? C :> HELP CALL
% 0 = 매개 변수 0 = 배치 파일 % 1 = 매개 변수 1-첫 번째 매개 변수. 배치 파일에 전달 ... 그래서 당신은 매개 변수에 대해서도 1st (예 : "%")와 last (예 : "1") 사이의 것들 (예 : "~ dp")을 시도 할 수 있습니다.
늦은 답변, 알아요,하지만 저에게 다음 스크립트는 매우 유용합니다. 그리고 질문에도 대답하고 하나의 플래그로 두 번의 비행을칩니다 ;-)
다음 스크립트 는 파일 탐색기의 컨텍스트 메뉴에서 SendTo 를 확장 합니다.
@echo off
cls
if "%~dp1"=="" goto Install
REM change drive, then cd to path given and run shell there
%~d1
cd "%~dp1"
cmd /k
goto End
:Install
rem No arguments: Copies itself into SendTo folder
copy "%0" "%appdata%\Microsoft\Windows\SendTo\A - Open in CMD shell.cmd"
:End
매개 변수없이이 스크립트를 두 번 클릭하여 실행하면 SendTo 폴더로 복사되고 "A-CMD shell.cmd에서 열기"로 이름이 변경됩니다. 그 후에 "SentTo"컨텍스트 메뉴에서 사용할 수 있습니다.
그런 다음 Windows 탐색기에서 파일 또는 폴더 를 마우스 오른쪽 버튼으로 클릭 하고 "SendTo> A-CMD shell.cmd에서 열기"를 선택합니다.
스크립트는 선택한 파일 또는 폴더가 포함 된 경로로 드라이브와 경로를 변경하고 해당 경로로 명령 셸을 엽니 다. Visual Studio Code에 유용합니다. 그런 다음 "code"를 입력 할 수 있기 때문입니다. 프로젝트 컨텍스트에서 실행합니다.
어떻게 작동합니까?
%0
-배치 스크립트의 전체 경로
%~d1
-첫 번째 인수에 포함 된 드라이브 (예 : "C :")
%~dp1
-첫 번째 인수에 포함 된 경로
cmd /k
-열려있는 명령 셸을 엽니 다.
여기에서는 사용되지 않지만 %~n1
첫 번째 인수의 파일 이름입니다.
누군가에게 도움이되기를 바랍니다.