在文件名中的分隔符后删除所有字符

时间:2012-09-10 20:37:05

标签: batch-file dos

我在目录中的文件名格式为“APP_ENTITY_part ___ 20120910.txt”

我想在3个下划线之后删除所有内容并保留文件名的第一部分。

是否有一个好的网站可以指导我如何实现这一目标?

或者,也许你们中的一位批处理专家可以带领我如何做到这一点?

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)

您可以安装Cygwinsome 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!
)