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

alex_diablo

Активный пользователь
Сообщения
144
Реакции
9
Баллы
98
добрый день.

есть скрипт:


CMD/BATCH:
@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 перестало, хотя уже год юзаю его и все было отлично. не пойму...
 
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,159
Реакции
5,942
Баллы
718
Зачем -s ? Это лишнее. Установщику нужны только права администратора (с UAC, это как раз ключ -h). От системы может неправильно установить, не увидеть улей текущего пользователя.

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

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

CMD/BATCH:
@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"
 

alex_diablo

Активный пользователь
Сообщения
144
Реакции
9
Баллы
98
как я уже сказал, ранее все работало. причем без ключа S как раз и не работало... т.е. изначально работало только -s -h ... хотя ... может быть что-то поменялось в политиках безопасности... потому как в скрипте не менялось ничего.
по поводу переменных окружения програм файлз - у меня заменено. на самом деле я выложил код файла, который формирует скрипт и записывает его в файл installer.bat (собственно, это уже содержимое этого файла со всеми раскрытыми переменными). посчитал лишним выкладывать здесь код оригинальный, т.к. в нем как раз много нераскрытых переменных , которые объявлены в других кусках кода и нет смысла его выкладывать полностью. думается мне, наверное все же что то поменялось в политиках... потому как если запускать скрипт локально, все устанавливается. т.е. установка от учетки, под которой в данный момент залогинены все ставится. не ставится от системной.. надо спрашивать одминов значит...
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,159
Реакции
5,942
Баллы
718
А есть ли вообще признаки того, что скрипт запустился на целевой машине?
Просто тяжело давать советы, когда даже примерно не знаешь от чего лечить - то ли PsExec не отработал, то ли неверно работает сам скрипт или ему чего-то не хватает.
 

alex_diablo

Активный пользователь
Сообщения
144
Реакции
9
Баллы
98
все оказалось проще... скрипт работал... косяк был в правах на сервере... похерились.. .но сейчас выявил другой баг... не работает проверка на существование файла... не пойму почему...

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

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,159
Реакции
5,942
Баллы
718
alex_diablo, Нужно попробовать запустить напрямую на сервере в CMD команду:
CMD/BATCH:
if exist "C:\Program Files\Unity_5.3.3p2\Editor\Unity.exe" echo YES
и посмотреть, что будет.
 

alex_diablo

Активный пользователь
Сообщения
144
Реакции
9
Баллы
98
если выполнять команду напрямую локально, как я написал выше, она срабатывает... но у меня батник передается на комп назначения через псэкзек... и почти все пути раскрываются из переменных... но вроде бы все также там.. но почему-то не работает.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,159
Реакции
5,942
Баллы
718
Если системы разных разрядностей, то путь мог раскрыться по-разному.
+ диск может быть не C:
А может, сервер всё еще блокирует доступ к этой папке.
 

alex_diablo

Активный пользователь
Сообщения
144
Реакции
9
Баллы
98
вроде разобрался... не хватало кавычек...

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

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

он должен быть в: C:\windows\system32
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,159
Реакции
5,942
Баллы
718
1)
разве нужны в нижней строке кавычки? я думал %PROGRAMFILES%
и так раскрывается как нужно...
Всё дело в последовательности раскрытия.
CMD/BATCH:
if exist %rate%\Unity_5.3.3p2\Editor\Unity.exe goto 04
В этой строке сперва раскрывается переменная, а уж затем исполняется команда, а не наоборот.
В итоге, интерпретатор перед началом синтаксического разбора видит эту строку, как:
CMD/BATCH:
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)
а еще команда del /f /a "%~dp0installer.bat" раскрывается неправильно.
Здесь тоже дело в последовательности.
Я бы на Вашем месте заставил батник раскрывать переменные непосредственно на целевом компьютере.
Т.е. Вам нужно сделать так чтобы на целевой ПК попадали не готовые значения, а сами переменные.

Например в батнике-билдере, следует удвоить проценты и в результате получить что-то вроде:
CMD/BATCH:
set rate=%%PROGRAMFILES%%
(
echo if exist "%rate%\Unity_5.3.3p2\Editor\Unity.exe" goto 04
echo del /f /a "%%~dp0installer.bat"
) > result.bat
 
Последнее редактирование модератором:

alex_diablo

Активный пользователь
Сообщения
144
Реакции
9
Баллы
98
понял. попробую. спасибо
 

alex_diablo

Активный пользователь
Сообщения
144
Реакции
9
Баллы
98
а еще после проверки:
CMD/BATCH:
if exist "C:\Program Files\Unity_5.3.3p2\Editor\Unity.exe" goto 04
и в случае, если данная папка и файл в ней существуют, нужно сделать проверку на наличие следующих папок:

CMD/BATCH:
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
как правильно в данном случае сделать проверку наличия папки, а не конкретного файла в нем?

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

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

CMD/BATCH:
\\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"
а если папка существует (компонент уже был установлен), установка пропускалась и скрипт переходил к проверке наличия
следующего и дальше так , пока все не проверятся.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,159
Реакции
5,942
Баллы
718
Точно так же, как и с установкой основного:
CMD/BATCH:
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
)
 

alex_diablo

Активный пользователь
Сообщения
144
Реакции
9
Баллы
98
с удалением файла installer.bat возникает трабла...
вот кусок кода из файла-билдера, из которого формируется файл installer.bat и через psexec передается на целевой комп:

CMD/BATCH:
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:

CMD/BATCH:
@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 . не отрабатывает. с ключом нормально.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,159
Реакции
5,942
Баллы
718
Попробуйте заменить:
CMD/BATCH:
del /f /a "%~dp0installer.bat"
на
CMD/BATCH:
del /f /a "%~fs0"
соответственно:
CMD/BATCH:
echo del /f /a "%%~fs0">>%installer%
для билдера.

Вообще, при таком формате запуска (через psexec), %0 может ссылаться на оригинальный батник (нужно проверять).
Если не поможет, то пропишите просто:
CMD/BATCH:
echo del /f /a "%%systemroot%%\system32\installer.bat">>%installer%
 

alex_diablo

Активный пользователь
Сообщения
144
Реакции
9
Баллы
98
вообще заметил... если не переходить в каталог
CMD/BATCH:
cd /d "C:\ProgramData\Microsoft\Windows\Start Menu\Programs"
,
то после выполнения скрипта файл удаляется (есть у меня такой функционал). но если делается переход, то не удаляется.

забить? просто жестко прописать
CMD/BATCH:
echo del /f /a "%%systemroot%%\system32\installer.bat">>%installer%
?
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,159
Реакции
5,942
Баллы
718
забить? просто жестко прописать
%SystemRoot% будет раскрываться правильно, так что ничего страшного.
Если скрипт запускается через psexec так как у Вас, то он всегда и будет копироваться в эту папку.
вообще заметил... если не переходить в каталог
Тогда всё ясно.
psexec автоматически устанавливает c:\windows\system32 в качестве рабочего каталога.
Если Вы не переходите в другую папку, то файл installer.bat удаляется, потому что часть %~dp0 раскрывалась на сервере в "ничто".
 

alex_diablo

Активный пользователь
Сообщения
144
Реакции
9
Баллы
98
понял. пропишу через %SystemRoot%
 
Сверху Снизу