[batch-file] 변수에서 일괄 추출 경로 및 파일 이름

변수에서 경로와 파일 이름을 어떻게 추출 할 수 있습니까?

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
)

코멘트 : 코멘트를 참조하십시오.


답변

(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첫 번째 인수의 파일 이름입니다.

누군가에게 도움이되기를 바랍니다.


답변