【问题标题】:Batchfile to rename files批处理文件重命名文件
【发布时间】:2019-06-08 08:55:01
【问题描述】:

遗憾的是,我还没有找到可行的解决方案,但希望这一次。 长话短说,我们有一台打印机,我们目前无法将扫描文件夹配置到我们的网络驱动器。所以我需要一个脚本来重命名和移动文件,但要保留它们。

据我所知,我有一个聪明的想法,将文件移动到第一个文件夹中,以避免文件被覆盖。接下来我需要使用计数器重命名文件或移动它们并保留它们。

我选择重命名选项,因为这看起来更简单,但我遇到了一个大问题。

我不知道我是如何让它工作的。所以我正在尝试的是首先设置变量并进行第一次测试计算。只是为了第一次快速测试。现在它已经在第一次计数时起作用了,但遗憾的是它并没有像希望的那样计数,因为他在增加变量的值之前对所有文件进行了重命名,因此只有一个文件被重命名。

@ECHO off
::Defining Variables
setlocal EnableDelayedExpansion
SET N=0
ECHO %N% Hi Not rename
SET /a N=%N%+1
FOR /L %%A in (1,1,10) DO (
    Echo !N! hi
    RENAME "C:\Users\smorheng\Desktop\1\*.pdf" "Test.?????.!N!.*" | SET /a N=!N!+1
    ECHO !N! Hi Not rename
    timeout 3 /nobreak > nul
)
ECHO RENAME DONE
timeout 50 /nobreak > nul

大约 20 个文件被重命名为 Test.1.pdf、Test.2.pdf .... Test.20.pdf,然后移动到它们的目的地。

移动不是问题,但如果我能设法让这个功能发挥作用,我可以根据我的需要调整它。

【问题讨论】:

    标签: batch-file for-loop variables rename


    【解决方案1】:

    尝试将“RENAME”替换为SET newname,看看是否有帮助?

    EDIT 还是尝试使用 vbs 脚本而不是批处理?

    `Set objFS = CreateObject("Scripting.FileSystemObject")
    strFolder="c:\test"
    Set objFolder = objFS.GetFolder(strFolder)
    For Each strFile In objFolder.Files
        If objFS.GetExtensionName(strFile) = "jpg" Then    
            strFileName = strFile.Name
            If InStr(strFileName,"XXXXXXX") > 0 Then           
                strNewFileName = Replace(strFileName,"XXXXX","YYYYY")
                strFile.Name = strNewFileName
            End If 
        End If  
    Next `
    

    【讨论】:

      【解决方案2】:

      您可以简单地移动文件,但首先检查文件是否存在于目标中,如果存在,请在名称后使用数值重命名。这是可能有用的东西。您只需要更改下面的源和目标文件夹。实际移动不会发生,因为我在倒数第二行和最后一行添加了 echo 以演示它将做什么,如果有效,只需从两行中删除 echo。

      @echo off
      setlocal enabledelayedexpansion
      set "source=C:\Users\smorheng\Desktop\1\"
      set "dest=D:\destination\folder"
      set /a cnt=0
      for /f "tokens=*" %%a in ('dir /S /B /A-D "%source%*.pdf"') do for /f "tokens=*" %%b in ('dir /B "%%a"') do if exist "%dest%\%%b" (
              set "ext=%%~xa"
              set "fname=%%~na"
              if exist "%dest%\!fname!(!cnt!)!ext!" (set /a cnt=!cnt!+1)
              set /a cnt=!cnt!+1
              echo move "%%a" "%dest%\!fname!(!cnt!)!ext!"
      ) else echo move "%%a" "%dest%\%%b"
      

      另外请注意,这将递归地 move 目录树中的所有文件,如果您只想进入第一个目录,只需从 for 循环中删除 /S,然后它将简单地变为 dir /B /A-D "%source%*.pdf"

      编辑 至于你的for /L 循环(在评论中提到)

      宁可有一个标签,并在完成后永久转到它。这是一个类似的简单示例,将其复制到脚本并运行它,查看结果:

      @echo off
      :label
      echo Hi, this will run every 6 seconds and print this line. (infinitely).
      timeout 6>nul
      goto :label
      

      所以从技术上讲,您可以对循环执行完全相同的操作,例如:

      @echo off
      :label
      setlocal enabledelayedexpansion
      set "source=C:\Users\smorheng\Desktop\1\"
      set "dest=D:\destination\folder"
      set /a cnt=0
      for /f "tokens=*" %%a in ('dir /S /B /A-D "%source%*.pdf"') do for /f "tokens=*" %%b in ('dir /B "%%a"') do if exist "%dest%\%%b" (
              set "ext=%%~xa"
              set "fname=%%~na"
              if exist "%dest%\!fname!(!cnt!)!ext!" (set /a cnt=!cnt!+1)
              set /a cnt=!cnt!+1
              echo move "%%a" "%dest%\!fname!(!cnt!)!ext!"
      ) else echo move "%%a" "%dest%\%%b"
      endlocal
      timeout 6>nul
      goto :label
      

      【讨论】:

      • 非常感谢您提供这段有用的代码。 :D 它基本上解决了我的整个问题。 :) 现在我只需要将它实现到运动代码中并设置正确的轮数即可运行。我将尝试对此进行更深入的研究,以正确理解所有功能,不仅要使用代码,还要理解它;)
      • 你不需要运行任何轮次来运行它,你只需要运行它,它会检查文件是否存在,然后如果文件存在于目标中,它会在移动之前重命名它。你几乎尝试过for /l (1,1,10)...这只会做很多次。这段代码将为任何 pdf 文件运行它并移动所有内容,包括重命名的文件。
      • 没有没有。这只是脚本的最后一部分。脚本实际上需要至少在我们的商店打开时继续运行。这就是为什么我必须在脚本中添加 'FOR /L %%A in (1,1,8400)' 并间隔 6 秒,否则脚本将运行得太快并浪费 CPU 容量。人们还需要至少 6 秒的时间从扫描仪到他们的办公桌。所以是的,这可能会在第一次试运行后正常工作;)所以是的。感谢您的帮助:D
      • 但为什么不直接创建一个标签并每次都转到它,而不是为未知数量的运行创建一个 for 循环?
      • 这是因为用户应该尽可能简单。相信我。作为程序员,您必须确保提前考虑并发现用户可能遇到的问题,例如“这是什么?”或“这是为了什么?”别担心。我现在一切正常。 ;)
      猜你喜欢
      • 2014-02-26
      • 2012-12-10
      • 2019-05-25
      • 2013-06-25
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      相关资源
      最近更新 更多