我想从文件中读取路径列表,并确定每次最后一个文件夹。我发现something to start with失败,读取了处理嵌套for循环和变量扩展的各种线程但是没有成功。我没有得到一个"最后一个文件夹:"响应。 有人在这看到问题吗?非常感谢任何帮助!
外部文件(paths.txt):
C:\FirstFolder\NextFolder\LastFolder
C:\Somewhere\Deeper\FinallyThere
C:\Temp
Windows批处理脚本:
@echo OFF
setLocal EnableDelayedExpansion
for /F "tokens=* eol=#" %%f in (%CD%\paths.txt) do (
echo Get new path from file: %%f
set mydir=%%f
set m=%mydir:\=;%
call :GET_SYMLINK %%m
)
setLocal DisableDelayedExpansion
goto :eof
:GET_SYMLINK
for /F "tokens=* delims=;" %%i IN (%1) DO call :LAST_FOLDER %%i
goto :eof
:LAST_FOLDER
if "%1"=="" (
echo Last folder: %LAST%
goto :eof
)
set LAST=%1
SHIFT
goto :LAST_FOLDER
答案 0 :(得分:0)
@echo OFF
setLocal EnableDelayedExpansion
for /F "tokens=* eol=#" %%f in (%CD%\paths.txt) do (
echo Get new path from file: %%f
set mydir=%%f
)
set m=%mydir:\=;%
call :GET_SYMLINK %m%
在块语句(a parenthesised series of statements)
中,解析整个块并执行然后。块中的任何%var%
将在解析块时被该变量的值替换 - 在块执行之前 - 同样的事情适用于{{1 }}
因此,FOR ... DO (block)
将在遇到IF (something) else (somethingelse)
时使用%variables%
的值执行。
解决此问题的两种常见方法是1)使用IF
并使用setlocal enabledelayedexpansion
代替!var!
来访问已更改的%var%
或2}值以进行调用一个子程序,用于使用更改的值执行进一步处理。
因此,使用var
替换循环中%
设置中的m
可以解决问题 - 部分。
下一个!
是指matavariable(循环控制变量)%%m
- m
是指环境变量%m%
,但是在原始循环中值,m
为循环更改时的值。
接下来的问题是,由于您要用!m!
替换\
并且;
是一个分隔符,要将其作为参数传递给子例程,您需要"用双引号括起来。"然后,如果您需要,可以在子例程中使用;
删除这些双引号。
就个人而言,我将子字符串移动到子例程,因为%~1
将包含该行。既然你说你想要文件的最后一行,那么在循环结束时,mydir
将包含最后一行,所以没有必要为每一行做一个子程序 - 只需一次结束就足够了。
我不确定你的子程序是做什么的,所以我不会对这些做出评论。
答案 1 :(得分:0)
我担心你不清楚你想要的结果是什么,但如果是这样的话:
LastFolder
FinallyThere
Temp
...然后这个批处理文件得到了它:
@echo off
for /F %%a in (paths.txt) do echo %%~Na
有关详细信息,请键入for /?
并阅读有关" FOR变量修饰符"的说明。
如果路径可能包含空格,请包含" delims ="以这种方式选择:
for /F "delims=" %%a in (paths.txt) do echo %%~Na