Не работает скрипт, запущенный через PsExec

Тема в разделе "Пакетные файлы CMD, BAT", создана пользователем alex_diablo, 8 июл 2016.

Метки:
  1. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    добрый день.

    есть скрипт:


    Код (DOS):
    @ECHO OFF
    if exist "C:\Program Files\Unity_5.3.3p2\Editor\Unity.exe" (goto 04) else (goto 00)
    :00
    msg * /server:localhost /time:90 "Attention. After a while, on your computer will be installed Unity version 5.3.3p2. Please save all your projects and close Unity application. Unity 5.3.3p2 installer will be start automaically after 90 seconds."
    ping localhost -n 90
    taskkill /f /im unity.exe /t
    ping localhost -n 15
    c:
    cd C:\ProgramData\Microsoft\Windows\Start Menu\Programs\
    if not exist Unity\nul goto 01
    rename Unity Unity_tmp
    :01
    \\Soft\Developers_Tools\Unity\5.3.3p2\UnitySetup64-5.3.3p2.exe /S /D="C:\Program Files\Unity_5.3.3p2"
    \\Soft\Developers_Tools\Unity\5.3.3p2\UnitySetup-Android-Support-for-Editor-5.3.3p2.exe /S /D="C:\Program Files\Unity_5.3.3p2"
    \\Soft\Developers_Tools\Unity\5.3.3p2\UnitySetup-iOS-Support-for-Editor-5.3.3p2.exe /S /D="C:\Program Files\Unity_5.3.3p2"
    \\Soft\Developers_Tools\Unity\5.3.3p2\UnitySetup-Windows-Support-for-Editor-5.3.3p2.exe /S /D="C:\Program Files\Unity_5.3.3p2"
    if not exist Unity\nul goto 02
    rename Unity Unity_5.3.3p2
    :02
    if not exist Unity_tmp\nul goto 03
    rename Unity_tmp Unity
    :03
    msg * /server:localhost /time:90 "Unity 5.3.3p2 was installed. You can find shortcuts of Unity in START menu. If you have a problems with new version of Unity, please contact with helpdesk for check problems and fix it."
    :04
    del %~dp0installer.bat
     
    скрипт может сделан и коряво, раньше все вроде работало отлично...
    использовал уже не одну сотню раз...
    но сегодня запустил и в результате не устанавливается софт...
    не могу понять, в чем дело.. ничего не менял...
    требуется помощь...

    зы: скрипт устанавливается удаленно через psexec с ключами -s -h
    попробовал запустить скрипт локально - все работает, все ставится. но через psexec перестало, хотя уже год юзаю его и все было отлично. не пойму...
     
    Последнее редактирование: 8 июл 2016
  2. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.476
    Симпатии:
    4.305
    Зачем -s ? Это лишнее. Установщику нужны только права администратора (с UAC, это как раз ключ -h). От системы может неправильно установить, не увидеть улей текущего пользователя.

    1) Что менялось за последнее время? Может имена шар ( \\Soft ), имя папки со скриптом (знаки пробелов есть в пути) ?
    2) Может, банально версии напутали. Там у Вас еще и условие. Они у Вас часто меняются, а у Вас в скрипте жестко всё вшито и повторяется аж 17 раз. Не проще ли было бы один раз создать в начале пакетного файла переменную с номером версии, а уже ее подставлять во все нужные строки?
    Да и C:\Program Files не мешало бы зменить на %ProgramFiles%.
    2) Сообщение появляется на удаленном компе (которое вы вызываете командой msg ) ?
    3) Нет систем ниже Vista ?
    4) Уверены, что процесс Unity корректно завершается, и папка Unity не остаётся заблокированной.
    5) попробуйте что-то по-проще, например, удаленно запустить установщик (уже присутствующий на компе, т.е. не через шару) и без silent ключей.

    В скрипте несколько ошибок, в результате чего на него могут сильно влиять внешние факторы.
    Unity\nul - это совсем корректно.
    Кое-где нужны кавычки и доп. ключи.
    Вот немного подправленный и сокращённый вариант:

    Код (DOS):
    @ECHO OFF
    SetLocal EnableExtensions
    if exist "C:\Program Files\Unity_5.3.3p2\Editor\Unity.exe" goto 04
    :00
    msg * /server:localhost /time:90 "Attention. After a while, on your computer will be installed Unity version 5.3.3p2. Please save all your projects and close Unity application. Unity 5.3.3p2 installer will be start automaically after 90 seconds."
    ping localhost -n 90
    taskkill /f /im unity.exe /t
    ping localhost -n 15
    cd /d "%allusersprofile%\Microsoft\Windows\Start Menu\Programs"
    if exist "Unity\" ren Unity Unity_tmp
    :01
    \\Soft\Developers_Tools\Unity\5.3.3p2\UnitySetup64-5.3.3p2.exe /S /D="C:\Program Files\Unity_5.3.3p2"
    \\Soft\Developers_Tools\Unity\5.3.3p2\UnitySetup-Android-Support-for-Editor-5.3.3p2.exe /S /D="C:\Program Files\Unity_5.3.3p2"
    \\Soft\Developers_Tools\Unity\5.3.3p2\UnitySetup-iOS-Support-for-Editor-5.3.3p2.exe /S /D="C:\Program Files\Unity_5.3.3p2"
    \\Soft\Developers_Tools\Unity\5.3.3p2\UnitySetup-Windows-Support-for-Editor-5.3.3p2.exe /S /D="C:\Program Files\Unity_5.3.3p2"
    if exist "Unity\" ren Unity Unity_5.3.3p2
    :02
    if exist "Unity_tmp\" ren Unity_tmp Unity
    :03
    msg * /server:localhost /time:90 "Unity 5.3.3p2 was installed. You can find shortcuts of Unity in START menu. If you have a problems with new version of Unity, please contact with helpdesk for check problems and fix it."
    :04
    del /f /a "%~dp0installer.bat"
     
  3. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    как я уже сказал, ранее все работало. причем без ключа S как раз и не работало... т.е. изначально работало только -s -h ... хотя ... может быть что-то поменялось в политиках безопасности... потому как в скрипте не менялось ничего.
    по поводу переменных окружения програм файлз - у меня заменено. на самом деле я выложил код файла, который формирует скрипт и записывает его в файл installer.bat (собственно, это уже содержимое этого файла со всеми раскрытыми переменными). посчитал лишним выкладывать здесь код оригинальный, т.к. в нем как раз много нераскрытых переменных , которые объявлены в других кусках кода и нет смысла его выкладывать полностью. думается мне, наверное все же что то поменялось в политиках... потому как если запускать скрипт локально, все устанавливается. т.е. установка от учетки, под которой в данный момент залогинены все ставится. не ставится от системной.. надо спрашивать одминов значит...
     
  4. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.476
    Симпатии:
    4.305
    А есть ли вообще признаки того, что скрипт запустился на целевой машине?
    Просто тяжело давать советы, когда даже примерно не знаешь от чего лечить - то ли PsExec не отработал, то ли неверно работает сам скрипт или ему чего-то не хватает.
     
    Kиpилл нравится это.
  5. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    все оказалось проще... скрипт работал... косяк был в правах на сервере... похерились.. .но сейчас выявил другой баг... не работает проверка на существование файла... не пойму почему...

    Код (DOS):
    if exist "C:\Program Files\Unity_5.3.3p2\Editor\Unity.exe" goto 04
    т.е. по идее если данный файл по этому пути существует, скрипт дальше выполняться не должен. однако же, он успешно выполняется, все устанавливается...
     
  6. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.476
    Симпатии:
    4.305
    alex_diablo, Нужно попробовать запустить напрямую на сервере в CMD команду:
    Код (DOS):

    if exist "C:\Program Files\Unity_5.3.3p2\Editor\Unity.exe" echo YES
     
    и посмотреть, что будет.
     
  7. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    если выполнять команду напрямую локально, как я написал выше, она срабатывает... но у меня батник передается на комп назначения через псэкзек... и почти все пути раскрываются из переменных... но вроде бы все также там.. но почему-то не работает.
     
  8. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.476
    Симпатии:
    4.305
    Если системы разных разрядностей, то путь мог раскрыться по-разному.
    + диск может быть не C:
    А может, сервер всё еще блокирует доступ к этой папке.
     
  9. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    вроде разобрался... не хватало кавычек...

    хотя... странно... вот команда:

    Код (DOS):
    set rate=%PROGRAMFILES%
    if exist %rate%\Unity_5.3.3p2\Editor\Unity.exe goto 04
    разве нужны в нижней строке кавычки? я думал %PROGRAMFILES%
    и так раскрывается как нужно...
    --- Объединённое сообщение, 3 авг 2016 ---
    а еще команда del /f /a "%~dp0installer.bat" раскрывается неправильно. она берет путь с того компа, откуда запускается первоначальный скрипт, а не тот, откуда на удаленной машине запускается скрипт installer.bat

    он должен быть в: C:\windows\system32
     
  10. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.476
    Симпатии:
    4.305
    1)
    Всё дело в последовательности раскрытия.
    Код (DOS):

    if exist %rate%\Unity_5.3.3p2\Editor\Unity.exe goto 04
     
    В этой строке сперва раскрывается переменная, а уж затем исполняется команда, а не наоборот.
    В итоге, интерпретатор перед началом синтаксического разбора видит эту строку, как:
    Код (DOS):

    if exist C:\Program Files\Unity_5.3.3p2\Editor\Unity.exe goto 04
     
    что приводит к проверке на существование объекта "C:\Program" и при его наличии, выполнение команды "Files\Unity_5.3.3p2\Editor\Unity.exe" с аргументом "goto 04"

    2)
    Здесь тоже дело в последовательности.
    Я бы на Вашем месте заставил батник раскрывать переменные непосредственно на целевом компьютере.
    Т.е. Вам нужно сделать так чтобы на целевой ПК попадали не готовые значения, а сами переменные.

    Например в батнике-билдере, следует удвоить проценты и в результате получить что-то вроде:
    Код (DOS):

    set rate=%%PROGRAMFILES%%
    (
    echo if exist "%rate%\Unity_5.3.3p2\Editor\Unity.exe" goto 04
    echo del /f /a "%%~dp0installer.bat"
    ) > result.bat
     
     
    Последнее редактирование модератором: 3 авг 2016
  11. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    понял. попробую. спасибо
     
  12. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    а еще после проверки:
    Код (DOS):
    if exist "C:\Program Files\Unity_5.3.3p2\Editor\Unity.exe" goto 04
    и в случае, если данная папка и файл в ней существуют, нужно сделать проверку на наличие следующих папок:

    Код (DOS):
    C:\Program Files\Unity_5.3.3p2\Editor\Data\PlaybackEngines\iOSSupport
    C:\Program Files\Unity_5.3.3p2\Editor\Data\PlaybackEngines\AndroidPlayer
    C:\Program Files\Unity_5.3.3p2\Editor\Data\PlaybackEngines\WindowsStandaloneSupport
    как правильно в данном случае сделать проверку наличия папки, а не конкретного файла в нем?

    и в случае, если какая-либо из этих папок отсутствует (не установлен сооветствующий компонент),

    выполнялась установка:

    Код (DOS):
    \\Soft\Developers_Tools\Unity\5.3.3p2\UnitySetup-Android-Support-for-Editor-5.3.3p2.exe /S /D="C:\Program Files\Unity_5.3.3p2"
    \\Soft\Developers_Tools\Unity\5.3.3p2\UnitySetup-iOS-Support-for-Editor-5.3.3p2.exe /S /D="C:\Program Files\Unity_5.3.3p2"
    \\Soft\Developers_Tools\Unity\5.3.3p2\UnitySetup-Windows-Support-for-Editor-5.3.3p2.exe /S /D="C:\Program Files\Unity_5.3.3p2"
    а если папка существует (компонент уже был установлен), установка пропускалась и скрипт переходил к проверке наличия
    следующего и дальше так , пока все не проверятся.
     
  13. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.476
    Симпатии:
    4.305
    Точно так же, как и с установкой основного:
    Код (DOS):

    if exist "C:\Program Files\Unity_5.3.3p2\Editor\Unity.exe" (
      if not exist "C:\Program Files\Unity_5.3.3p2\Editor\Data\PlaybackEngines\iOSSupport" \\Soft\Developers_Tools\Unity\5.3.3p2\UnitySetup-iOS-Support-for-Editor-5.3.3p2.exe /S /D="C:\Program Files\Unity_5.3.3p2"
      if not exist "C:\Program Files\Unity_5.3.3p2\Editor\Data\PlaybackEngines\AndroidPlayer" \\Soft\Developers_Tools\Unity\5.3.3p2\UnitySetup-Android-Support-for-Editor-5.3.3p2.exe /S /D="C:\Program Files\Unity_5.3.3p2"
      if not exist "C:\Program Files\Unity_5.3.3p2\Editor\Data\PlaybackEngines\WindowsStandaloneSupport" \\Soft\Developers_Tools\Unity\5.3.3p2\UnitySetup-Windows-Support-for-Editor-5.3.3p2.exe /S /D="C:\Program Files\Unity_5.3.3p2"
      goto 04
    )
     
     
  14. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    с удалением файла installer.bat возникает трабла...
    вот кусок кода из файла-билдера, из которого формируется файл installer.bat и через psexec передается на целевой комп:

    Код (DOS):
    echo ^@ECHO OFF^ >%installer%

    :: check if unity already installed then exit


    %set_all% %set_comp% echo ^if exist "%rate%\Unity_%version%\Editor\Unity.exe" goto 04^ >>%installer%


    :: send message about starting unity installation


    echo ^:00^ >>%installer%

    echo ^msg * /server:localhost /time:300 "Attention. After a while, on your computer will be installed Unity version %version%. Please save all your projects and close Unity application. Unity %version% installer will be start automaically after 5 minutes in silent mode."^ >>%installer%
    echo ^ping localhost -n 300^ >>%installer%
    echo ^taskkill /f /im unity.exe /t^ >>%installer%
    echo ^ping localhost -n 30^ >>%installer%
    %set_comp% echo ^cd /d %shortcut%^ >>%installer%
    %set_comp% echo ^if exist "Unity\" ren Unity Unity_tmp^ >>%installer%
    %set_comp% echo ^:01^ >>%installer%
    %set_comp% echo ^%unity_path% /S /D=%rate%\Unity_%version%^ >>%installer%

    ::components


    if exist %android% (echo ^%android% /S /D=%rate%\Unity_%version%^ >>%installer%)
    if exist %ios% (echo ^%ios% /S /D=%rate%\Unity_%version%^ >>%installer%)
    if exist %wind% (echo ^%wind% /S /D=%rate%\Unity_%version%^ >>%installer%)

    %set_comp% echo ^if exist "Unity\" ren Unity Unity_%version%^ >>%installer%
    %set_comp% echo ^:02^ >>%installer%
    %set_comp% echo ^if exist "Unity_tmp\" ren Unity_tmp Unity^ >>%installer%
    %set_comp% echo ^:03^ >>%installer%
    echo ^msg * /server:localhost /time:300 "Unity %version% was installed. You can find shortcuts of Unity in START menu. If you have a problems with new version of Unity or with license, please contact with helpdesk for check problems and fix it."^ >>%installer%
    %set_all% %set_comp% echo ^goto 05^ >>%installer%
    %set_all% %set_comp% echo ^:04^ >>%installer%
    %set_all% %set_comp% echo ^msg * /server:localhost /time:300 "Unity %version% already exist. Installation aborted."^ >>%installer%
    %set_comp% echo ^:05^ >>%installer%


    echo ^del /f /a "%%~dp0installer.bat"^ >>%installer%

    pause
    :setup

    %psexec% -s -h -d @%hostfile% -c -f %installer%
    вот содержимое сформированного файла installer.bat:

    Код (DOS):
    @ECHO OFF
    :00
    msg * /server:localhost /time:15 "Attention. After a while, on your computer will be installed Unity version 5.3.4f1. Please save all your projects and close Unity application. Unity 5.3.4f1 installer will be start automaically after 5 minutes in silent mode."
    ping localhost -n 15
    taskkill /f /im unity.exe /t
    ping localhost -n 30
    cd /d "C:\ProgramData\Microsoft\Windows\Start Menu\Programs"
    if exist "Unity\" ren Unity Unity_tmp
    :01
    \\fsmsk1\Soft\Developers_Tools\Unity\5.3.4\UnitySetup64-5.3.4f1.exe /S /D=%PROGRAMFILES%\Unity_5.3.4f1
    \\fsmsk1\Soft\Developers_Tools\Unity\5.3.4\UnitySetup-Android-Support-for-Editor-5.3.4f1.exe /S /D=%PROGRAMFILES%\Unity_5.3.4f1
    \\fsmsk1\Soft\Developers_Tools\Unity\5.3.4\UnitySetup-iOS-Support-for-Editor-5.3.4f1.exe /S /D=%PROGRAMFILES%\Unity_5.3.4f1
    \\fsmsk1\Soft\Developers_Tools\Unity\5.3.4\UnitySetup-Windows-Support-for-Editor-5.3.4f1.exe /S /D=%PROGRAMFILES%\Unity_5.3.4f1
    if exist "Unity\" ren Unity Unity_5.3.4f1
    :02
    if exist "Unity_tmp\" ren Unity_tmp Unity
    :03
    msg * /server:localhost /time:300 "Unity 5.3.4f1 was installed. You can find shortcuts of Unity in START menu. If you have a problems with new version of Unity or with license, please contact with helpdesk for check problems and fix it."
    :05
    del /f /a "%~dp0installer.bat"
     
    скрипт отрабатывает полностью корректно, но файл installer.bat после выполнения так и продолжает лежать в system32...

    зы. пробовал psexec запускать без ключа -s . не отрабатывает. с ключом нормально.
     
  15. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.476
    Симпатии:
    4.305
    Попробуйте заменить:
    Код (DOS):

    del /f /a "%~dp0installer.bat"
     
    на
    Код (DOS):

    del /f /a "%~fs0"
     
    соответственно:
    Код (DOS):

    echo del /f /a "%%~fs0">>%installer%
     
    для билдера.

    Вообще, при таком формате запуска (через psexec), %0 может ссылаться на оригинальный батник (нужно проверять).
    Если не поможет, то пропишите просто:
    Код (DOS):

    echo del /f /a "%%systemroot%%\system32\installer.bat">>%installer%
     
     
  16. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    вообще заметил... если не переходить в каталог
    Код (DOS):
    cd /d "C:\ProgramData\Microsoft\Windows\Start Menu\Programs"
    ,
    то после выполнения скрипта файл удаляется (есть у меня такой функционал). но если делается переход, то не удаляется.

    забить? просто жестко прописать
    Код (DOS):
    echo del /f /a "%%systemroot%%\system32\installer.bat">>%installer%
    ?
     
  17. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.476
    Симпатии:
    4.305
    %SystemRoot% будет раскрываться правильно, так что ничего страшного.
    Если скрипт запускается через psexec так как у Вас, то он всегда и будет копироваться в эту папку.
    --- Объединённое сообщение, 5 авг 2016 ---
    Тогда всё ясно.
    psexec автоматически устанавливает c:\windows\system32 в качестве рабочего каталога.
    Если Вы не переходите в другую папку, то файл installer.bat удаляется, потому что часть %~dp0 раскрывалась на сервере в "ничто".
     
  18. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    понял. пропишу через %SystemRoot%
     

Поделиться этой страницей