변수에서 일괄 추출 경로 및 파일 이름


답변:


140
@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
@meir-사실; 수정 사항을 게시했습니다. 몇 년 동안 많은 것을 배웁니다.
Magoo

@TrivisionZero : 아니요, 파일 이름이나 경로에 공백이 포함 된 경우 따옴표가 필요합니다.
Magoo

@ceztko : 포함이 무엇을하는지 정확히 설명 해주세요 /f.
Magoo

/ F 문서 에 따라 루프 실행을 하나의 토큰으로 제한합니다 . 내 테스트에서는 통과 경로가 따옴표로 묶여 있었기 때문에 필요했습니다. 귀하의 예에서는 완벽하게 안전하며 루프가 한 번만 실행된다는 사실에 대해 더 분명합니다.
ceztko

죄송합니다. / F를 사용하면 경로에 공백이있는 경우 더 이상 작동하지 않는 것으로 나타났기 때문에 변경 사항을 되돌립니다. 그래도 내 사용 사례 (셸 확장)에서 코드에 문제가 있습니다. 더 이상 편집하지 않고 찾을 수있는 경우 제 경우에 수정 사항을 제안합니다.
ceztko

137

(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%

더 자세한 답변. 감사합니다.
Jorge Fuentes González

13

이 모든 것이 저에게 효과적입니다.

@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

2

실제 실행중인 배치 파일에서 정보를 얻으려면 다음을 시도하십시오.

@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")을 시도 할 수 있습니다.


0

늦은 답변, 알아요,하지만 저에게 다음 스크립트는 매우 유용합니다. 그리고 질문에도 대답하고 하나의 플래그로 두 번의 비행을칩니다 ;-)

다음 스크립트 는 파일 탐색기의 컨텍스트 메뉴에서 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첫 번째 인수의 파일 이름입니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.