批处理文件来重命名文件

时间:2019-01-14 11:09:00

标签: batch-file for-loop variables rename

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

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

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

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

@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,然后移至目标位置。

移动不是问题,但是如果我能够设法使此功能正常工作,则可以使其适应我的需要。

2 个答案:

答案 0 :(得分:0)

您可以简单地移动文件,但是首先检查文件是否在目标位置,如果存在,请在名称后使用数字值对其进行重命名。这可能会起作用。您只需要在下面更改源和目​​标文件夹。当我在最后一行的第二行中添加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,然后将其变成{ {1}}

修改 至于您的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

答案 1 :(得分:-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 `