batch:从txt的路径获取最后一个文件夹名称

时间:2012-12-06 10:54:59

标签: batch-file

我需要从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中的第一行。问题出在哪里?

3 个答案:

答案 0 :(得分:2)

你有很多问题:

1)您发出GOTO时,您的FOR循环会中断。在GOTO之后你不会再获得FOR循环迭代。您可以通过将GOTO循环移动到子例程然后从DO循环中调用子例程来解决此问题。

2)PATH环境变量对Windows具有保留含义。您永远不应该将该变量名称用于您自己的目的,即使它已经本地化了。不值得诱惑命运。只需使用不同的变量名称。

3)您的数据可能不是问题,但!是文件或文件夹名称的有效字符。如果启用了延迟扩展,则FOR变量的扩展将损坏包含!的名称。这可以通过根据需要打开和关闭延迟扩展来解决。

您的效率也很低 - 没有必要在FOR循环中使用TYPE。您可以直接让FOR读取文件。 (除非文件是unicode)

您可以采取上述所有建议,但有一个很多更简单的解决方案: - )

编辑 - 为处理以\

结尾的路径而进行的更改
@echo off
set "InputFile=somar.txt"
for /f "usebackq eol=: delims=" %%A in ("%inputFile%") do (
  for %%F in ("%%A\.") do echo folder: %%~nxF
)

~nx FOR变量修饰符直接为您提供路径末尾的名称和扩展名。从命令行键入HELP FOR以阅读FOR变量可用的所有修饰符。

答案 1 :(得分:0)

  

对于变量文件名:

@Echo OFF

:: By Elektro H@cker

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 H@cker

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

答案 2 :(得分: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