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