用用户输入的文本替换文件/目录名称

时间:2021-01-04 23:35:08

标签: batch-file cmd batch-rename

首先我要声明我根本不是程序员。我是一名视频编辑和后期制作顾问,对简化繁琐的任务或保持每个项目的所有文件/文件夹结构的统一性很感兴趣。

我已经设法拼凑了一些 .bat 脚本来满足我需要的目的,但是在这个特殊的脚本上我遇到了一些障碍,谷歌搜索有点帮助,但主要是导致了更多混乱。

每当我们有一个新项目时,我都有一个批处理文件来创建项目目录和模板文件。

它要求用户首先输入项目编号,然后是项目名称。

然后它创建所有必要的目录并将文件和文件夹从模板文件夹复制到新创建的项目文件夹

到目前为止,所有这些都完美无缺。

但是,我现在希望使用用户之前输入的 %number% 重命名刚刚复制的模板文件夹和文件。

在我看来,这应该很简单

在刚刚创建的项目文件夹中找到“[项目编号]”的任何实例,并将其替换为 %number%

但我不知道如何进行这项工作。

感谢任何帮助。

这是我到目前为止的脚本(注意:我已经删除了多余的部分以减少混乱,以便在此处共享)

@echo off

echo >>SOME INSTRUCTIONS THAT THE USER WILL SEE<<

set /p number="Enter Project Number ONLY (ex. 21-000): " 
set /p project="Enter Project Name ONLY (ex. Test Project): "

MkDir "W:\2021-ASSETS\%number%_%project%-ASSETS\%number%-Adobe Projects\%number%-AE Projects\" 

PAUSE

copy "W:_GENERIC-Assets_Generic Templates\AE Project Template\[project number]-yymmdd.aep" "W:\2021-ASSETS\%number%_%project%-ASSETS\%number%-Adobe Projects\%number%-AE Projects\"

PAUSE

xcopy "X:_FILES for new projects" "X:\Projects\2021 Projects\%number%_%project%" /e

PAUSE

这就是我陷入困境的地方。

“新项目的_FILES”文件夹包含一个文件/文件夹结构,其名称类似于“音频-[项目编号]”、“图形-[项目编号]”等。我想让脚本的最后一部分找到 [项目编号] 的所有实例(无论是文件还是目录),并将其替换为用户在开始时输入的 %number%。

我知道我可以使用 Bulk Rename Utility 之类的东西,但我希望将重命名作为脚本的一部分,以确保它始终如一地完成。将使用它的人不是很专业,有时在改变事物时保持沉默,所以对他们来说越简单越好。 Bulk Rename Utility 的界面非常混乱,让他们不知所措,因为他们不知道自己是否做得正确。此外,它还为我们的项目创建过程增加了一个可能被错误忽略的额外步骤。

预先感谢您的帮助/建议。

另请注意,PowerShell 不是一个选项。有人在 reddit 上帮助了我,并为我提供了一个 PS 脚本,但公司的 IT 政策标记/阻止了它并且不让我测试它。 IT 说他们可以为我提供一个例外来运行它,但这也意味着我将是我们团队中唯一有权运行 PS 脚本的人。这不是一个选项。

1 个答案:

答案 0 :(得分:0)

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION 
rem The following settings for the source directory, destination directory, target directory,
rem batch directory, filenames, output filename and temporary filename [if shown] are names
rem that I use for testing and deliberately include names which include spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.

SET "targetdir=u:\your files"

rem constant strings

SET "projectnumber=[project number]"

rem data that has been entered

SET "number=12345"


FOR /f "delims=" %%a IN (
 'dir /b /s "%targetdir%\*%projectnumber%*" '
 ) DO (
 SET "namestring=%%~nxa"
 SET "newnamestring=!namestring:%projectnumber%=%number%!"
 ECHO REN "%%a" "!newnamestring!"
)

请注意 delayedexpansion 的使用允许 !var! 访问变量 var 的值,因为它在 for 循环执行期间发生变化。请注意,%var% 在遇到循环时访问 var 的值。有很多关于此的 SO 文章 - 只需使用 search 工具即可。

for 循环分析在定义为 dir 的目录下找到的所有文件和目录的 targetdir 列表,这些文件和目录与名称掩码 *%projectnumber%* = 匹配,即包含定义为之前已建立的 projectnumber 的字符串。

SO 上的标准做法是对字符串使用语法 set "var=value" 分配,因为这可确保忽略行上的杂散尾随空格。对于您的 set /p,请使用,例如 set /p "project=Enter Project Name ONLY (ex. Test Project): "

delims= 选项确保将整个文件/目录名分配给 %%ametavariable

%%a (%%~NXa) 中值的 Name 和 eX 张力部分是分配给变量 namestring,因为下一步必须应用于变量,而不是元变量。

通过将 newnamestring 设置为 namestring (!namestring!) 的 current 值但在替换定义为 projectnumber (%projectnumber% ) 定义为 number

然后 ECHO 所需的 ren 命令。 Ren 重命名文件或目录,但新名称可能只包含名称和扩展名部分,而不包含驱动器和路径。

因此,在运行此代码后,您会发现它会向它打算执行的重命名 屏幕发出报告。这是手动检查命令是否合适的安全措施。如果一切都符合 Hoyle,请删除 echo 关键字并应用重命名。

注意:批处理通常不区分大小写,因此 NX 可以在任何情况下使用。唯一常见的例外是元变量 a,它必须在相同的情况下始终如一地引用相同的元变量。

相关问题