3

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

4

3 回答 3

2

你有很多问题:

1) 你的 FOR 循环在你发出 GOTO 的那一刻就被打破了。在 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
)

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

于 2012-12-06T11:56:21.563 回答
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
于 2012-12-06T22:29:55.327 回答
0

InputFile 内容必须包含文件名或文件夹。
前任)

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

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

我的代码是:

SETLOCAL EnableDelayedExpansion

设置最后一个文件夹=
SET InputFile=somar.txt

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

转到:EOF


:: ******************** 内批
:__GetFolderName
IF "%~x1"=="" SET lastFolder=%~n1 & GOTO :EOF

SET dp=%~dp1

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

转到:EOF
:: ********************

本地化

结果是:

最后一个文件夹:Test1
最后一个文件夹:Test2
最后一个文件夹:Test3
于 2014-05-12T07:24:48.663 回答