Страница 3 из 13

Добавлено: Пт окт 21, 2011 10:50
Batya
Мои 5 копеек:

Код: Выделить всё

'======================================================================
' Создание нескольких копий каждого файла из файла-списка
'
' Параметры:
' {файл-список} {целевая папка} {количество}
' 
' Пример параметров при вызове из TC:
' %L "%T" 200
'======================================================================
Option Explicit
Dim FSO, FF, F, i, TF, T, Q

With WScript
  If .Arguments.Count < 3 Then
    MsgBox "Неправильно заданы параметры!", vbOKOnly + vbCritical, "Создание нескольких копий"
    .Quit
  End If
  FF = .Arguments(0)
  TF = .Arguments(1)
  Set FSO = CreateObject("Scripting.FileSystemObject")
  If (Not FSO.FolderExists(TF)) And (TF <> "") Then
    MsgBox "Некорректно указана целевая папка!", vbOKOnly + vbCritical, "Создание нескольких копий"
    Set FSO = Nothing
    .Quit
  End If
  If TF <> "" Then If Right(TF, 1) <> "\" Then TF = TF & "\"
  Q = CInt(.Arguments(2))
End With


With FSO.OpenTextFile(FF, 1)
  Do While Not .AtEndOfStream
    F = Trim(.ReadLine)
    If F <> "" Then
      If FSO.FileExists(F) Then
        If TF = "" Then T = FSO.GetParentFolderName(F) & "\" Else T = TF
        For i = 1 To Q
          FSO.CopyFile F, NextName(T & FSO.GetFileName(F))
        Next
      End If
    End If
  Loop
  .Close
End With

Set FSO = Nothing
WScript.Quit

Function NextName(pPath)
  Dim lPath, lName, lExt, li, lAdd
  Const lQ = 1 'Минимальное количество цифр в номере
  With CreateObject("Scripting.FileSystemObject")
    lPath = .GetParentFolderName(pPath)
    If lPath <> "" Then lPath = lPath & "\"
    lName    = .GetBaseName(pPath)
    lExt     = .GetExtensionName(pPath)
    NextName = pPath
    Do While .FileExists(NextName) Or .FolderExists(NextName)
      li = li + 1
      If li < 10^lQ Then
        lAdd = Right(String(lQ, "0") & li, lQ)
      Else
        lAdd = li
      End If
      NextName = lPath & lName & "(" & lAdd & ")." & lExt
    Loop
  End With
End Function

Добавлено: Пт окт 21, 2011 12:59
Flasher

Добавлено: Пт окт 21, 2011 13:05
Avada
Объединяю тему с уже существующей.

Добавлено: Пт окт 21, 2011 17:03
DeathStalker
Всем спасибо за помощь.

Добавлено: Пт окт 21, 2011 17:52
Flasher
Пусть ещё облегчённый вариант будет:

Код: Выделить всё

' Cоздать указанное число копий для каждого выделенного элемента 
' Параметры: %L "<путь назначения>"
' Пример: %L "%P"
'===============================================================
If WScript.Arguments.Count = 0 Then WScript.Quit
L = vbNewLine
Count = InputBox(L&L&L&L&"Введите число создаваемых копий" & L &_
"для каждого элемента списка :", "             Создание копий выделенных элементов")
If IsNumeric(Count) Then             
  For Each F in Split(CreateObject("Scripting.FileSystemObject")._
  OpenTextFile(WScript.Arguments(0)).ReadAll, L)
    If F > vbNullString Then
      For n = 1 To Abs(Count)
        CreateObject("Shell.Application").NameSpace(WScript.Arguments(1)).CopyHere F, 8
      Next
    End If
  Next
End If

Перемещение файлов с переименованием (нумерацией)

Добавлено: Вс дек 25, 2011 17:21
Serrg
Здравствуйте!
Есть такая проблема: производится перемещение файлов с разных фотоаппаратов в одну папку на компьютере. Необходимо, чтобы в папке файлы именовались просто порядковыми номерами, т.е. 01.jpg, 02.jpg, ...,10.jpg и т.д., а при добавлении файлов в эту папку, нумерация продолжалась. Пока всё это делается вручную: перемесить-выделить новые файлы-групповое переименование с установкой начального значения счетчика. Можно ли автоматизировать этот процесс? Буду благодарен всем откликнувшимся.

[mod="Моторокер"]Тема объединена с текущей.[/mod]

Добавлено: Вс дек 25, 2011 18:05
Tol!k
Было. Пользуйтесь поиском.

Добавлено: Вс дек 25, 2011 18:28
Serrg
Спасибо, что не оставили без внимания, но перед тем как задать вопрос я просмотрел все темы в разделе автоматизации, а так же пробовал поиск по словам "перемещение" и "переименование". К сожалению ничего подходящего не нашел :( . Помогите ссылочкой, пожалуйста.

Добавлено: Вс дек 25, 2011 19:32
Tol!k
к http://forum.wincmd.ru/viewpost.php?p=62914 добавил перемещение

Код: Выделить всё

@echo off &setlocal enableextensions &chcp 1251 >nul
rem  Копирование файлов и папок с переименованием по счётчику
rem  Параметры: %L "D:\куда\" "Приставка_"
rem             %L "%T" "" -m
rem  -m — удалять источник
rem  Автор: Tol!k

set "trg=%~2" &set "pref=%~3"
if "%~4"=="-m" set "move=Yes"
for /f "usebackq delims=" %%f in ("%~1") do call :p "%%f"
goto :eof

:p
set "name=%~1" &set "ext=%~x1"
set /a n=0
call :loop 1000 &set /a n-=1000
call :loop 100 &set /a n-=100
call :loop 10 &set /a n-=10
call :loop 1
title "%new%"

if "%name:~-1%"=="\" (
  xcopy "%name%*" "%trg%\%new%" /i /e /k/r/h >nul &&if "%move%"=="Yes" rd /s /q %1
) else (
  echo f| xcopy %1 "%trg%\%new%" /k/r/h >nul &&if "%move%"=="Yes" del /f /q %1
)
goto :eof

:loop
if "%n%"=="9999" (
  title STOP
  echo 9999 единиц в месте назначения,
  echo недостаточно разрядности счётчика.
  pause >nul &exit /b 9
)
set /a n+=%1
set "e=000%n%"
set "e=%e:~-4%"
set "new=%pref%%e%%ext%"
if exist "%trg%\%new%" call :loop %1
goto :eof


Добавлено: Вс дек 25, 2011 19:35
Tol!k

Добавлено: Вс дек 25, 2011 21:42
Flasher
Serrg
А нумеровать нужно сразу или только при совпадении?

Добавлено: Пн дек 26, 2011 03:48
Serrg
Tol!k
Большущее спасибо за помощь - то что надо!

Flasher
Совпадений не должно быть в принципе, т.к. в фотоаппаратах файлы именуются по другому (IMG0001.jpg, P0001.jpg и т. п.).

Добавлено: Пт апр 13, 2012 20:33
Tol!k
к http://forum.wincmd.ru/viewpost.php?p=62933
добавил третий параметр — кол-во разрядов в номере (по умолч. 3)

Код: Выделить всё

@echo off &setlocal enableextensions &chcp 1251 >nul
rem  Копирование файлов и папок с добавлением номера
rem  Параметры: "%L" "d:\куда\" 3
rem  Автор: Tol!k
rem  http://forum.wincmd.ru/viewpost.php?p=91443

if not "%~3"=="" (set "#=%~3") else set "#=3"
setlocal enabledelayedexpansion
for /l %%i in (2,1,%#%) do (set "min=0!min!" &set "max=9!max!")
endlocal &set "min=0%min%" &set "max=9%max%"

set "trg=%~2"
for /f "delims=" %%f in ('type "%~1"') do call :p "%%f" "%%f."
goto :eof

:p
set "pre=%~n1"
if "%pre%"=="" set "pre=%~n2"
set "name=%~1" &set "ext=%~x1"
set /a n=0 &goto :%min%
:0000000000
:000000000
call :loop 100000000 &set /a n-=100000000
:00000000
call :loop 10000000 &set /a n-=10000000
:0000000
call :loop 1000000 &set /a n-=1000000
:000000
call :loop 100000 &set /a n-=100000
:00000
call :loop 10000 &set /a n-=10000
:0000
call :loop 1000 &set /a n-=1000
:000
call :loop 100 &set /a n-=100
:00
call :loop 10 &set /a n-=10
:0
call :loop 1
title "%new%"

if "%name:~-1%"=="\" (
  xcopy "%name%*" "%trg%\%new%" /i /e /k/r/h >nul
) else (
  echo f| xcopy "%name%" "%trg%\%new%" /k/r/h >nul
)
goto :eof

:loop
if "%n%"=="%max%" (
  echo %max% единиц в месте назначения,
  echo недостаточно разрядности счётчика.
  title STOP &pause >nul &exit /b 9
)
set /a n+=%1
setlocal enabledelayedexpansion
set "e=%min%%n%" &set "e=!e:~-%#%!"
endlocal &set "e=%e%"
set "new=%pre%_%e%%ext%"
if exist "%trg%\%new%" goto :loop
goto :eof


Добавлено: Пн июл 30, 2012 16:34
obse
Ребята, нужна помощь. Скажите, можно ли написать bat-файл, который будет находить на всех дисках (С, D, E, *) файлы скажем с расширением *.txt и копировать их в папку D:\1, и при одинаковом имени файла не заменять его, а добавлять к названию цифру. (1.txt, 1(1).txt, 1(2).txt, 1(3).txt,.....).
Читал, пробовал делать, но или в голове не так что-то или руки кривые. Помогите с файликом, пожалуйста.

Добавлено: Пн июл 30, 2012 17:15
Avada
obse
Заданный вопрос ни к подфоруму "Общие вопросы", ни уж тем более к теме Ошибка ввода/вывода - как создать список нечитающихся файлов не имеет ни малейшего отношения. Читаем правила форума и учимся пользоваться поиском.
Сообщение перенесено в более подходящее место. А тут уж специалисты по автоматизации выскажут своё мнение.