• Администрация SafeZone приветствует вас на нашем форуме!
    Если вы больше не желаете видеть рекламу при просмотре тем и сообщений - то достаточно просто зарегистрироваться. Для зарегистрированных пользователей реклама не отображается.

[CMD] Поиск файлов и применение команды последовательно ко всем файлам

alex_diablo

Пользователь
Сообщения
142
Симпатии
9
#1
Добрый день.
есть такая программа - Unity.
есть команда, при помощи которой можно делать ее активацию серийником, выглядит так:
Bash:
"C:\Program Files\Unity\Editor\Unity.exe" -quit -batchmode -serial SB-XXXX-XXXX-XXXX-XXXX-XXXX -username name.surname@mail.ru -password qwerty
и все бы хорошо, но существует несколько разных подверсий Unity (4.xx , 5.xx , 2017.xx ), так вот и на одном компе таких версий одновременно может быть установлено несколько.
указанный выше путь - дефолтный (для одиночной установки). если установлено несколько разных версий, то соответственно, для каждой версии будет создан отдельный каталог.
32-битные версии ставятся в %programfiles(x86)%, 64-битные - в %programfiles%
проблема в том, что для каждую из версий нужно активировать отдельно, т.е. для автоматизации нужно знать все пути до файлов unity.exe и для каждой выполнить команду.
задача в том, чтобы найти все пути установки и подставить поочередно в команду активации.
полагаю, это делается в цикле, но руки крючи и голова не варит.
помогите пожалуйста написать скрипт, который выполнит эту задачу.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,686
Симпатии
5,580
#2
Так примерно (не проверял):

CMD/BATCH:
@echo off
SetLocal EnableExtensions

for /f "delims=" %%a in ('dir /b /a-d "%programfiles(x86)%\Unity" "%programfiles%\Unity"') do (
  start "" /min "%%a" -quit -batchmode -serial SB-XXXX-XXXX-XXXX-XXXX-XXXX -username name.surname@mail.ru -password qwerty
)

pause
 

alex_diablo

Пользователь
Сообщения
142
Симпатии
9
#3
Так примерно (не проверял):

CMD/BATCH:
@echo off
SetLocal EnableExtensions

for /f "delims=" %%a in ('dir /b /a-d "%programfiles(x86)%\Unity" "%programfiles%\Unity"') do (
  start "" /min "%%a" -quit -batchmode -serial SB-XXXX-XXXX-XXXX-XXXX-XXXX -username name.surname@mail.ru -password qwerty
)

pause
не работает... т.е. ничего не делает. не находит то, что нужно находить, а именно, все файлы unity.exe, которые могут быть в разных подкаталогах в %programfiles%
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,686
Симпатии
5,580
#4
а, ну, так тогда удалите \Unity в двух местах.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,686
Симпатии
5,580
#6
Ой, сейчас.
Вот так нужно:

CMD/BATCH:
@echo off
SetLocal EnableExtensions

for /f "delims=" %%a in ('dir /b /a-d "%programfiles(x86)%\Unity.exe" "%programfiles%\Unity.exe"') do (
  start "" /min "%%a" -quit -batchmode -serial SB-XXXX-XXXX-XXXX-XXXX-XXXX -username name.surname@mail.ru -password qwerty
)

pause
 

alex_diablo

Пользователь
Сообщения
142
Симпатии
9
#7
Ой, сейчас.
Вот так нужно:

CMD/BATCH:
@echo off
SetLocal EnableExtensions

for /f "delims=" %%a in ('dir /b /a-d "%programfiles(x86)%\Unity.exe" "%programfiles%\Unity.exe"') do (
  start "" /min "%%a" -quit -batchmode -serial SB-XXXX-XXXX-XXXX-XXXX-XXXX -username name.surname@mail.ru -password qwerty
)

pause
и так не находит...

вот примерно как могут выглядеть пути:

C:\Program Files\Unity_2017.1.0f1\Editor\Unity.exe
C:\Program Files\Unity-5.6.4p3\Editor\Unity.exe
C:\Program Files\Unity2017.3.1p2\Editor\Unity.exe

т.е. пути разные. неизменен только файл unity.exe

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

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,686
Симпатии
5,580
#8
Да что ж такое. Опять не то написал.
Добавьте к dir ключ /s
 

alex_diablo

Пользователь
Сообщения
142
Симпатии
9
#9
все, теперь работает. спасибо!
Сообщения объединены:

и еще с вашего позволения...

вот есть файл аутлука...

C:\Users\ivan.petrov\AppData\Local\Microsoft\Outlook\Ivan.Petrov@mail.ru - outlook.ost

как можно в переменную %mail% из этого файла записать только имя, т.е. все, что до собаки? т.е. ivan.petrov ?
 
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,686
Симпатии
5,580
#10
CMD/BATCH:
for /f "delims=@" %%a in ("C:\Users\ivan.petrov\AppData\Local\Microsoft\Outlook\Ivan.Petrov@mail.ru - outlook.ost") do set mail=%%~nxa
 

alex_diablo

Пользователь
Сообщения
142
Симпатии
9
#11
спасибо.

зы. придумал, как реализовать проверку на правильность авторизации
Unity создает лог-файл, где можно увидеть, успешно ли прошла активация.

сделал так:

Bash:
@echo off
SetLocal EnableExtensions
FOR /F "delims=" %%a in ('type "%userprofile%\AppData\Local\Unity\Editor\Editor.log" ^|find /i "Unity has not been activated with a valid License"') do (
  set "failed=%%a"
    )

    if not defined failed goto 2

        if defined failed echo.
        echo failed!
        pause
        exit

:2

echo done!

pause
но есть одно НО:
если код проверки вставить после отработки команды активации, то ожидание может затянуться, особенно если на на компе
установлено несколько разных версий юнити (у некоторых этот список может достигать порядка 15-20 шт). на одну команду
активации может уйти порядка 30-60 сек.
возможно ли как-то внедрить такую проверку в процесс активации? чтобы не дожидаться всех итераций цикла?
т.е. дожидаться появления файла, проверять в нем наличие текста "Unity has not been activated with a valid License" и если он
обнаружен - выдавать сообщение, что пароль неверный.
ну а если сообщение не появилось, продолжать выполнение дальше...

зы.зы. добавил в код процесса активации /wait, чтобы скрипт дожидался выполнения цикла, а то в первоначальном варианте он просто запускается в фоне
и дальше выполняется код основного батника..

Код:
for /f "delims=" %%a in ('dir /s /b /a-d "C:\Program Files\Unity.exe"') do (
start /wait "" /min "%%a" -quit -batchmode -serial T3-8HSR-P2U5-8EX8-UTAU-GKJ4 -username %email% -password %pass%
)
 
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,686
Симпатии
5,580
#12
т.е. дожидаться появления файла, проверять в нем наличие текста "Unity has not been activated with a valid License" и если он
обнаружен - выдавать сообщение, что пароль неверный.
ну а если сообщение не появилось, продолжать выполнение дальше...
Выберите что-то одно, ждать или не ждать.
Т.к. если сообщение не появилось, оно будет ждать бесконечно.
 

alex_diablo

Пользователь
Сообщения
142
Симпатии
9
#13
ждать появления файла. и после этого проверять в нем наличие этого сообщения. если сообщение есть - прекращать выполнение. если не появилось - продолжать.
 
Сверху Снизу