在一個批處理文件,我得到的子文件夾列表的文件夾數目不詳的下劃線例如:DOS批處理:如何刪除文件夾名稱的最後部分
a_b_10
c_d_e_2
f_17
我需要刪除的最後一個令牌名稱即
a_b
c_d_e
f
感謝
在一個批處理文件,我得到的子文件夾列表的文件夾數目不詳的下劃線例如:DOS批處理:如何刪除文件夾名稱的最後部分
a_b_10
c_d_e_2
f_17
我需要刪除的最後一個令牌名稱即
a_b
c_d_e
f
感謝
我只是想出了這個解決方案:
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!
)
這一個我檢查... – grunt
你可以嘗試用下劃線來獲得最後一部分,然後從字符串中刪除這一點,但在最後一部分是獨一無二的這僅適用。
在你的樣品最後一部分似乎總是不顧其他部件的數量。
它使用的伎倆,通過一個換行符替換分隔符解析字符串的一部分。
@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
感謝傑布的列表。大約與我的解決方案相同的長度,只是我的瓦特/ goto的。 – grunt
@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
編輯 - 代碼的錯誤的副本發佈
它的目錄名稱在他們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
這裏是一種新穎的方法
對於含有至少一種_
在名稱中的每個文件夾中:
_
_
有關的命名是如何工作的說明,請參閱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%"
該解決方案將創建"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"
爲什麼你的問題中的所有目錄都在同一行上?閱讀起來並不容易。 – sashoalm
哪裏是文件夾列表?在文本文件中還是在同一目錄? – npocmaka
我做DIR/B/AD C:\ MainFolder \獲取文件夾 – grunt