Windows批处理:如何删除文件夹名称的最后部分

时间:2014-03-06 11:58:13

标签: batch-file

在批处理文件中,我得到一个文件夹,其中包含一个下划线数量未知的子文件夹列表,例如:

a_b_10

c_d_e_2

f_17

我需要删除名称的最后一个标记,即

a_b

c_d_e

f

由于

6 个答案:

答案 0 :(得分:2)

您可以尝试使用下划线获取最后一部分,然后将其从字符串中删除,但这只适用于最后一部分是唯一的。

在你的样本中,尽管有其他部分,但最后一部分似乎总是一个数字 这使用技巧来解析字符串的一部分,方法是用换行符替换分隔符。

@echo off
setlocal EnableDelayedExpansion
set LF=^


for /F "delims=" %%X in ('dir /b /AD') do (
    call :removeLastPart "%%~X"
)
exit /b

:removeLastPart
set "str=%~1"
for %%L in ("!LF!") DO (
  for /F "delims=" %%P in ("!str:_=%%~L!") do set "last=%%P"
)
echo The last part is '!last!'

REM ** now remove the last part by replacing with nothing **
set "str=!str:_%last%=!"
echo !str!
exit /b

答案 1 :(得分:2)

@echo off
set "root_dir=C:\scriptests"
setlocal enableDelayedExpansion
for /f %%d in ('dir /b /a:d *_*') do (
     call :lastindexof "%%d" _ lio
     set "f_name=%%~d"
     echo renaming  !f_name! 
     for %%S in (!lio!) do ren !f_name! !f_name:~0,%%S!

)
endlocal



exit /b 0
:lastindexof [%1 - string ; %2 - find last index of ; %3 - if defined will store the result in variable with same name]
@echo off
setlocal disableDelayedExpansion 


set "str=%~1"
set "splitter=%~2"

set LF=^


rem ** Two empty lines are required
setlocal enableDelayedExpansion
for %%L in ("!LF!") DO (
    for /f "delims=" %%R in ("!splitter!") do ( 
        set "var=!str:%%R=%%L!"
    )
)

for /f  delims^=^" %%P in ("!var!") DO ( 
    set "last_part=%%~P"  
)



if "!last_part!" equ ""  if "%~3" NEQ "" (
 echo "not contained" >2 
 endlocal
 set %~3=-1 
 exit
) else (
 echo "not contained" >2 
 endlocal
 echo -1 
)


call :strlen0.3 str strlen 
call :strlen0.3 last_part plen 
call :strlen0.3 splitter slen 

set /a lio=strlen-plen-slen
endlocal & set lio=%lio%
endlocal & if "%~3" NEQ "" (set %~3=%lio%) else echo %lio%
exit /b 0

:strlen0.3  StrVar  [RtnVar]
  setlocal EnableDelayedExpansion
  set "s=#!%~1!"
  set "len=0"
  for %%A in (2187 729 243 81 27 9 3 1) do (
    set /A mod=2*%%A
    for %%Z in (!mod!) do (
        if "!s:~%%Z,1!" neq "" (
            set /a "len+=%%Z"
            set "s=!s:~%%Z!"

        ) else (
            if "!s:~%%A,1!" neq "" (
                set /a "len+=%%A"
                set "s=!s:~%%A!"
            )
        )
    )
  )
  endlocal & if "%~2" neq "" (set %~2=%len%) else echo **%len%**
exit /b

答案 2 :(得分:2)

此解决方案将创建"renfolders.bat.txt"文件供您签入记事本,如果您对它感到满意,则将其作为批处理文件运行。

这使用名为repl.bat的帮助程序批处理文件 - 从https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat

下载

repl.bat放在与批处理文件相同的文件夹中或放在路径上的文件夹中。

dir *_* /b /s /ad |repl ".*\\(.*)_.*" "ren \q$&\q \q$1\q" xa >"renfolders.bat.txt"

答案 3 :(得分:1)

我刚刚想出了这个解决方案:

for /f %%f in ('dir /b /AD c:\MainFolder\') do (
    set var=%%f
    set var=!var:_= !
    set /a count=0
    for %%i in (!var!) do (set /a count+=1)
    set /a count2=0
    for %%i in (!var!) do (
        set /a count2+=1
        if /I !count2! equ 1 (set var2=%%i) else if not !count2! equ !count! (set var2=!var2!_%%i)
    )
    echo !var2!
)

答案 4 :(得分:1)

这是一种新颖的方法

对于名称中包含至少一个_的每个文件夹:

  • 创建一个名称相同的临时空文件
  • 重命名临时文件,在最终_
  • 之后删除所有内容
  • 将新名称读入变量
  • 从名称
  • 中剥离最终的_

有关重命名的工作原理的说明,请参阅How does the Windows RENAME command interpret wildcards?

@echo off
setlocal enableDelayedExpansion
set "loc=%temp%\removeToken"
md "%loc%"
for /d %%F in (*_*) do (
  copy nul "%loc%\%%F" >nul
  ren "%loc%\*" "*_"
  for %%A in ("%loc%\*") do set "new=%%~nxA"
  del /q "%loc%\*"
  echo old=%%F
  echo new=!new:~0,-1!
  echo(
)
rd "%loc%"

答案 5 :(得分:0)

已编辑 - 已发布错误的代码副本

它分隔目录名称的元素并迭代它们去掉最后一个元素

@echo off

    setlocal enabledelayedexpansion

    for /d %%a in (*_*) do (
        set "old=%%~na" & set "new=" & set "previous="
        for %%b in ("!old:_=" "!") do (
            if not defined previous ( 
                set "previous=%%~b" 
            ) else if not defined new (
                set "new=!previous!"
            ) else set "new=!new!_!previous!" 
            set "previous=%%~b" 
        )
        echo ren "%%~fa" "!new!"
    )

    endlocal