我在目录中的文件名格式为“APP_ENTITY_part ___ 20120910.txt”
我想在3个下划线之后删除所有内容并保留文件名的第一部分。
是否有一个好的网站可以指导我如何实现这一目标?
或者,也许你们中的一位批处理专家可以带领我如何做到这一点?
答案 0 :(得分:6)
有一个非常简单的解决方案,它使用变量扩展搜索和替换来注入REM命令。
@echo off
setlocal
for %%F in (*) do call set "var=%%F" & call :procName
exit /b
:procName
::truncate at the 1st occurance of ___
set "var=%var:___="&rem %
::print the result
set var
exit /b
关键线是set "var=%var:___="&rem %
假设var = Part1 ___ Part2
替换后,该行变为:set "var=Part1"&rem Part2
上述解决方案在___
首次出现时截断。
Part1___Part2___Part3
之类的名称会产生Part1
。
如果要截断___
的最后一次出现并获得Part1__Part2
之类的结果,则解决方案会更复杂。
我使用搜索和替换将___
更改为文件夹分隔符,然后使用~p修饰符将第2个FOR更改为去除最后一部分,然后搜索并替换以恢复前导___
定界符(一个或多个)。
@echo off
setlocal disableDelayedExpansion
for %%F in (*) do (
set "var=%%F"
setlocal enableDelayedExpansion
set "var2=!var:___=\!"
if "!var2!" neq "!var!" for %%A in ("\!var2!") do (
endlocal
set "var=%%~pA"
setlocal enableDelayedExpansion
set "var=!var:~1,-1!"
set "var=!var:\=___!"
)
echo var=!var!
endlocal
)
答案 1 :(得分:1)
您可以安装Cygwin或some alternative(包含正确的库,例如“重命名”程序),并使用this SO question中的前两个答案之一(粘贴在下面)。在实现以下任何一个之前,您可能希望测试正则表达式和globs:
rename 's/___(.*)\.txt/\.txt/' *_part___*.txt
或
for f in *_part___*.txt; do mv $f $(echo $f | sed 's/___(.*)\.txt/\.txt/g'); done
答案 2 :(得分:0)
一个简单的单行解决方案:
set DirNam=%DirNam:~,-12%
如果您只是从名称末尾剥离4个下划线加上日期____YYYYMMDD
,这将对您有用。
执行此操作可能会解析其他目录名称:
setlocal enabledelayedexpansion
for /d %%x in (*____????????) do (
set DirNam=%%x
set DirNam=!DirNam:~,-12!
echo %%x is now !DirNam!
)