Пакетный файл для переименования файлов - PullRequest
0 голосов
/ 14 января 2019

К сожалению, мне пока не удалось найти рабочее решение, но, надеюсь, на этот раз. Короче говоря, у нас есть принтер, и в настоящее время мы не можем настроить папку сканирования для наших сетевых дисков. Поэтому мне нужен сценарий, чтобы переименовать и переместить файлы, но сохранить их все.

Насколько мне удалось прийти, у меня появилась умная идея переместить файлы в первую папку, чтобы избежать перезаписи файлов. Затем мне нужно либо переименовать файлы с помощью счетчика, либо переместить их и сохранить их все.

Я выбрал опцию переименования, поскольку это кажется более простым, но я столкнулся с одной большой проблемой.

Понятия не имею, как заставить это работать. Поэтому я пытаюсь сначала установить переменную и выполнить первый тестовый расчет. Просто для первого быстрого теста. Теперь он уже работает для первого счета, но, к сожалению, он не учитывается, как ожидалось, поскольку он делает переименование для всех файлов перед увеличением значения переменной, поэтому переименовывается только один файл.

@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 голосов
/ 14 января 2019

Вы можете просто переместить файлы, но сначала проверьте, существует ли файл в месте назначения, если это так, переименуйте его, используя числовое значение после имени. Вот то, что может сработать. Вам просто нужно изменить исходную и целевую папку ниже. Фактическое движение не произойдет, поскольку я добавил 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 всех файлов из дерева каталогов, если вы хотите перейти только в первый каталог, просто удалите /S из цикла for, который затем просто станет 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
0 голосов
/ 14 января 2019

Попробуйте заменить "RENAME" на SET newname посмотрите, поможет ли это?

РЕДАКТИРОВАТЬ или попробовать пакет 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 `
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...