【问题标题】:Create .BAT file to rename files in current directory with input创建 .BAT 文件以使用输入重命名当前目录中的文件
【发布时间】:2016-04-11 11:29:20
【问题描述】:

我正在尝试编写一个小的 .bat 脚本(编程知识有限),它允许用户输入当前版本号(例如 01)和新版本号(例如 02)的值,然后在里面使用这两个数字重命名命令。

echo off
cls
TITLE Version Updater
echo Use this script to update file names. This works similar to find and replace in other programs.
echo[
echo Enter the current version number (01 for example)
echo off
set /p current="Current Version: "
echo[
echo Enter the new version number (01 becomes 02 etc.)
echo off
set /p new="New Version: "
echo[
echo You will be updating all occurences of "%current%" in your file names to "%new%", if this is correct then continue, if not close this window.
pause
cd %CD%
rename *%current%* *%new%*
pause

我认为代码几乎是正确的,我只是在让它引用运行它的当前目录时遇到了麻烦。我正在与计算机技能有限的人一起使用此脚本,而且我不是网络管理员,所以我无法真正做任何太深入的事情。

如果有人可以帮我调整一下,那就太好了。

干杯,

垫子

编辑 1 - 评论回复 例如,test_01.tab 更改为 test_02.tab。它基本上将替换文件名的所有_01部分并将它们更改为_02。在这种情况下,current = 01 和 new = 02。但是文件名都不同,所以你可能要更改 test_01.bat、testing_01.bat,所以我认为只需将 01 重命名为 02 即可。

编辑 2 - 当前代码 这要感谢下面的 Stephan,我相信它唯一需要正常工作的就是从 REN 命令的第二部分中删除文件路径,以便它只有文件和扩展名,它应该可以工作。

@pushd %~dp0
@Echo off
CLS
setlocal enabledelayedexpansion
set /p current="Current Version: "
set /p new="New Version: "

for /R %%a in (*_%current%*) do (
  set "Name=%%~a"
  ren "%%~a" "!Name:_%current%=_%new%!"
)
pause

编辑 3 - 最终代码(工作,耶!)

@pushd %~dp0
@echo off
cls
TITLE CEF File Version Updater
echo This script will update CEF file versions for TLS rejections (E.G. 4XXX_XX_1 to 4XXX_XX_2). Backup files prior to running this script as a safety measure.
echo[
echo Enter the current version number (no underscore)
echo off
set /p current="Current Version: "
echo[
echo Enter the new version number (no underscore)
echo off
set /p new="New Version: "
echo[
echo You will be updating all occurences of "_%current%" in your file names to "_%new%", is this correct?

SET /P ANSWER=Do you want to continue (Y/N)? 
if /i {%ANSWER%}=={y} (goto :yes) 
if /i {%ANSWER%}=={yes} (goto :yes) 
goto :no 
:yes 

rename *_%current%.* *_%new%.*
CLS
echo Renaming is complete, please check the new file names are correct.
pause 
exit /b 0 

:no  
exit /b 1

【问题讨论】:

  • 你能举例说明它应该做什么吗?例如,它应该重命名的文件名是什么? %current% 和 %new% 可能是什么...?
  • 例如 test_01.tab 更改为 test_02.tab。它基本上将替换文件名的所有_01部分并将它们更改为_02。在这种情况下,current = 01 和 new = 02。但是文件名都不同,所以你可能要更改 test_01.bat、testing_01.bat,所以我认为只需将 01 重命名为 02 即可。跨度>
  • 请通过编辑您的帖子将此附加信息放入问题中!
  • 进行了大量测试并为您找到了解决方案。将其发布为答案。

标签: batch-file command


【解决方案1】:
@Echo off
setlocal enabledelayedexpansion
set /p current="Current Version: "
set /p new="New Version: "

for /R %%a in (*_%current%.*) do (
  set "Name=%%~nxa"
  ECHO ren "%%~a" "!Name:_%current%=_%new%!"
)
pause

(去掉ECHO,如果输出满意的话)

【讨论】:

  • 为了回应我在下面所说的,我尝试了这个,它产生了有趣的结果。出现的前 3 个 ren 用于 Users\Business\AppData\Roaming\ 中的随机文件,依此类推......但第 4 个在我有这个的桌面上的 Test 文件夹中。我只是将脚本拖到cmd中,我想知道它是否对它的位置感到困惑
  • 只需添加一个cd /d "c:\my test folder"
  • 有没有办法让我不必把它变成硬编码的东西?这个脚本将在很多不同的地方使用。我有点希望它可以运行然后工作
  • 它应该如何知道要处理哪个位置?文件夹,脚本存储在哪里? cmd 窗口的当前工作目录?还有什么?
  • 这里没有语法错误。是否有带有感叹号 (!) 的文件?这可能会破坏语法
【解决方案2】:

这应该可以解决问题。

@Echo off
set /p current="Current Version: "
set /p new="New Version: "

for /R "c:\your location" %%a in (*_%current%.*) do (
ren *_%current%.* *_%new%.*
)
pause

下面是在几个测试文件上运行脚本之前和之后。

【讨论】:

  • 嘿,Mads,我尝试了这段代码,得到了以下回报。当前版本:01,新版本:02,系统找不到指定的文件。该系统找不到指定的文件。该系统找不到指定的文件。按任意键继续...
  • 这很奇怪。当我们说话时,我正在我的电脑上运行脚本,它就像一个魅力。如果您复制粘贴我的确切脚本并重试,它会给您相同的结果吗?以管理员身份运行脚本或者在脚本中的 Echo off 下方添加 setlocal enabledelayedexpansion 可能是一个想法...?
  • Hrm,所以在我将 .bat 文件拖到 cmd 窗口中并进行操作之前,我尝试从文件夹中以管理员身份运行它,它只是询问版本和然后什么也没做。我认为可能值得一看的一个想法是,当我尝试上面 Stephan 的另一条评论时,它为目录提供的回显输出是 Users\Business\AppData\Roaming\TS3Client\logs\ts3client_20etc.log....可能将 .bat 拖入 cmd 的问题?
  • 您也可以尝试将您的位置添加到脚本中,如下所示:for /R "c:\your location" %%a in,然后其余部分如我的回答所示。我更新了我的答案。请注意,脚本必须 1) 位于您要编辑文件的文件夹中或 2) 您必须指定脚本在脚本中的运行位置。
猜你喜欢
  • 1970-01-01
  • 2017-11-20
  • 2014-06-07
  • 2014-07-05
  • 2012-06-20
  • 1970-01-01
  • 2013-10-25
  • 2020-02-03
  • 2011-05-25
相关资源
最近更新 更多