Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Создание txt файла при добавлении файла в архив rar, немного дополнить скрипт (http://forum.oszone.net/showthread.php?t=329380)

ndrjjzbv 28-08-2017 20:02 2761185

Создание txt файла при добавлении файла в архив rar, немного дополнить скрипт
 
Скрипт архивирует файлы с расширением *.psd и *.jpg
Код:

@echo off
chcp 1251
for /f "tokens=2 delims==:" %%i in ('
wmic logicaldisk get Name /value
 ') do (
  for /f "delims=" %%j in ('
  dir /a-d /b /s %%i:\*.psd %%i:\*.JPG 2^>nul
 ') do (
  "%PROGRAMFILES%\WinRAR\Rar.exe" a -y -ri15 -dr -m0 -inul "%%~dpnj.rar" "%%j"
 )
 )
exit /b

Подскажите, как дополнить скрипт, что бы:
- после архивирования, во всех папках где созданы архивы, создавался файл name.txt в единственном числе, а при наличии данного файла заменялся новым.
- в созданном файле присутствовал текст в несколько строк
text
text
text

Необходимо новое дополнение:
- что бы при запуске скрипта, он не архивировал файлы с нужным расширением, если в пути к данному файлу имеется папки с именами - пример name1, name2, name3 (проще говоря, что бы скрипт не залазил в данные папки)

alpap 29-08-2017 02:46 2761225

Код:

...
 ') do (
  pushd "%%~dpj"
    >"name.txt" (
    echo text
    echo text
    echo text
    )
  popd
  "%PROGRAMFILES%\WinRAR\Rar.exe" a -y -ri15 -dr -m0 -inul "%%~dpnj.rar" "%%j"
  )
...

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

ndrjjzbv 29-08-2017 13:42 2761306

alpap спасибо
Добавил ваш код в свой, все работает, как и требовалось.
Пример: Существует много папок с начальными проектами для работы с фотографией. В настоящее время данный файл создается вручную в каждом проекте (папке) и содержит технические комментарии по проекту. В старых проектах данный файл уже существует, а в новые его еще требуется добавить. Комментарии в проекте всегда одинаковые, разные только изображения. Проекты отправляются разным людям, что бы те выполняли работу в соответствии с комментариями к проекту.
Благодаря вам теперь это возможно в автоматическом режиме, и не придется постоянно копировать файл в разные папки.

megaloman 30-08-2017 13:03 2761480

ndrjjzbv, имхо, здесь ошибка, надо:
Код:

dir /a-d /b /s %%i:\*.psd %%i:\*.JPG 2^>nul

Iska 30-08-2017 14:11 2761492

На мой взгляд — тоже.

ndrjjzbv 31-08-2017 01:10 2761585

Цитата:

Цитата megaloman
ndrjjzbv, имхо, здесь ошибка, надо:
Код:
dir /a-d /b /s %%i:\*.psd %%i:\*.JPG 2^>nul »

Подскажите для расширения кругозора, что это дает? вроде и так работает

Если не затруднит, подскажите по выше изложенному скрипту.
Как его дополнить, что бы при запуске скрипта, он не архивировал файлы с нужным расширением, если в пути к данному файлу имеется папки с именами - name1, name2, name3.

alpap 31-08-2017 01:34 2761593

ndrjjzbv,
Цитата:

Цитата ndrjjzbv
вроде и так работает »

создайте в корне диска "C:\" файл (или несколько) - txt и файл (или несколько) - docx
теперь создайте и запустите bat на рабочем столе с кодом:
Код:

@echo off
dir /a-d/b "c:\*.txt" "*.docx"
pause

файл с расширением docx не будет найден, о чем скажет cmd

а теперь измените код на:
Код:

@echo off
dir /a-d/b "c:\*.txt" "c:\*.docx"
pause

теперь все указанные файлы будут найдены.

без буквы диска (или директории) подставляется текущий (текущая директория - запуска)
для проверки создайте теперь на рабочем столе файл с расширением docx и запустите первый код - будут найдены соответствующие файлы.

alpap 31-08-2017 13:30 2761658

Цитата:

Цитата ndrjjzbv
он не архивировал файл »

в 7z это ключ: (для вашего примера) -xr!name*
а для rar или такой же или надо в мануале смотреть, я им не пользуюсь просто.

ndrjjzbv 31-08-2017 15:23 2761691

Расширенная справка по WinRAR на русском
взял пример ключа из мануала и добавил в скрипт
Код:

-r -x*\Documents and Settings -x*\Documents and Settings\*
результат тестирования - не смотря на ключ все искомые файлы были удалены и на их месте создан файл с комментарием, в папке с батником создался архив со всеми удаленными файлами,
Код:

-r -x*\"Documents and Settings" -x*\"Documents and Settings"\*
в этом примере - в папках с искомыми файлами создан файл с комментарием, но ничего не заархивировалось и не удалено.

alpap 31-08-2017 15:34 2761695

ndrjjzbv,
тогда так отсейте ненужные пути и в команду поставьте архивацию
Код:

@echo on
for /f "delims=" %%a in ('dir /a-d/b/s "papka\*.txt"^|findstr /v name.*') do echo %%a
pause


megaloman 31-08-2017 15:54 2761699

ndrjjzbv,
Мой вариант, предполагается, что в системе отсутствует диск A:
Код:

@Echo Off
Cls

Set "Mask=*.psd *.jpg"
Set "Fcomment=name.txt"
 
GoTo :Begin
:Comment
        Echo %Date% %Time%
        Echo текст 1
        Echo текст 2
        Echo текст 3
        Echo текст 4
GoTo :Eof

:Exclude
        Echo \папка 1\
        Echo \папка 2\
        Echo \папка 3\
GoTo :Eof

:Begin
Set "Exc=A:\%~n0.txt"

Subst A: /D >nul 2>&1
FOR /F "usebackq tokens=1* delims=: " %%i IN (`fsutil fsinfo drives`) DO Set "DiskName=%%j"
Subst A: "%Tmp%" || (Echo Disk A: not created &Pause &GoTo :Eof)

>"%Exc%" Echo A:\
>>"%Exc%" Call :Exclude

rem    Set "DiskName=D:\ E:\"

Call :DiskMask %Mask%
Del "%Exc%" 2>nul

subst A: /D
GoTo :Eof

:DiskMask
        For %%i IN (%DiskName%) DO (
                        For /F "usebackq delims=" %%f IN (`xcopy /s /l /EXCLUDE:%Exc% %%i%1 A:\ 2^>nul`) DO (
                                If Exist "%%f" Call :Arc "%%f"
                        )
        )
        Shift
        If Not "%1"=="" GoTo :DiskMask
GoTo :Eof

:Arc
        Echo %1
        "%PROGRAMFILES%\WinRAR\Rar.exe" a -y -ri15 -dr -m0 -inul "%~dpn1.rar" %1
        >"%~dp1%Fcomment%" Call :Comment
GoTo :Eof


ndrjjzbv 31-08-2017 16:20 2761706

Цитата:

Цитата alpap
тогда так отсейте ненужные пути и в команду поставьте архивацию
@echo on
for /f "delims=" %%a in ('dir /a-d/b/s "papka\*.txt"^|findstr /v name.*') do echo %%a
pause »

Подскажите в какое место кода нужно внести данное дополнение?
Правильно ли я понимаю, что
Код:

findstr /v name.*
исключает из архивации файлы, в пути к которым имеется имя папки name?
papka что это за папка
Код:

"papka\*.txt"^

ndrjjzbv 31-08-2017 16:47 2761709

megaloman
Цитата:

Цитата megaloman
Мой вариант, предполагается, что в системе отсутствует диск A: »

батник не срабатывает, после запуска через секунду закрывается

megaloman 31-08-2017 21:43 2761750

ndrjjzbv, Попробуйте, я подправил код. Однако! Если в именах папок-исключений кириллица - сохранять батнмк в 866 кодировке.

ndrjjzbv 31-08-2017 22:17 2761756

Спасибо. Работает хорошо, но требуются права администратора. Возможен ли вариант для запуска без прав администратора?

alpap 01-09-2017 00:57 2761773

ndrjjzbv,
через ярлык в котором поставить запуск с правами или задачу в планировщике с соответствующей галкой.

ndrjjzbv 01-09-2017 15:37 2761890

добавил в код |findstr /v name1.* все работает, скрипт пропускает файлы хранящиеся в папке с именем name1 и ее подпапках
Код:

') do (
  for /f "delims=" %%j in ('
  dir /a-d /b /s %%i:\*.psd %%i:\*.JPG 2^|findstr /v name1.*
 ') do (

подскажите как добавить (перечислить) в коде несколько папок name2, name3 для исключения?

alpap 01-09-2017 16:10 2761901

Цитата:

Цитата ndrjjzbv
несколько папок »

Код:

findstr /v /c:"name2[0-9][0-9]*" /c:"name3[0-9][0-9]*"

Iska 01-09-2017 16:22 2761908

Цитата:

Цитата ndrjjzbv
как добавить (перечислить) в коде несколько папок name2, name3 для исключения? »

Через несколько шаблонов, указанных параметрами «/c», как в примере коллеги alpap.

ndrjjzbv 01-09-2017 16:42 2761912

вероятно в коде ошибка, т.к. в перечисленных папках подобным образом
Код:

findstr /v /c:"name2[0-9][0-9]*" /c:"name3[0-9][0-9]*"
файлы все равно архивируются
добавил ключ /r все заработало
Код:

findstr /r /v /c:"name2*" /c:"name3*"

Iska 01-09-2017 17:28 2761921

ndrjjzbv, а если ещё добавить в findstr.exe параметр «/r» ;)?

Вы не стесняйтесь читать документацию (в данном случае — «findstr.exe /?»), ибо иначе грош цена всей помощи будет.

ndrjjzbv 01-09-2017 17:56 2761929

Ключ /C: при использовании регулярных выражений должен использоваться в команде совместно с ключом /R
зачем нужны [0-9][0-9], с ними папки не исключаются
при ключе /r все работает без [0-9][0-9]

Iska 01-09-2017 18:19 2761931

ndrjjzbv, тогда ещё стоит почитать что-нибудь по регулярным выражениям.
Код:

/c:"name2[0-9][0-9]*"
означает:
Цитата:

строки, содержащие текст «name», затем цифру «2», затем любую цифру из диапазона от «0» до «9», затем ноль или более цифр из диапазона от «0» до «9»
Таким образом, под данный шаблон регулярного выражения попадут строки:
Код:

name22
name222
name2222
name23
name24
name21Мама мыла раму

и не попадут строки:
Код:

name2 (всего пять символов, а шаблон требует не менее шести)
name2Вася (шестой символ не цифра из диапазона от «0» до «9» )
name2 2 (шестой символ не цифра из диапазона от «0» до «9» )
name42 (пятый символ не цифра «2»)


ndrjjzbv 01-09-2017 18:32 2761938

Если в конце имени папки отсутствуют цифры, то [0-9][0-9] вводить не требуется?

Iska 01-09-2017 18:40 2761942

ndrjjzbv, если Вы хотите просто перечислить несколько имён, не вдаваясь в тонкости регулярных выражений (которые к тому же в findstr.exe весьма и весьма ограниченные), используйте параметр «/l» вместо «/r», а затем просто перечислите искомые имена посредством параметра «/c»:
Код:

findstr.exe /v /l /c:"Мама" /c:"мыла" /c:"раму"
P.S. Если приведёте полный набор исключений, посмотрим, что лучше будет использовать — перечисление, регулярки или даже внешний файл.

ndrjjzbv 01-09-2017 18:56 2761946

Iska
Спасибо, ваш способ решил задачу

Iska 01-09-2017 19:10 2761948

ndrjjzbv, до кучи, ещё, наверное, и параметр «/i» может есть смысл пользовать, дабы не учитывать регистр символов.

megaloman 01-09-2017 19:42 2761951

ndrjjzbv,
Вот вариант, необходимо наличие дисков C: и D: Возможно, это решит проблему с доступом.
Код:

@Echo Off
Cls

Set "Mask=*.psd *.jpg"
Set "Fcomment=name.txt"
 
GoTo :Begin
:Comment
        Echo %Date% %Time%
        Echo текст 1
        Echo текст 2
        Echo текст 3
        Echo текст 4
GoTo :Eof

:Exclude
        Echo C:\Windows\
        Echo C:\TMP\
        Echo C:\Program Files\
        Echo \папка 1\
        Echo \папка 2\
        Echo \папка 3\
GoTo :Eof

:Begin
Set "Exc=C:\%~n0.txt"

FOR /F "usebackq tokens=1* delims=: " %%i IN (`fsutil fsinfo drives`) DO Set "DiskName=%%j"

>"%Exc%" Call :Exclude

Call :DiskMask %Mask%
Del "%Exc%" 2>nul

GoTo :Eof

:DiskMask
        For %%i IN (%DiskName%) DO (
                        Echo Disk %%i  Mask %1
                        If /I "%%i"=="C:\" (
                                For /F "usebackq delims=" %%f IN (`xcopy /s /l /EXCLUDE:%Exc% %%i%1 D:\`) DO (
                                        If Exist "%%f" Call :Arc "%%f"
                                )
                        ) Else (
                                For /F "usebackq delims=" %%f IN (`xcopy /s /l /EXCLUDE:%Exc% %%i%1 C:\`) DO (
                                        If Exist "%%f" Call :Arc "%%f"
                                )
                        )
        )
        Shift
        If Not "%1"=="" GoTo :DiskMask
GoTo :Eof

:Arc
        Echo %1
        "%PROGRAMFILES%\WinRAR\Rar.exe" a -y -ri15 -dr -m0 -inul "%~dpn1.rar" %1
        >"%~dp1%Fcomment%" Call :Comment
GoTo :Eof

Echo C:\Windows\
Echo C:\TMP\
Echo C:\Program Files\
Добавлено в качестве примера


Время: 22:50.

Время: 22:50.
© OSzone.net 2001-