Что нового

Проблемма с относительными путями.

ivsatel

Продвинутый
Сообщения
319
Репутация
84
Версия AutoIt: v3.3.4.0

Описание:

Скрипт из одной комманды, запустить Setup_XP.cmd
Код:
Run("c:\WINDOWS\Temp\Ru\UnPack\Setup_XP.cmd")
@echo off

SetLocal EnableExtensions
SetLocal EnableDelayedExpansion

rem ---Считываем файлы конфигурации Set.txt, OS_ver.txt, Text_ru.txt(Text_en.txt) из папки Config---
for /F "tokens=*" %%s in (.\Config\Set.txt) do set %%s
for /F "tokens=*" %%s in (.\Config\OS_ver.txt) do set %%s
(if "%Chk_Lang%"=="Russian" set Chk_Lang3=%Chk_Lang1%)&(if "%Chk_Lang%"=="English" set Chk_Lang3=%Chk_Lang2%)
for /f "tokens=3" %%c in ('reg query "%detect_CP%" /v OEMCP^|findstr /I /C:"OEMCP"') do if "%%c"=="866" (set text_lang=Text_ru.txt) else (set text_lang=Text_en.txt)
for /F "tokens=*" %%s in (.\Config\%text_lang%) do set %%s

rem ---Задаем заголовок окна CMD---
Title %Title_Cmd%

rem ---Скрываем окно CMD по заголовку---
start /WAIT /MIN .\Tools\nircmd.exe win hide title "%Title_Cmd%"
%delay%

rem ---Вызываем процедуру проверки соответствия версии и языка операционной системы---
call :chk

rem ---Выводим информационное сообщение о начале установки обновлений поверх всех окон со звуковым оповещением---
start .\Tools\nircmd.exe infobox %Text_InfoBox_2% %Title_InfoBox%
start /WAIT /MIN .\Tools\nircmd.exe beep 1500 2000
start /WAIT /MIN .\Tools\nircmd.exe win settopmost title %Title_InfoBox% 1

rem ---Делаем запись даты и времени выполнения скрипта в журналы Installed_Updates.log и Detected_Updates.log---
echo Date of installation: %time:~,-6% %date%>>%SystemDrive%\Installed_Updates.log&echo Date of detection: %time:~,-6% %date%>>%SystemDrive%\Detected_Updates.log
echo.>>%SystemDrive%\Installed_Updates.log&echo.>>%SystemDrive%\Detected_Updates.log

rem ---Включаем отображение расширений файлов в проводнике (только если существует файл HideFileExt.reg в папке Tools)---
if exist .\Tools\HideFileExt.reg start /high /wait regedit /s .\Tools\HideFileExt.reg

rem ---Отключаем службу восстановления системы (только если существует файл DisableSR.reg в папке Tools)---
if exist .\Tools\DisableSR.reg (
start /high /wait regedit /s .\Tools\DisableSR.reg
start /high /wait sc stop srservice >nul
)
rem ---Вызываем процедуру установки Microsoft .Net Framework 3.5 SP1 Rus---
call :dotnetfx

rem ---Для каждой не пустой строки файла KB.txt из папки Config вызываем процедуру :KBInst---
for /F "tokens=1,* delims= " %%k in (.\Config\KB.txt) do call :KBInst "%%k" "%%l"

rem ---Если установлено обновление KB890830 создаем ярлык (меню Пуск->Программы) для исполняемого файла в папке заданной в файле Text_ru.txt (Text_en.txt)---
if exist "%WINDIR%\System32\MRT.exe" .\Tools\nircmd shortcut "%WINDIR%\System32\MRT.exe" "~$folder.common_programs$\%MRT_Group%" "Microsoft Removal Tool"

rem ---Вызываем процедуру удаления ярлыков Internet Explorer с рабочего стола и панели быстрого запуска---
call :IEclrlnk

rem ---Вызываем процедуру установки Windows Roots Update---
call :rootsupdate

rem ---Вызываем процедуру установки библиотек VC++ 2005 и VC++ 2008---
call :VC++

if exist .\KBxxxxxx\KB905474.exe if exist .\WGA\WGAUpdate.exe start /wait .\WGA\WGAUpdate.exe

rem ---Записываем по две пустые строки в журналы Installed_Updates.log и Detected_Updates.log---
echo.>>%SystemDrive%\Installed_Updates.log&echo.>>%SystemDrive%\Installed_Updates.log&echo.>>%SystemDrive%\Detected_Updates.log&echo.>>%SystemDrive%\Detected_Updates.log

rem ---Распаковываем утилиту nircmd.exe в папку %SystemRoot%\TEMP---
start /WAIT /MIN .\Tools\NirCmdInst.exe

rem ---После перезагрузки выводим информационное сообщение о полном окончании установки---
reg add HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce /v ReadyPreSP3 /t REG_SZ /d "%SystemRoot%\TEMP\nircmd.exe infobox \"%Text_InfoBox_4%\" \%Title_InfoBox:~,-1%\"" /f >nul

rem ---Проверяем значение ключа принудительной перезагрузки после окончания установки обновлений---
if %ForceReboot%==Yes ( rem ---Выводим информационное сообщение об окончании установки обновлений и предстоящей перезагрузке со звуковым оповещением---
start /WAIT /MIN %SystemRoot%\TEMP\nircmd.exe win close title %Title_InfoBox%
start %SystemRoot%\TEMP\nircmd.exe infobox %Text_InfoBox_3% %Title_InfoBox%
start /WAIT /MIN %SystemRoot%\TEMP\nircmd.exe beep 200 800

rem ---Выполняем перезагрузку после 10 секундной задержки---
start /B %SystemRoot%\TEMP\nircmd.exe cmdwait 10000 exitwin reboot forceifhung
) else (rem ---Выводим информационное сообщение об окончании установки обновлений и необходимости в перезагрузке ---
start /WAIT /MIN %SystemRoot%\TEMP\nircmd.exe win close title %Title_InfoBox%
start %SystemRoot%\TEMP\nircmd.exe infobox %Text_InfoBox_5% %Title_InfoBox%
start %SystemRoot%\TEMP\nircmd.exe beep 200 800
)

exit

rem ===============
rem ===ПРОЦЕДУРЫ===
rem ===============

rem ---Процедура проверки соответствия версии и языка операционной системы---
:chk
rem ---Проверяем версию операционной системы---
for /f "tokens=2*" %%v in ('reg query "%detect_SP%" /v ProductName^|findstr /I /C:"ProductName"') do (
if not "%%w"=="%Chk_OS%" (
start .\Tools\nircmd.exe infobox %Text_InfoBox_0% %Title_InfoBox%
exit
)
)
rem ---Проверяем версию Service Pack операционной системы---
for /f "tokens=5" %%p in ('reg query "%detect_SP%" /v CSDVersion') do (
if not "%%p"=="%Chk_SP:~-1%" (
start .\Tools\nircmd.exe infobox %Text_InfoBox_0% %Title_InfoBox%
exit
)
)
rem ---Проверяем язык операционной системы---
if not exist "%ALLUSERSPROFILE%\%Chk_Lang3%" (
start .\Tools\nircmd.exe infobox %Text_InfoBox_1% %Title_InfoBox%
exit
)
goto :EOF

rem ---Процедура установки Microsoft .Net Framework 3.5 SP1 Rus с проверкой существования папки .\dotnetfx35 и сведений о данной версии в реестре---
:dotnetfx
if exist .\dotnetfx35 (
reg query "%detect_NET%" 1>nul 2>&1
if !ERRORLEVEL!==1 (
%delay%
xcopy .\dotnetfx35\dotnetfx35langpack_x86ru.exe %TEMP%\dotnetfx3530729.01\1033\dotnetfx35\x86\*.exe /Y >nul
start /wait .\dotnetfx35\dotnetfx35.exe %NetSwitches%
echo dotnetfx35 %NetSwitches%>>%SystemDrive%\Installed_Updates.log
(%delay%)&(%NetStop%)
for /f "tokens=3" %%k in ('reg query "%detect_KB954550%" /v Location') do set NetPath=%%~dk%%~pk
rem rd /S /Q "!NetPath:~,-1!"
attrib +h !NetPath:~,-1!
%delay%
) ELSE (echo .NET Framework 3.5 SP1 Rus detected in %detect_NET%>>%SystemDrive%\Detected_Updates.log)
reg query "%detect_NET%" 1>nul 2>&1
if !ERRORLEVEL!==0 (
reg query "%detect_KB958481%" 1>nul 2>&1
if !ERRORLEVEL!==1 (
start /wait .\dotnetfx35\ndp20sp2-kb958481-x86.exe %NetUpdatesSwitches%
echo KB958481 %NetUpdatesSwitches%>>%SystemDrive%\Installed_Updates.log
(%delay%)&(%NetStop%)
) ELSE (echo KB958481 detected in %detect_KB958481%>>%SystemDrive%\Detected_Updates.log)
reg query "%detect_KB958483%" 1>nul 2>&1
if !ERRORLEVEL!==1 (
start /wait .\dotnetfx35\ndp30sp2-kb958483-x86.exe %NetUpdatesSwitches%
echo KB958483 %NetUpdatesSwitches%>>%SystemDrive%\Installed_Updates.log
(%delay%)&(%NetStop%)
) ELSE (echo KB958483 detected in %detect_KB958483%>>%SystemDrive%\Detected_Updates.log)
reg query "%detect_KB958484%" 1>nul 2>&1
if !ERRORLEVEL!==1 (
start /wait .\dotnetfx35\ndp35sp1-kb958484-x86.exe %NetUpdatesSwitches%
echo KB958484 %NetUpdatesSwitches%>>%SystemDrive%\Installed_Updates.log
(%delay%)&(%NetStop%)
) ELSE (echo KB958484 detected in %detect_KB958484%>>%SystemDrive%\Detected_Updates.log)
)
)
goto :EOF

rem ---Процедура для установки обновлений из папки KBxxxxxx перечисленных в KB.txt---
:KBInst
rem ---Имя текущего обновления из файла KB.txt (значение первого параметра переданного данной процедуре) присваиваем переменной number---
set number=%~1
rem ---По умолчанию считаем, что ключи для установки текущего обновления в файле KB.txt не определены---
set UserSwitches=No
rem ---Если в файле KB.txt после имени обновления заданы ключи для установки обновления, присваиваем их переменной UserSwitches---
if not %2=="" set UserSwitches=%~2
rem ---По-умолчанию считаем, что ни одно обновление из папки KBxxxxxx не установлено---
set detect_key=0

rem ---Для "особенных" обновлений выполняем "особенную" проверку на предмет необходимости установки и прерываем выполнение процедуры в случае обнаружения сведений---
if %number%==KB923789 if not exist "%detect_KB923789%" (echo %number% new version of Macromedia Flash already installed>>%SystemDrive%\Detected_Updates.log)&(goto :EOF)
if %number%==KB946648 if not exist "%detect_KB946648%" (echo %number% skipped %detect_KB946648% not exist>>%SystemDrive%\Installed_Updates.log)&(goto :EOF)
if %number:~,3%==IE7 set detect_IE=%detect_IE7%
if %number:~,3%==IE8 set detect_IE=%detect_IE8%
if %number:~,3%==wua if exist "%detect_WUA%" (echo %number% detected in %detect_WUA%>>%SystemDrive%\Detected_Updates.log)&(goto :EOF)
if %number%==KB961118 (
reg query "%detect_NET%" 1>nul 2>&1
if !ERRORLEVEL!==1 (echo %number% skipped MS .Net Framework 3.5 SP1 not detected>>%SystemDrive%\Installed_Updates.log)&(goto :EOF)
)
if %number%==KB963707 (
reg query "%detect_NET%" 1>nul 2>&1
if !ERRORLEVEL!==1 (echo %number% skipped MS .Net Framework 3.5 SP1 not detected>>%SystemDrive%\Installed_Updates.log)&(goto :EOF)
)
if %number%==KB974417 (
reg query "%detect_NET%" 1>nul 2>&1
if !ERRORLEVEL!==1 (echo %number% skipped MS .Net Framework 3.5 SP1 not detected>>%SystemDrive%\Installed_Updates.log)&(goto :EOF)
)
if %number%==msxml4 (
reg query "%detect_msxml4%" 1>nul 2>&1
if !ERRORLEVEL!==0 (echo %number% detected in %detect_msxml4%>>%SystemDrive%\Detected_Updates.log)&(goto :EOF)
)
if %number%==KB890830 if exist %windir%\system32\mrt.exe for /f "tokens=1" %%d in ('dir %windir%\system32\mrt.exe /T:W^|findstr /I /C:"mrt"') do (
if "%%d"=="%cur_date_mrt%" (echo %number% detected in %windir%\system32\mrt.exe - modified %%d>>%SystemDrive%\Detected_Updates.log)&(goto :EOF)
)
if %number%==KB905474 if not exist ".\KBxxxxxx\KB905474.exe" goto :EOF
rem ---Выполняем запрос сведений об обновлении во всех ветках реестра указанных в файле RegKeys.txt из папки Config и прерываем поиск при успешном запросе---
for /F "tokens=*" %%l in (.\Config\RegKeys.txt) do (
reg query "%%l" 1>nul 2>&1
if !ERRORLEVEL!==0 (set detect_key=1)&(echo !number! detected in %%l>>%SystemDrive%\Detected_Updates.log)&(goto chk_detect)
)
:chk_detect
rem ---Выполняем установку обновления если сведения в реестре не обнаружены---
if !detect_key!==0 (
rem ---Выполняем анализ наличия или отсутствия переопределения (в KB.txt) ключей установщика заданных по-умолчанию (в Set.txt)---
if !UserSwitches!==No (
if exist .\KBxxxxxx\%number%.exe (start /wait .\KBxxxxxx\%number%.exe %MainSwitches%) else (
if exist .\KBxxxxxx\%number%.msi (start /wait .\KBxxxxxx\%number%.msi !MainSwitches!) else (
echo %number% skipped file not found in KBxxxxxx>>%SystemDrive%\Installed_Updates.log)&(goto :EOF)
)
echo %number% %MainSwitches%>>%SystemDrive%\Installed_Updates.log
) ELSE (
if exist .\KBxxxxxx\%number%.exe (start /wait .\KBxxxxxx\%number%.exe !UserSwitches!) else (
if exist .\KBxxxxxx\%number%.msi (start /wait .\KBxxxxxx\msiexec /i %number%.msi !UserSwitches!) else (
if exist .\KBxxxxxx\%number%.cmd (start /wait /min .\KBxxxxxx\%number%.cmd !UserSwitches!)&(goto :EOF) else (
echo %number% skipped file not found in KBxxxxxx>>%SystemDrive%\Installed_Updates.log)&(goto :EOF)
)
)
echo %number% !UserSwitches!>>%SystemDrive%\Installed_Updates.log
)
rem ---Выполняем задержку перед установкой следующего обновления---
%delay%
goto :EOF
)
goto :EOF

rem ---Процедура удаления ярлыков Internet Explorer с рабочего стола и панели быстрого запуска с проверкой существования папки .\IE и сведений в реестре---
:IEclrlnk
if exist .\IE if exist "%USERPROFILE%\Application Data\Microsoft\Internet Explorer\Quick Launch\*Internet Explorer*.lnk" (
reg query "%detect_IE%" 1>nul 2>&1
if !ERRORLEVEL!==0 (
start /wait regedit /s .\IE\DDL_IE.reg
start /wait /min .\Tools\nircmd.exe shellrefresh
start /wait .\IE\IElnk.exe
)
)
goto :EOF

rem ---Процедура установки Windows Roots Update с проверкой соответствия текущей версии указанной в Set.txt---
:rootsupdate
for /f "tokens=3 delims= " %%v in ('reg query "%detect_rootsupd%" /v Version') do set detect_ver_rootsupd=%%v
if not "%detect_ver_rootsupd%"=="%cur_ver_rootsupd%" (.\Other\rootsupd.exe %OldSwitches%&echo Windows Roots Update %OldSwitches% - ver:"%cur_ver_rootsupd%">>%SystemDrive%\Installed_Updates.log
) ELSE echo Windows Roots Update detected in %detect_rootsupd%>>%SystemDrive%\Detected_Updates.log
goto :EOF

rem ---Процедура установки библиотек VC++ 2005 и VC++ 2008 с проверкой существования папки .\VC++ и веток реестра указанных в Set.txt
:VC++
if exist .\VC++ (
reg query "%detect_VC05%" 1>nul 2>&1
if !ERRORLEVEL!==1 (
start /wait .\VC++\vcredist_x86_2005.exe %OldSwitches%
echo VC++ 2005 %OldSwitches%>>%SystemDrive%\Installed_Updates.log
%delay%
) ELSE echo VC++ 2005 detected in %detect_VC05%>>%SystemDrive%\Detected_Updates.log

reg query "%detect_VC08%" 1>nul 2>&1
if !ERRORLEVEL!==1 (
start /wait .\VC++\vcredist_x86_2008.exe %OldSwitches%
echo VC++ 2008 %OldSwitches%>>%SystemDrive%\Installed_Updates.log
%delay%
) ELSE echo VC++ 2008 detected in %detect_VC08%>>%SystemDrive%\Detected_Updates.log
)
goto :EOF
После этого происходит следующее:
Как это победить?
Примечания:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
ivsatel
Так судя по скринам, ошибка в батнике, при чем тут AutoIt?
 
Автор
I

ivsatel

Продвинутый
Сообщения
319
Репутация
84
Батник ведь работает только если по нему мышкой или Enter. А почему через скрипт такое, не понятно. Может нужно подключать библиотеки для запуска такого рода батников?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
ivsatel
Тогда попробуй положить скрипт в одну папку с батником. В скрипте 1 строка
Код:
Run("Setup_XP.cmd")


А на рабочий стол (или еще куда бросить ярлык на скрипт) и запустить и из exe и ярлыком.
 
Автор
I

ivsatel

Продвинутый
Сообщения
319
Репутация
84
В общем, после двух дневных экспериментов получилось следующее:
1. создал второй батник 1.cmd с содержанием:
Код:
CD /d C:\WINDOWS\Temp\Ru\UnPack
START /HIGH /WAIT /MIN CALL Setup_XP.cmd
2. скрипт обращается к батнику:
Код:
RunWait(@COMSPEC & " /c Start %SystemRoot%\Temp\1.cmd")
здесь батник 1.cmd находит и запускает Setup_XP.cmd
все заработало, но проблема с относительными путями так и осталась не решенной.
 

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
ivsatel
А что, если вот так попробовать:

Код:
$PATH="c:\WINDOWS\Temp\Ru\UnPack"
ShellExecute($PATH&"\Setup_XP.cmd","",$PATH)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
ivsatel
У меня такой код работает:
Код:
#include <Constants.au3>

$path = @WindowsDir & "\Temp\Ru\UnPack"
$batfile = "Setup_XP.cmd"
$sLog = ""

$result = Run($path & "\" & $batfile, $path, @SW_HIDE, $STDOUT_CHILD)
While 1
	$sLog &= StdoutRead($result)
	If @error Then ExitLoop
	Sleep(10)
WEnd
MsgBox(0, "", $sLog)


Единственный минус, кракозябры выводит, надо кодировку менять или в файл
$sLog записать. Для этого надо в конце добавить:
Код:
FileWrite("er.txt", $sLog)
 
Автор
I

ivsatel

Продвинутый
Сообщения
319
Репутация
84
snoitaleR сказал(а):
ivsatel
А что, если вот так попробовать:

Код:
$PATH="c:\WINDOWS\Temp\Ru\UnPack"
ShellExecute($PATH&"\Setup_XP.cmd","",$PATH)
Эти две строчки спасли мир!
madmasles
Спасибо за твой вариант.
 
Верх