【问题标题】:Windows batch file copying/renaming filesWindows批处理文件复制/重命名文件
【发布时间】:2014-09-13 11:31:46
【问题描述】:

我一直在努力创建一个批处理文件,它将文件从一个目录移动到另一个目录,如果文件名已经存在,请重命名它然后将其移动。

我对创建批处理文件真的很陌生,所以这就是我目前所拥有的

set temp=C:\Users\Daniel\Desktop\a\a1
set dir=C:\Users\Daniel\Desktop\a\
set /a "counter=0"
set "duplicate=-copy^("
set "bracket=^)"

if exist "%temp%" ( ^
for %%i in (%temp%\*) ^
do ^
if exist "%dir%\%%~ni%%~xi" ( call :checkFileName %%~ni %%~xi) ^
ELSE ( move %temp%\%%~ni%%~xi %dir% ) )^
ELSE ( echo doesnt exist)

:checkFileName
echo test
set fileName=%1
set fileExtenstion=%2
set /a "counter+=1
rem Do whatever you want here over the files of this subdir, for example:
if exist %dir%%fileName%%duplicate%%counter%%bracket%%fileExtenstion% ( IF defined %1 (
IF defined %2 (call :checkFileName %1 %2 )) ) ELSE (ren %temp%\%fileName%%fileExtenstion%  %fileName%%duplicate%%counter%%bracket%%fileExtenstion% )
timeout 30
goto :eof
:increment
set /a "counter+=1"
goto :eof

我不知道在调用我的 checkFileName 函数之前增加一个 var。我认为递归调用相同的函数是正确的想法,但我对命令/语法有点生疏,因为我是在星期五才开始的。

任何建议或指示将不胜感激。 (如果您知道任何值得一看的有用链接/书籍,请告诉我!)

超时 600

【问题讨论】:

  • 您是在处理单个文件夹还是文件夹树?进行什么样的重命名有关系吗?

标签: windows batch-file


【解决方案1】:
@ECHO OFF
SETLOCAL
set "tempdir=C:\Users\Daniel\Desktop\a\a1"
set "dir=C:\Users\Daniel\Desktop\a"
set "tempdir=U:\sourcedir\t w o"
set "dir=U:\destdir"
set "duplicate=-copy("
set "bracket=)"

if exist "%tempdir%" (
 for %%i in ("%tempdir%\*") do (
  if exist "%dir%\%%~nxi" ( call :checkFileName "%%~ni" "%%~xi"
  ) ELSE ( 
   move "%tempdir%\%%~nxi" "%dir%" >nul
  ) 
 )
) ELSE ( 
 echo doesnt EXIST
)

GOTO :eof

:checkFileName
set "fileName=%~1"
set "fileExtenstion=%~2"
set /a counter=0
:nexttry
set /a counter+=1
rem Do whatever you want here over the files of this subdir, for example:
if exist "%dir%\%fileName%%duplicate%%counter%%bracket%%fileExtenstion%" GOTO nexttry
move "%tempdir%\%fileName%%fileExtenstion%" "%dir%\%fileName%%duplicate%%counter%%bracket%%fileExtenstion%"  >nul
goto :eof

这是一个修订版。我将解释我所做的更改:

@echo off 关闭命令回显

setlocal 确保在过程结束时撤销对环境所做的任何更改。

我添加了额外的sets 以重新设置目录以适应我的 系统。你需要为你的删除这两行。

temp 是一个特殊的名称,它指向一个临时目录。不少之一。最好不要使用该特定名称 - 替换为 tempdir

set 用于数字集时不需要引号。在字符串集中,语法 set "var=value" 用于确保命令行上的尾随空格不包含在分配的值中(这可能导致混乱 - 空格有点 - 不可见。)请注意,在字符串 @ 987654325@,=两边上的空格很重要...

我更喜欢将目录名分配给不带结尾\ 的变量。这允许用最少的体操来扩展价值。个人喜好 - 但你同时使用它...

插入符号在( 之前不需要,并且仅在) 之前需要,其中 语法 将关闭一个左括号(即在括号中的语句中 - ifelsedo 中可能出现的序列。)任意使用,例如,这可能会导致文件名中出现杂散的文字插入符号。

行尾插入符号是一种有效但容易丢失且很少使用的技术。将语句拆分为多行的规则是粗略的,将doifelse 与其(else 保持在与其前面的右括号相同的物理行上.然后不需要 eol-caret。

Batch 只是对通过语句收费。它没有end of a procedure 的概念,需要在程序结束时告知。这可以通过goto :eof 语句(跳转到文件的物理结尾)或exit /b 语句(从子程序返回,可选择设置errorlevelgoto :eof 有效地在大多数情况,而且更常见。)

%%~nxi 表示文件%%i 的名称和扩展名。当然,单独使用%%~ni 和它的对应物是非常合法的,但这不是必需的。但是请注意,这些部分应在"quotes" 中发送到子例程,因为每个部分可能 包含空格。 "quotes"使包含空格的字符串显示为一个带空格的字符串,而不是一系列字符串。

>nulmove 命令的报告“1 个文件已移动”重定向到位桶。

checkfilename 中设置两个变量应该在删除call 中应用的引号之后完成——这就是~ 在参数编号之前的目的。

counter 可以设置为零,然后递增。

如果建议的新文件名存在,则只需增加数字并重试,直到找到不存在的名称。是的 - counter 最终会用完。最高为 2**31-1。可能需要一段时间...

注意quotesif existmove 中的使用。这是为了防止文件/目录名中的空格。前面使用的for %%i in ("%tempdir%\*") 也是如此……您可能会注意到,在我的测试中,我(故意)使用了一个包含空格的目录名。碰巧的是,我使用的文件名中也有空格。

最后一个警告 - 毫无疑问,一些奇怪的文件名可能会阻塞这些程序,但它们应该很少见。例如,包含插入符号的文件名可能是个问题。

欢迎批量!

【讨论】:

  • 非常感谢!很高兴您解释了您的更改(我可能需要一段时间才能弄清楚)。
  • +1 对细节的很好解释。不确定在 [一些] 年后我是否真的学到了任何新东西,但它得到了很好的解释并且对新的编码人员很有价值。读起来不像手册,更像是建议。
【解决方案2】:

除非这是一个学习项目,否则我建议你学习 XCOPY 命令。

【讨论】:

    猜你喜欢
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 2017-09-16
    • 1970-01-01
    • 2019-06-08
    • 2014-11-12
    相关资源
    最近更新 更多