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

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

BKPB 11-07-2019 16:36 2879409

Нужно объединить два батника в один
 
Не знаю, как объединить эти батники.
При запуске их по отдельности они работают.
Но когда попытался вставить один в другой не редактируя, то часть задания не выполнялась.
Этот создаёт временный .vbs, который запускает этот же батник от имени Администратора,
а вторая часть этого батника перемещает файл настроек prefs.xml в нужную папку и самоудаляется после выполнения:

Скрытый текст
@Echo Off
ver |>NUL find /v "5." && if "%~1"=="" (
Echo CreateObject^("Shell.Application"^).ShellExecute WScript.Arguments^(0^),"1","","runas",1 >"%~dp0Elevating.vbs"
cscript.exe //nologo "%~dp0Elevating.vbs" "%~f0"& goto :eof
)


if not exist "%AppData%\Geek Uninstaller\*.*" (md "%AppData%\Geek Uninstaller")
move "prefs.xml" "%AppData%\Geek Uninstaller\prefs.xml"
del /f /q "%systemdrive%\Program Files\Geek Uninstaller\Elevating.vbs"
del "%~f0"

Этот вносит внесения изменений в hosts:
Скрытый текст
@Echo Off
cls
Set "File=hosts."
Set "Folder=%windir%\system32\drivers\etc"

Pushd "%Folder%"||(Pause &Exit /B 2)

Set "@Add001=127.0.0.1 geekuninstaller.com"

Attrib -R -S -H "%File%"

Set /A NOld=1000
FOR /F "usebackq delims=" %%s IN ("%File%") DO (Set /A NOld+=1 &Call Set "@Old%%NOld%%=%%s")
FOR /F "usebackq tokens=1* delims==" %%i IN (`2^>nul Set "@Add"`) DO (Set /A NOld+=1 &Call Set "@Old%%NOld%%=%%j")
FOR /F "usebackq tokens=1* delims==" %%i IN (`2^>nul Set "@Old"`) DO (Set "SS=%%j" &Call Set "@%%i=%%SS: =%%")

>"%File%" (FOR /L %%i IN (1001,1,%NOld%) DO Call :Anal %%i)
attrib +R "%File%"
Popd
GoTo :Eof

:Anal
Call Set "A=%%@@Old%1%%"
If /I "%A%"=="" Exit /B 1
If "%A:~0,1%"=="#" (Call Echo %%@Old%1%%&Exit /B 0)
(Call Echo %%@Old%1%%)
FOR /F "usebackq tokens=1* delims==" %%i IN (`2^>nul Set "@@Old"`) DO If /I "%%j"=="%A%" Call Set "%%i="
Exit /B 0

В итоге должно получиться вот,что.
Батник запускает сам себя от имени администратора,
далее перемещает файл в нужную папку,
далее вносит изменения в hosts и в завершении самоудаляется.

Elven 12-07-2019 08:58 2879486

Не лучшая практика запускать батник самим собой и и заставлять его удалять себя собой же. Это значит раз.
И еще этот батник (или батники?) здорово смахивает на нарушающий пункт 3.18 правил. Это значит два.

BKPB 12-07-2019 09:48 2879489

Цитата:

Цитата Elven
Не лучшая практика запускать батник самим собой и и заставлять его удалять себя собой же. Это значит раз. »

Запуск батника самим себя с помощью .vbs описан на многих форумах "Запуск скрипта с повышенными привилегиями [руководство]", и сколько я им пользовался проблем не было, может они и бывают не знаю, но в моей ситуации другого способа запустить .bat скрыто и от Админа я не нашёл. А уж удалять самого себя, так этих вариантов вообще много и разных.
Цитата:

Цитата Elven
И еще этот батник (или батники?) здорово смахивает на нарушающий пункт 3.18 правил. Это значит два. »

Не знаю, что вы конкретно имели ввиду.
Перемещение файла настроек программы prefs.xml в папку в которой они и должны находиться?
Внесение изменений в hosts?

Если объединить эти файлы невозможно, то скажите почему?
Я в этом не разбираюсь, а если просто скопировать код из одного в другой, то происходит циклический запуск-остановка .cmd окна, при запуске его из Program Files. Если запускать его с Рабочего стола, то он запускается нормально.

BKPB 12-07-2019 13:08 2879501

Тема закрыта.
Решил задачу сам.
Если кому будет интересно, вот что получилось:
Скрытый текст
Код:

@Echo Off
:: Создаём временный файл скрипта .vbs, который запустит батник от имени Администратора
ver |>NUL find /v "5." && if "%~1"=="" (
  Echo CreateObject^("Shell.Application"^).ShellExecute WScript.Arguments^(0^),"1","","runas",1 >"%~dp0Elevating.vbs"
  cscript.exe //nologo "%~dp0Elevating.vbs" "%~f0"& goto :eof
)
 
 
:: Перемещаем файл настроек в папку с настройками программы
if not exist "%AppData%\Geek Uninstaller\*.*" (md "%AppData%\Geek Uninstaller")
move "prefs.xml" "%AppData%\Geek Uninstaller\prefs.xml"
:: Удаляем временный скрипт .vbs
del /f /q "%systemdrive%\Program Files\Geek Uninstaller\Elevating.vbs"

:: Вносим изменения в hosts
cls
        Set "File=hosts."
        Set "Folder=%windir%\system32\drivers\etc"

        Pushd "%Folder%"||(Pause &Exit /B 2)

        Set "@Add001=127.0.0.1 geekuninstaller.com"

        Attrib -R -S -H "%File%"
       
        Set /A NOld=1000
        FOR /F "usebackq delims=" %%s IN ("%File%") DO (Set /A NOld+=1 &Call Set "@Old%%NOld%%=%%s")
        FOR /F "usebackq tokens=1* delims==" %%i IN (`2^>nul Set "@Add"`) DO (Set /A NOld+=1 &Call Set "@Old%%NOld%%=%%j")
        FOR /F "usebackq tokens=1* delims==" %%i IN (`2^>nul Set "@Old"`) DO (Set "SS=%%j" &Call Set "@%%i=%%SS: =%%")

        >"%File%" (FOR /L %%i IN (1001,1,%NOld%) DO Call :Anal %%i)
        attrib +R "%File%"
        Popd
GoTo :Eof

:Anal
        Call Set "A=%%@@Old%1%%"
        If /I "%A%"=="" Exit /B 1
        If "%A:~0,1%"=="#" (Call Echo %%@Old%1%%&Exit /B 0)
        (Call Echo %%@Old%1%%)
        FOR /F "usebackq tokens=1* delims==" %%i IN (`2^>nul Set "@@Old"`) DO If /I "%%j"=="%A%" Call Set "%%i="
:: Батник сам себя удаляет
del "%~f0"


Батник создавался для запуска в папке Program Files, по команде Setup из SFX инсталлятора WinRar.


Время: 11:18.

Время: 11:18.
© OSzone.net 2001-