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

alex_diablo

Постоянный участник
Сообщения
144
Реакции
9
добрый день.

есть скрипт:


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 перестало, хотя уже год юзаю его и все было отлично. не пойму...
 
Последнее редактирование:
Зачем -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"
 
как я уже сказал, ранее все работало. причем без ключа S как раз и не работало... т.е. изначально работало только -s -h ... хотя ... может быть что-то поменялось в политиках безопасности... потому как в скрипте не менялось ничего.
по поводу переменных окружения програм файлз - у меня заменено. на самом деле я выложил код файла, который формирует скрипт и записывает его в файл installer.bat (собственно, это уже содержимое этого файла со всеми раскрытыми переменными). посчитал лишним выкладывать здесь код оригинальный, т.к. в нем как раз много нераскрытых переменных , которые объявлены в других кусках кода и нет смысла его выкладывать полностью. думается мне, наверное все же что то поменялось в политиках... потому как если запускать скрипт локально, все устанавливается. т.е. установка от учетки, под которой в данный момент залогинены все ставится. не ставится от системной.. надо спрашивать одминов значит...
 
А есть ли вообще признаки того, что скрипт запустился на целевой машине?
Просто тяжело давать советы, когда даже примерно не знаешь от чего лечить - то ли PsExec не отработал, то ли неверно работает сам скрипт или ему чего-то не хватает.
 
все оказалось проще... скрипт работал... косяк был в правах на сервере... похерились.. .но сейчас выявил другой баг... не работает проверка на существование файла... не пойму почему...

CMD/BATCH:
if exist "C:\Program Files\Unity_5.3.3p2\Editor\Unity.exe" goto 04

т.е. по идее если данный файл по этому пути существует, скрипт дальше выполняться не должен. однако же, он успешно выполняется, все устанавливается...
 
alex_diablo, Нужно попробовать запустить напрямую на сервере в CMD команду:
CMD/BATCH:
if exist "C:\Program Files\Unity_5.3.3p2\Editor\Unity.exe" echo YES
и посмотреть, что будет.
 
если выполнять команду напрямую локально, как я написал выше, она срабатывает... но у меня батник передается на комп назначения через псэкзек... и почти все пути раскрываются из переменных... но вроде бы все также там.. но почему-то не работает.
 
Если системы разных разрядностей, то путь мог раскрыться по-разному.
+ диск может быть не C:
А может, сервер всё еще блокирует доступ к этой папке.
 
вроде разобрался... не хватало кавычек...

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

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
 
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
 
Последнее редактирование модератором:
а еще после проверки:
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"

а если папка существует (компонент уже был установлен), установка пропускалась и скрипт переходил к проверке наличия
следующего и дальше так , пока все не проверятся.
 
Точно так же, как и с установкой основного:
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
)
 
с удалением файла 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 . не отрабатывает. с ключом нормально.
 
Попробуйте заменить:
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%
 
вообще заметил... если не переходить в каталог
CMD/BATCH:
cd /d "C:\ProgramData\Microsoft\Windows\Start Menu\Programs"
,
то после выполнения скрипта файл удаляется (есть у меня такой функционал). но если делается переход, то не удаляется.

забить? просто жестко прописать
CMD/BATCH:
echo del /f /a "%%systemroot%%\system32\installer.bat">>%installer%
?
 
забить? просто жестко прописать
%SystemRoot% будет раскрываться правильно, так что ничего страшного.
Если скрипт запускается через psexec так как у Вас, то он всегда и будет копироваться в эту папку.
вообще заметил... если не переходить в каталог
Тогда всё ясно.
psexec автоматически устанавливает c:\windows\system32 в качестве рабочего каталога.
Если Вы не переходите в другую папку, то файл installer.bat удаляется, потому что часть %~dp0 раскрывалась на сервере в "ничто".
 
Назад
Сверху Снизу