Windows批处理脚本用于确定路径列表中的最后一个文件夹

时间:2015-03-17 01:54:47

标签: windows batch-file

我想从文件中读取路径列表,并确定每次最后一个文件夹。我发现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

2 个答案:

答案 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