0

I am trying to rename files after the user inputs a string they want to remove from the file name. This works fine except when I want to rename files that are in a different location than the script:

Here is what i have so far which works if I dont specific the file path (e.g. remove C:\DATABASE\*.* /s)

SET /P X=Type in the String that you want to remove and then press ENTER: 

set deletestring=%X%
for /f "delims==" %%F in ('dir C:\DATABASE\*.* /s /b ^| find "%deletestring%"') do (
    set oldfilename=%%F
    set newfilename=!oldfilename:%deletestring%=!
    Ren "!oldfilename!" "!newfilename!"
    )

Thanks!

4

2 回答 2

0

改用这个。例如:

remove *.*

或者

remove "relative path\*.*"

或者

remove C:\DATABASE\*.*

或者

remove "C:\My Database\2010-*.bak"

这意味着必须指定目录和文件掩码。这是remove.bat文件:

@echo off
setlocal enabledelayedexpansion
set mask=%~1
set mask=!mask:%~dp1=!
if not exist "%~1" (
    echo No files found
    goto :eof
)
pushd "%~dp1"

SET /P X=Type in the String that you want to remove and then press ENTER: 

set deletestring=%X%
for /f "delims==" %%F in ('dir "%mask%" /s /b ^| find "%deletestring%"') do (
    set oldfilename=%%F
    set newfilename=!oldfilename:%deletestring%=!
    Ren "!oldfilename!" "!newfilename!"
)
于 2012-08-17T10:15:02.160 回答
0

您遇到的主要问题是 REN 的第一个参数可以接受完整的路径信息,但第二个参数只能包含没有路径信息的新名称。您可以使用~nx修饰符从 FOR /F 命令报告的完整路径中提取名称和扩展名。

您的 FOR /F 选项不可靠 - 如果文件名包含=. 您想将 delims 设置为空。

这个问题实际上比最初看起来要复杂得多。您的代码将尝试重命名文件和目录。如果要重命名目录,则必须以反向 alpha 顺序重命名,因为整个列表是在重命名任何内容之前构建的。如果您以正常的 alpha 顺序处理并重命名目录,则将找不到该目录中的后续条目。

IN() 子句中的 FIND 过滤器不是必需的。理想情况下,您的过滤器应该只匹配文件或目录名称,而不是路径。这是可行的,但有点棘手。我会简单地跳过 IN() 子句中的过滤并在 DO 子句中进行。

文件或目录名称可以包含!字符。!但是如果 FOR 变量扩展包含并启用延迟扩展,它将被破坏。可以通过在循环内打开和关闭延迟扩展来避免该问题。

搜索和替换可能会删除整个名称,但您不能将文件重命名为空。所以我添加了一个测试以确保留下一个名字。

setlocal disableDelayedExpansion
SET /P "X=Type in the String that you want to remove and then press ENTER:"
for /f "delims=" %%F in ('dir C:\DATABASE\* /s /b ^| sort /r') do (
  set "old=%%F"
  set "file=%%~nxF"
  setlocal enableDelayedExpansion
  set "new=!file:%X%=!"
  if defined new if !new! neq !file! ren "!old!" "!new!"
  endlocal
)

如果您真的不想重命名目录,则需要添加 /AD 选项。我首先认为您可以使用 FOR /R 语句,但这可能会导致同一个文件被重命名两次。FOR /F 在处理任何文件之前缓冲整个结果集,但 FOR /R 不会。

setlocal disableDelayedExpansion
SET /P "X=Type in the String that you want to remove and then press ENTER:"
for /f "delims=" %%F in ('dir C:\DATABASE\* /s /b /a-d') do (
  set "old=%%F"
  set "file=%%~nxF"
  setlocal enableDelayedExpansion
  set "new=!file:%X%=!"
  if defined new if !new! neq !file! ren "!old!" "!new!"
  endlocal
)
于 2012-08-18T04:55:59.547 回答