使用windows cmd从文件名中删除字符串

时间:2018-04-23 17:53:12

标签: regex batch-file cmd

修改 谢谢你们, Magoo技巧修复它,我使用以下代码:

echo off
cls
setlocal enabledelayedexpansion

for %%f in (*.mov) do (
    set name=%%~nf
    set new_name=!name:*_= !
    echo File renamed from: !name!.mov to:!new_name!.mov
    rename %%f !new_name!.mov
)

仅当文件名为something_file_name.mov时才有效。如果原始文件只是file_name.mov,我最终只有name.mov 所以使用REGEX是最好的选择。 我使用了Ben Personick和Squashman的调整版本。

@echo off
cls
SET "_Regex=^[0-9]*_"

FOR %%F IN (*.mov) DO (
    ECHO.%%~nF | findstr /R "%_Regex%" >nul && (
        FOR /F "Tokens=1* Delims=_" %%f IN ("%%~nxF") DO (
            MOVE /Y "%%F" "%%g"
        )
    )
)

我有一些名为3424_file_name.mov的文件,需要删除这些数字,直到第一个_所以得到file_name.mov 更好的是设置一个范围来删除像[0-9] 喜欢在cmd windows 7中这样做。这是我到目前为止所做的,但不起作用。

cls
setlocal enabledelayedexpansion

for %%f in (*.mov) do (
 set name=%%~nf
 set new_name=%name%:*_=x
 echo %new_name%)
 rename %%f %new_name%.mov
 )

由于 亚历

3 个答案:

答案 0 :(得分:2)

这样做是必要的。

注意我如何使用MOVE / Y以防文件是只读的,因为重命名无法处理重命名只读文件。

SETLOCAL
ECHO OFF

SET "_Regex=^[0-9][0-9]*_.*"
SET "_FileGlob=*_*.Mov"
SET "_FilePath=C:\Path"

FOR %%F IN ("%_FilePath%\%_FileGlob%") DO (
    ECHO.%%~nF | FINDSTR /R "%_Regex%" >NUL && (
        FOR /F "Tokens=1* Delims=_" %%f IN ("%%~nxF") DO (
            MOVE /Y "%%~F" "%%~dpF%%~g"
        )
    )
)
ENDLOCAL

答案 1 :(得分:1)

如果您使用FOR /F命令,则可以使用下划线。这将允许您将文件名分解为两个变量。

@echo off

for /F "tokens=1* delims=_" %%G in ('dir /a-d /b *.mov ^|findstr /RC:"^[0-9][0-9]*_"') do (
    rename "%%~G_%%~H" "%%~H"
)

答案 2 :(得分:0)

这是PowerShell中的一个更简单的任务。例如:

Get-ChildItem *.mov | ForEach-Object {
  $fileName = $_.Name
  if ( $fileName -match '^[0-9]+_' ) {
    $newName = $fileName -replace '^[0-9]+_', ''
    Rename-Item $fileName $newName
  }
}

正如其他人评论的那样,这可以重新设计为更短,更高效。例如:

Get-ChildItem *.mov |
  Where-Object { $_.Name -match '^\d+_' } |
  Rename-Item -NewName ($_.Name -replace '^\d+_','')

此处的目的是说明PowerShell如何比cmd.exe批处理脚本更强大和灵活。