批量重命名为替换子字符串

时间:2014-06-08 12:58:54

标签: batch-file replace substring rename

你好:)当朋友给你一个mp3文件时,大多数情况下,标题是这样命名的:" avenged_sevenfold _-_ buried_alive.mp3"。我想创建一个脚本,允许我通过替换" _"来重命名当前库的每个文件和文件夹。 by" "(空间)。这是非常长的手动重命名每个文件;我的脚本在这里:

@echo off
title Merci qui ?
:debut
echo do you want to rename every files/foldes by replacing "_" by " "? (y/n)
set /p choix=


if %choix%==y (
goto renomage)

if %choix%==n (
goto end)

goto debut

:renomage

set /a x=1 :pointeur de fichier

set /a compteurA=0
set /a compteurB=0
for /f %%a in ('dir /b /a:-d *.*') do set /a compteurA+=1   
for /f %%a in ('dir /b /a:d *.*') do set /a compteurB+=1
echo %compteurA% fichiers %compteurB% dossiers
set /a n=compteurA+compteurB

echo number of folder/files batch included %n%


:while1 
if %x% GTR %n% goto prochain1 

set Strin=???name?ofthe?dossier?number?x?????????????
for /f "tokens=1,* delims=[,]" %%A in ('"%comspec% /u /c echo:%Strin%|more|find /n /v """') do          `set /a l=%%A-4`
echo Le nom contient %l% lettres.

:leftspace

set Strin=%Strin:_= %

set str=%Strin:~0,1%

if %str% EQU " "( 
set Strin=%Strin:~1,%l%-1%
goto leftspace)


SET /A x +=1
goto while1
:prochain1
echo Success ! (or not) 
pause
:end

我只需要帮助这条线:

set Strin=???name?ofthe?dossier?number?x?????????????

否则剩下的应该没问题。如果你有批评或某事,请继续=)

2 个答案:

答案 0 :(得分:0)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
FOR %%f IN (ad a-d ) DO FOR /f "delims=" %%a IN (
  'dir /b /s /%%f "%sourcedir%\*" '
  ) DO CALL :chgnam %%a

GOTO :EOF

:chgnam
SET "name=%*"
SET "newname=%name:_= %"
IF "%newname%" neq "%name%" ECHO REN "%name%" "%newname%"

GOTO :eof

为了测试目的,所需的REN命令仅为ECHO在您确认命令正确之后,将ECHO(REN更改为REN以实际重命名文件和目录。目录首先被重命名。

您需要更改sourcedir以指向所需目录。树中包含_的所有文件和目录都将被重命名 - 如果可以重命名它们。

[修订和更正版本]

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
PUSHD "%sourcedir%"
FOR %%f IN (ad a-d ) DO FOR /f "delims=" %%a IN (
  'dir /b /s /%%f "%sourcedir%\*" '
  ) DO CALL :chgnam "%%a" "%%~nxa"
POPD

GOTO :EOF

:chgnam
SET "name=%~2"
SET "newname=%name:_-_=-%"
SET "newname=%newname:_= %"
IF "%newname%" neq "%name%" ECHO(REN "%~1" "%newname%"

GOTO :eof

原始版本会显示不正确的ren语法(新名称可能不包含路径)

如果要在当前目录上运行,只需将sourcedir的值设置为单个点。

答案 1 :(得分:0)

此解决方案由Chris Hoffman从How to Batch Rename Files in Windows: 4 Ways to Rename Multiple Files重新发布

PowerShell为在命令行环境中重命名文件提供了更大的灵活性。使用PowerShell,您可以将一个命令的输出(在PowerShell术语中称为“命令行开关”)传递给另一个命令,就像在Linux和其他类UNIX系统上一样。

Open PowerShell ISE

首先,打开Powershell ISE,然后导航到包含您要使用此命令重命名的文件和文件夹的目录(文件夹):

cd "C:\your\directory\"

Navigate to your folder

您需要的两个重要命令是Dir,它列出当前目录中的文件,以及Rename-Item,它重命名一个项目(在本例中为文件)。将Dir的输出传递给Rename-Item,您就可以了。

启动PowerShell ISE后,使用cd命令输入包含文件的目录。您应该将文件放在它们自己的目录中,这样就不会意外地重命名其他文件。

例如,假设我们不希望文件名中包含下划线字符 - 我们宁愿使用空格。

以下命令列出当前目录中的文件,并将列表管道为Rename-Item。 Rename-Item用空格替换每个下划线字符。

Dir | Rename-Item –NewName { $_.name –replace "_"," " }

替换" _"和" "用于替换文件名中其他字符的命令部分。

如果您需要帮助执行其他更高级的操作,请咨询Microsoft’s documentation on the Rename-Item commandlet