2014-03-06 83 views
2

在一個批處理文件,我得到的子文件夾列表的文件夾數目不詳的下劃線例如:DOS批處理:如何刪除文件夾名稱的最後部分

a_b_10 

c_d_e_2 

f_17 

我需要刪除的最後一個令牌名稱即

a_b 

c_d_e 

f 

感謝

+0

爲什麼你的問題中的所有目錄都在同一行上?閱讀起來並不容易。 – sashoalm

+0

哪裏是文件夾列表?在文本文件中還是在同一目錄? – npocmaka

+0

我做DIR/B/AD C:\ MainFolder \獲取文件夾 – grunt

回答

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! 
) 
+0

這一個我檢查... – grunt

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 
+0

感謝傑布的列表。大約與我的解決方案相同的長度,只是我的瓦特/ goto的。 – grunt

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 
+0

也不錯,有點長,但我找不到解釋 – jeb

+0

@jeb - 這個想法和你的想法幾乎一樣。它使用兩個子例程,一個用於字符串長度和一個標準lastindexof。可能是我應該在代碼中多加註釋。 – npocmaka

+0

謝謝npocmaka – grunt

0

編輯 - 代碼的錯誤的副本發佈

它的目錄名稱在他們discarting的元素和迭代分離最後一個元素

@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 
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%" 
1

該解決方案將創建"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" 
相關問題