2012-12-06 2 views
3

txt에서 경로를 가져와 마지막 폴더 이름을 가져온 다음 사용해야합니다.배치 : txt에서 경로의 마지막 폴더 이름을 얻으십시오.

setlocal EnableDelayedExpansion 

set InputFile=somar.txt 
for /f "tokens=* delims=" %%x in ('Type "%InputFile%"') do (
set path=%%x 
:shift 
for /f "tokens=1* delims=\/" %%i in ("!path!") do (
    set folder=%%i 
    set path=%%j 
    ) 
if not [!path!] == [] goto :shift 

echo folder: !folder! 
) 
endlocal 

문제는 txt의 첫 번째 줄에서만 작동한다는 것입니다. 문제가 어디에 있습니까?

1) 귀하에 대한 루프 당신이 GOTO를 발급 순간을 분류됩니다

+0

당신의 경로 끝에 파일 이름을 포함 하는가?아니면 파일이없는 경로 정보입니까? 내 해석은 후자 (파일 이름 없음)이지만, 나는 단지 확신하고 싶다. – dbenham

답변

2

당신은 많은 문제를 가지고있다. GOTO 이후 FOR 루프 반복을 더 이상 얻을 수 없습니다. GOTO 루프를 서브 루틴으로 이동 한 다음 DO 루프 내에서 서브 루틴을 호출하여이 문제를 해결할 수 있습니다.

2) PATH 환경 변수는 Windows 용으로 예약 된 의미가 있습니다. 변수 이름을 현지화 한 경우에도 해당 변수 이름을 용도대로 사용하면 안됩니다. 그것은 운명을 유혹하는 가치가 없습니다. 단순히 다른 변수 이름을 사용하십시오.

3) 아마도 데이터에 문제가 없지만 !은 파일 또는 폴더 이름에 유효한 문자입니다. 지연 확장을 사용하는 경우 FOR 변수를 확장하면 !을 포함하는 이름이 손상됩니다. 지연된 확장을 필요에 따라 설정하거나 해제하여이를 수정할 수 있습니다.

또한 비효율적입니다. FOR 루프에는 TYPE을 사용할 필요가 없습니다. FOR가 파일을 직접 읽게 할 수 있습니다. 변화 \

로 끝나는 경로를 처리하기 위해 만든 - 당신은 위의 모든 권고를 취할 수

(파일이 유니 코드가 아닌 경우),하지만

편집 :-) 훨씬 간단한 해결책이있다

@echo off set "InputFile=somar.txt" for /f "usebackq eol=: delims=" %%A in ("%inputFile%") do ( for %%F in ("%%A\.") do echo folder: %%~nxF ) 

~nx 가변 변수는 경로 끝의 이름과 확장자를 직접 제공합니다. 명령 행에서 HELP FOR을 입력하여 FOR 변수에서 사용 가능한 모든 수정자를 읽으십시오. 변수 파일 이름을

+0

텍스트 파일에 경로 이름 만 있으면 OP가 파일 이름이 아닌 마지막 폴더 이름 다음에 오는 것 같습니다. –

+0

@BaliC - 네, OP는 데이터에 파일 이름이 아닌 폴더 이름으로 끝나는 경로가 있음을 나타냅니다. 수정자는 끝 노드가 파일이나 폴더인지 상관하지 않습니다. * 경로가 \로 끝나는 경우 원본 솔루션이 작동하지 않습니다. 귀하의 의견은 내가 변화를 필요로한다는 것을 깨닫게했습니다. 코드가 더욱 강력 해졌습니다. – dbenham

+0

쿨, 나는 모디파이어에 대해 몰랐다. +1 –

0

:

@Echo OFF 

:: By Elektro [email protected] 

set "File=File.ext" 
Call :Get_paths "%InputFile%" 

Pause&exit 

:Get_paths 
Set "AbsolutePath=%~dp1" 
set "AbsolutePath=%AbsolutePath:\= %" 
FOR %%# in (%AbsolutePath%) do (
    Set "LastFolder=%%#" 
    Echo Folder: %%# 
) 
Echo Last Folder: %LastFolder% 
GOTO:EOF 

출력 : 파일의 경우

Folder: C: 
Folder: Users 
Folder: Administrador 
Folder: Desktop 

Last Folder: Desktop 

:

@Echo OFF 

:: By Elektro [email protected] 

set "File=test.txt" 

For /F "Tokens=* usebackq" %%# in ("%FILE%") DO ( 
    Set "AbsolutePath=%%~dp#" 
    Call set "AbsolutePath=%%AbsolutePath:\= %%" 
    CMD /Q /C "@FOR %%@ in (%%AbsolutePath%%) do (Echo Folder: %%@)" 
) 

Pause&Exit 
+0

마지막 폴더 이름에 공백, 세미콜론 또는 쉼표가 포함되어 있으면 기록한대로 작동하지 않습니다. 또한 파일의 경로 끝에 파일 이름이 포함되어 있고 각 파일의 상위 폴더가 필요하다고 가정합니다. 문제는 경로가 파일을 포함하는지 여부에 대해 약간 모호하지만 OP는 OP 코드가 첫 번째 줄에서 작동 함을 나타내며 마지막 노드의 부모가 아니라 마지막 노드 만 가져옵니다. 그래서이 답변은 질문에 대한 나의 해석과 일치하지 않습니다. – dbenham

0

InputFile 내용에는 파일 이름이나 폴더가 있어야합니다.
예)

D:\Test1 <= folder 
D:\Test2\file.txt <= file 

D:\Test3\01. folder <= folder but recognize file. that contain extension. 

내 코드는 다음과 같습니다

 
SETLOCAL EnableDelayedExpansion 

SET lastFolder= 
SET InputFile=somar.txt 

FOR /F %%F IN (%InputFile%) DO (
    CALL :__GetFolderName "%%F" 
    @ECHO lastFolder: !lastFolder! 
) 

GOTO :EOF 


:: ******************** Inner Batch 
:__GetFolderName 
IF "%~x1"=="" SET lastFolder=%~n1 & GOTO :EOF 

SET dp=%~dp1 

CALL :__GetFolderName "%dp:~0,-1%" 

GOTO :EOF 
:: ******************** 

ENDLOCAL 

결과는 다음과 같습니다

 
lastFolder: Test1 
lastFolder: Test2 
lastFolder: Test3 
관련 문제