Windows批处理文件复制/重命名文件

时间:2014-09-13 11:31:47

标签: windows batch-file

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

我真的很擅长创建批处理文件,所以我到目前为止所拥有的

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

2 个答案:

答案 0 :(得分:3)

@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 "var=value"用于确保命令行上的尾随空格不包含在分配的值中(这可能导致混乱 - 空格有点 - 不可见。)请注意,字符串set= 两侧的空格很重要......

我更喜欢将目录名分配给不带尾随\的变量。这允许用最少的体操来扩展价值。个人偏好 - 但你用两种方式......

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

插入行尾的插入符号是一种有效但容易丢失且使用不多的技巧。在多行中打破语句的规则粗略地将doifelse保持在与(else相同的物理行上物理线作为它之前的右括号。然后不需要eol-caret。

批量只需通过语句收费。它没有end of a procedure的概念,需要在程序结束时告知。这可以通过goto :eof语句(跳转到物理文件结尾)或exit /b语句(从子例程返回,可选地设置errorlevel来完成。{{1在大多数情况下,有效地完成这件事,并且更常见。)

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

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

在删除move中应用的引号后,应在checkfilename内设置两个变量 - 这是参数编号前call的目的。

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

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

请注意counterquotesif exist的使用情况。这是为了防止文件/目录名中的空格。前面使用的move也是如此...您可能会注意到,在我的测试中,我(故意)使用了包含空格的目录名。碰巧的是,我使用的文件名中也有空格。

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

欢迎批量生产!

答案 1 :(得分:0)

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