2

我在“APP_ENTITY_part___20120910.txt”格式的目录中有文件名

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

有没有一个好的网站可以指导我如何做到这一点?

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

4

3 回答 3

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

上述解决方案在 的第一次出现时截断___

名称 likePart1___Part2___Part3将导致Part1.

如果你想在最后一次出现时截断___并得到类似的结果Part1__Part2,那么解决方案会更复杂。

我使用搜索和替换更改___为文件夹分隔符,然后使用带有 ~p 修饰符的第二个 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
)
于 2012-09-10T21:17:13.097 回答
1

您可以安装Cygwin其他替代方法(包括适当的库,例如“重命名”程序)并使用此 SO 问题的前两个答案之一(粘贴在下面)。您可能希望在实现以下任一功能之前测试正则表达式和 glob:

rename 's/___(.*)\.txt/\.txt/' *_part___*.txt

或者

for f in *_part___*.txt; do mv $f $(echo $f | sed 's/___(.*)\.txt/\.txt/g'); done

于 2012-09-10T20:50:51.057 回答
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!
)
于 2012-09-14T19:56:04.813 回答