2012-04-16 189 views
2

我在一个文件夹中有一堆文件,我想通过.bat或.vbs脚本(或类似的文件)进行复制和重命名。该文件被命名为这样:Windows批处理脚本,从文件名中删除括号中的文本?

ABC-DE-(XXX)SomeNameHere.dat 

我想副本文件并重新命名,去掉(XXX)的部分,留下简单:

ABC-DE-SomeNameHere.dat 

有一个kind-类似的问题的答案here但我不能修改它为上述文件名模式工作,也只是重命名文件,不复制它们。

任何帮助非常感谢!非常感谢。


编辑:发布以下(可怕!)代码。可能最好忽略这个; _;

@ECHO OFF 
FOR %%F IN ("ABC-DE-(*)*.dat") DO CALL :process "%%F" 
GOTO :EOF 

:process 
SET oldname=%1 
SET "newname=%~nx1" 
SET "newname=%newname:*] =%" 
RENAME %oldname% "%newname%" 
+0

让我们看看你写的代码,并告诉我们你得到错误...那么我们可以帮你做这行得通。 – aphoria 2012-04-16 17:11:00

+0

@aphoria完成,但它非常无用。我的批处理脚本知识是非常基本的。 – 2012-04-16 17:13:51

回答

2

你对自己太难了。你的代码比你想象的更接近。

@ECHO OFF 
FOR %%F IN ("ABC-DE-(*)*.dat") DO CALL :process "%%F" 
GOTO :EOF 

:process 
SET oldname=%1 
SET "newname=%~nx1" 
SET "newname=%newname:*)=ABC-DE-%" 
RENAME %oldname% "%newname%" 

以上可以通过使用延迟扩展

@ECHO OFF 
SETLOCAL EnableDelayedExpansion 
FOR %%F IN ("ABC-DE-(*)*.dat") do (
    SET name=%%~nxF 
    REN "%%F" "!name:*)=ABC-DE-!" 
) 

上述延迟扩展的解决方案比使用CALL更有效的缩短

@ECHO OFF 
FOR %%F IN ("ABC-DE-(*)*.dat") DO CALL :process "%%F" 
GOTO :EOF 

:process 
SET "name=%~nx1" 
REN %1 "%name:*)=ABC-DE-%" 

可以消除对CALL的需要,但如果文件名包含!,将会失败,因为%% F扩展会被延迟扩展损坏。这可以通过在循环中打开和关闭延迟扩展来解决。

@ECHO OFF 
FOR %%F IN ("ABC-DE-(*)*.dat") do (
    SET oldName=%%F 
    SET newName=%%~nxF 
    SETLOCAL EnableDelayedExpansion 
    REN "!oldName!" "!newName:*)=ABC-DE-!" 
    ENDLOCAL 
) 
+0

非常好,谢谢! – 2012-04-16 20:12:05

0

如果你的文件命名模式是一致的,你可以使用这个:

for /f "tokens=1-3 delims=)(" %%a in ('dir /b') do @rename "%%a(%%b)%%c" "%%a-%%c" 
+0

1)更安全地使用''tokens = 12 *“'2)使用''dir/b”ABC-DE - (\ *)\ *。dat“''3)从重命名命令的最后一个参数中删除'-' 。 – dbenham 2012-04-16 20:31:03

+0

嗯。 1)不同意。不知道为什么这更安全,如果你知道你的解析原始字符串将变成三个变量。使它过于复杂。 2)不同意。好的生产 - 但对于概念,使其不必要的复杂。 3)同意 - 我用它来进行测试以提高可读性,并且应该将其删除。 – RobW 2012-04-16 22:40:30

+0

第1点 - 如果使用“tokens = 1-3”,文件名的一部分将被截断,并且文件名恰好包含两个或多个括号对。我意识到你在“如果你的文件命名模式一致”的前提下解决了你的解决方案。但是如果意外地在多个文件上运行,损害会更小。我不明白“令牌= 12 *”比“令牌= 1-3”更复杂吗? – dbenham 2012-04-16 22:51:46

相关问题