【问题标题】:Batch Help -- Move File To Directory, If Exist Filename, Rename 001批处理帮助 -- 将文件移动到目录,如果文件名存在,重命名 001
【发布时间】:2013-03-06 14:48:08
【问题描述】:

我有一个批处理文件,它每 10 秒检查一次根目录中的 PDF 文件,并将这些文件复制到它们对应的同名子文件夹中。

我缺少的是我需要我的批处理文件来检查命名文件的目标子目录,如果命名文件存在,则将要复制的新文件重命名为 !filename!001.pdf 并拥有 001随着重复的文件名被复制而增加。这是我得到的:

    :loop
    setlocal enabledelayedexpansion
    cls

    pushd c:\files\

    for /f "tokens=*" %%1 in ('dir /a-d /b c:\files\*.pdf') do (
    set filename=%%~n1&set dirname=!filename:~0,7!

    dir c:\files /b *.pdf > location1list.tmp
    for /f %%a in (location1list.tmp) do dir c:\files\%%a > location2list.tmp

    if not exist c:\files\!dirname! (md c:\files\!dirname!)
    move %%1 c:\files\!dirname!\>nul
    ) 
    timeout /t 10
    goto:loop

有什么建议可以重命名文件吗?

即如果Bob.pdf 存在于Bob 文件夹中,并且另一个Bob.pdf 添加到C:\files 文件夹中,我希望将其复制到C:\files\bob 文件夹中作为Bob001.pdf

【问题讨论】:

  • 听起来你在尝试发明revision control system。我强烈建议改用现有的 RCS(例如 SubversionMercurialgit、...)。
  • 这不适用于网站。我的客户有一台没有独立网络功能的旧扫描仪。它扫描文件并将 PDF 放到根目录中,我的客户希望用户扫描的文件转到他们的主目录而不是一般文件夹中。扫描器无法区分用户之间的差异,但它确实提供了命名扫描的选项。我指示每个人以他们的名字和批次命名他们的扫描以进行组织。唯一的问题是当前代码会移动 PDF,但如果存在相同命名的 PDF,则会覆盖。

标签: scripting batch-file cmd


【解决方案1】:

这样的事情应该做你想做的事。可能需要一些调整。我也没有测试过,只是凭记忆写的。需要任何解释,尽管问。

脚本

@echo off
setlocal EnableExtensions EnableDelayedExpansion
pushd C:\files

:Main
for /f "tokens=*" %%A in ('dir /a-d /b *.pdf') do (
    if not exist "%%~dpnA\*" md "%%~nA"
    set "File=%%~dpnA\%%~nxA"
    if exist "!File!" call :Name "!File!" File
    echo !File!
    move "%%~fA" "!File!"
)
goto Wait

:Name <Target> <Variable>
set "Count=0"
:Count
set /a "Count+=1"
set "Number=00%Count%"
if exist "%~dpn1%Number:~-3%%~x1" goto Count
set "%~2=%~dpn1%Number:~-3%%~x1"
goto :eof

:Wait
timeout /t 10
goto Main

:End
popd
endlocal

限制

  1. 每个目标子目录在写入时最多只能处理 1000 个文件。如果子目录达到此最大值,则脚本将陷入无限循环。

更新

修复了我的初始脚本中的一个错误

【讨论】:

  • 感谢大卫的帮助。运行您的脚本返回没有任何语法错误,但文件再次被复制和覆盖——这正是我列出的脚本的结果。感谢您的建议/贡献。
  • 我刚刚又看了一遍,似乎您的代码尝试不重命名文件,而是创建一个新目录。 cmd 提示显示,它没有重命名文件,而是尝试创建一个名为 001 的附加子目录。我用文件名 Bob.pdf 尝试了它。 IF 语句之一返回如下: if exists "C:\Files\Bob\001" goto Count
  • @Brandon 我相信我已经修复了它。我不正确地设置 Name 变量开头。它现在应该可以工作了。
  • @Brandon 该脚本的工作方式如下。 1. 列出 C:\files 目录下的所有 pdf 文件 2. 对于每个文件,验证它是否有一个子目录,如果没有,则创建一个 3. 检查是否已经存在同名文件,如果存在,调用name 函数 4. name 函数将从 1 循环到 999,直到找到一个不存在的文件。 5. 使用新名称移动文件。
  • 像魅力一样工作。非常感谢大卫。我希望我可以说我从这次学习中学到了一些东西,但我似乎比进来时更加困惑。也许购买“Batch Scripting for Dummies”就在眼前。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 2019-06-08
  • 1970-01-01
相关资源
最近更新 更多