Войти

Показать полную графическую версию : Условие IF и скобки


Emulty
10-12-2016, 15:39
Приветствую!

Помогите, пожалуйста, не могу понять чего не хватает. Нужно добавить в батнике по условию параметры в реестр. Как только вношу строки в условие, используя скобки, то перестаёт корректно отрабатывать.

Так работает:
REG ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" /V "NETLangPack" /T "REG_SZ" /D "%PathRoot%\NDP46-KB3045557-x86-x64-AllOS-RUS.exe /q /norestart" /Fили так

ECHO.
ECHO Changing default system settings
ECHO.
ECHO Turn off Let apps use my advertising ID for experiences across apps
reg ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AdvertisingInfo" /v Enabled /t REG_DWORD /d 0 /f
ECHO.
а так уже нет:

setlocal enableextensions enabledelayedexpansion

IF /I %major-version% LEQ 6 (
ECHO.
ECHO Installing: "Microsoft .NET Framework 4.6"...
SET PathFile=dotNetFx4\NDP46-KB3045557-x86-x64-AllOS-ENU.exe
IF EXIST %PathRoot%\!PathFile! (
REG ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" /V "NETLangPack" /T "REG_SZ" /D "%PathRoot%\NDP46-KB3045557-x86-x64-AllOS-RUS.exe /q /norestart" /F
ECHO %done%
)
)
или так:


IF /I %major-version% GEQ 10 (
ECHO.
ECHO Changing default system settings
ECHO.
ECHO Turn off Let apps use my advertising ID for experiences across apps
reg ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AdvertisingInfo" /v Enabled /t REG_DWORD /d 0 /f
ECHO.
ECHO Done
)
При том, если использовать конструкцию без скобок, то всё хорошо, но тогда надо плодить одно и тоже условие десятки раз. Т.е. так работает:
IF /I %major-version% GEQ 10 reg ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AdvertisingInfo" /v Enabled /t REG_DWORD /d 0 /fПовторять десятки раз кусок кода IF /I %major-version% GEQ 10 ни разу не вставляет в таких случаях.

Iska
10-12-2016, 15:56
Вы чего-то не договариваете, как мне кажется. Что именно «не работает»? И покажите полный код.

Emulty
10-12-2016, 16:53
Раньше код был более примитивный, с кучей повторений, частенько при редактировании это сильно напрягало. Сейчас провёл небольшую оптимизацию, но не отрабатывает то, что приведено было выше. Весь код:
@echo off
setlocal enableextensions enabledelayedexpansion

TITLE Silent installation of applications

Set PathRoot=%~dp0
Set PathRoot=%PathRoot:~0,-1%
Set PathFile=
Set done=Done.

:: #Assing variable %version% for OS version
For /F "Tokens=2 Delims=[]" %%i In ('ver') Do (For /F "Tokens=2,3 Delims=. " %%a In ("%%i") Do Set version=%%a.%%b)
For /F "Tokens=2 Delims=[]" %%i In ('ver') Do (For /F "Tokens=2,3 Delims=. " %%a In ("%%i") Do Set major-version=%%a)

IF "%1"=="/office" (Set offver=ver16) && CLS && GOTO setupoffice
IF "%1"=="/onlysoft" (Set typesetup=onlysoft) && CLS && GOTO setupoffice

ECHO.
ECHO Startting installation script...
ECHO.

ECHO This script will install additional software
ECHO.
ECHO Are you sure to continue installation?
PAUSE
ECHO.
ECHO You really sure?
PAUSE
SET interactive=true && CLS

:setupoffice
ECHO Version OS defined - %version%
GOTO setupsofware

IF "%offver%"=="ver16" (
IF DEFINED ProgramW6432 (
ECHO Installing: "Microsoft Office 2016 OPK"...
SET PathFile=Office16\setup.exe
IF EXIST %PathRoot%\!PathFile! START /wait %PathRoot%\!PathFile! /configure %PathRoot%\Office16\configuration_x64.xml
) ELSE (
ECHO.
ECHO Installing: "Microsoft Office 2016 OPK"...
SET PathFile=Office16\setup.exe
IF EXIST %PathRoot%\!PathFile! START /wait %PathRoot%\!PathFile! /configure %PathRoot%\Office16\configuration.xml
)
ECHO Setting office setup mode to OEM
SET PathFile=Office16\oemsetup.cmd
IF EXIST %PathRoot%\!PathFile! CALL %PathRoot%\!PathFile!
ECHO %done%
)

:setupsofware
IF DEFINED ProgramW6432 (
ECHO.
ECHO Installing: "Microsoft Visual C++ 2015 Redistributable (x64)"...
SET PathFile=VCredist\vc_redist.x64.exe && IF EXIST %PathRoot%\!PathFile! START /wait %PathRoot%\!PathFile! /q /norestart
ECHO %done%
) ELSE (
ECHO.
ECHO Installing: "Microsoft Visual C++ 2015 Redistributable (x86)"...
SET PathFile=VCredist\vc_redist.x86.exe && IF EXIST %PathRoot%\!PathFile! START /wait %PathRoot%\!PathFile! /q /norestart
ECHO %done%
)


rem ECHO.
rem ECHO Installing: "Adobe Flash Player ActiveX & Plugin"...
rem SET PathFile=Adobe\install_flash_player_23_active_x.exe && IF EXIST %PathRoot%\!PathFile! START /wait %PathRoot%\!PathFile! -install
rem SET PathFile=Adobe\install_flash_player_23_plugin.exe && IF EXIST %PathRoot%\!PathFile! START /wait %PathRoot%\!PathFile! -install
rem SET PathFile=Adobe\install_flash_player_23_ppapi.exe && IF EXIST %PathRoot%\!PathFile! START /wait %PathRoot%\!PathFile! -install
rem ECHO %done%

rem ECHO.
rem ECHO Installing: "Adobe AIR"...
rem SET PathFile=Adobe\AdobeAIRInstaller.exe && IF EXIST %PathRoot%\!PathFile! START /wait %PathRoot%\!PathFile! -silent
rem ECHO %done%

ECHO.
ECHO Installing: "Adobe Reader DC"...
SET PathFile=Adobe\AcroRdrDC1500720033_MUI.exe && IF EXIST %PathRoot%\!PathFile! START /wait %PathRoot%\!PathFile! /sAll /rs
SET PathFile=Adobe\AcroRdrDCUpd1502020042_MUI.msp && IF EXIST %PathRoot%\!PathFile! START /wait msiexec /update %PathRoot%\!PathFile! /qn
IF EXIST "%PUBLIC%\Desktop\Acrobat Reader DC.lnk" DEL /F /Q "%PUBLIC%\Desktop\Acrobat Reader DC.lnk"
IF EXIST "%ALLUSERSPROFILE%\Рабочий стол\Acrobat Reader DC.lnk" DEL /F /Q "%ALLUSERSPROFILE%\Рабочий стол\Acrobat Reader DC.lnk"
ECHO %done%

IF /I %major-version% LEQ 6 (
ECHO.
ECHO Installing: "DirectX End-User Runtimes (June 2010)"...
SET PathFile=DirectX\directx_Jun2010_redist.exe && IF EXIST %PathRoot%\!PathFile! START /wait %PathRoot%\!PathFile! -s -sp/silent
ECHO %done%
)

rem ECHO.
rem IF DEFINED ProgramW6432 (
rem ECHO Installing: "Java Version (x64)"...
rem SET PathFile=Java\jre-8u101-windows-x64.exe && IF EXIST %PathRoot%\!PathFile! START /wait %PathRoot%\!PathFile! /s
rem ECHO %done%
rem )

rem ECHO Installing: "Java Version (x86)"...
rem SET PathFile=Java\jre-8u101-windows-i586.exe && IF EXIST %PathRoot%\!PathFile! START /wait %PathRoot%\!PathFile! /s
rem ECHO %done%

ECHO.
ECHO Installing: "K-Lite Codec Pack Mega"...
SET PathFile=K-Lite\K-Lite_Codec_Pack_1265_Mega.exe && IF EXIST %PathRoot%\!PathFile! START /wait %PathRoot%\!PathFile! /verysilent /norestart /LoadInf="%PathRoot%\K-Lite\klcp_mega_unattended.ini"
ECHO %done%

IF /I %major-version% LEQ 6 (
ECHO.
IF DEFINED ProgramW6432 (
ECHO Installing: "Silverlight 5 (x64)"...
SET PathFile=Silverlight\Silverlight_x64.exe && IF EXIST %PathRoot%\!PathFile! START /wait %PathRoot%\!PathFile! /q
ECHO %done%
) ELSE (
ECHO Installing: "Silverlight 5 (x86)"...
SET PathFile=Silverlight\Silverlight.exe && IF EXIST %PathRoot%\!PathFile! START /wait %PathRoot%\!PathFile! /q
ECHO %done%
)
)

ECHO.
ECHO Installing: "Skype"...
SET PathFile=Skype\SkypeSetupFull.exe && IF EXIST %PathRoot%\!PathFile! START /wait %PathRoot%\!PathFile! /VERYSILENT /NOLAUNCH /NOGOOGLE /NOSTARTUP /NOPLUGINS /LANG=ru
IF EXIST "%PUBLIC%\Desktop\Skype.lnk" DEL /F /Q "%PUBLIC%\Desktop\Skype.lnk"
IF EXIST "%ALLUSERSPROFILE%\Рабочий стол\Skype.lnk" DEL /F /Q "%ALLUSERSPROFILE%\Рабочий стол\Skype.lnk"
ECHO %done%

ECHO.
IF DEFINED ProgramW6432 (
ECHO Installing: "WinRAR 5 (x64)"...
SET PathFile=WinRAR\winrar-x64-540ru.exe && IF EXIST %PathRoot%\!PathFile! START /wait %PathRoot%\!PathFile! -s
ECHO %done%
) ELSE (
ECHO Installing: "WinRAR 5"...
SET PathFile=WinRAR\wrar540ru && IF EXIST %PathRoot%\!PathFile! START /wait %PathRoot%\!PathFile! -s
ECHO %done%
)

IF "%typesetup%"=="onlysoft" (GOTO end)

rem IF /I "%version%"=="6.1" (
rem ECHO.
rem ECHO Installing: "Microsoft Internet Explorer 11"...
rem IF DEFINED ProgramW6432 (
rem SET PathFile=IE11\IE11-Windows6.1-x64-ru-ru.exe && IF EXIST %PathRoot%\!PathFile! START /wait %PathRoot%\!PathFile! /quiet /closeprograms /norestart) ELSE (START /wait %PathRoot%\IE11\IE11-Windows6.1-x86-ru-ru.exe /quiet /closeprograms /norestart)
rem ECHO Set default settings for browser:
rem ECHO Load hive of default user
rem reg LOAD HKU\Default %SYSTEMDRIVE%\Users\Default\NTUSER.DAT
rem ECHO Set start with tabs from the the last session
rem reg ADD "HKU\Default\Software\Microsoft\Internet Explorer\ContinuousBrowsing" /v Enabled /t REG_DWORD /d 1 /f
rem ECHO Set default start page
rem reg ADD "HKU\Default\Software\Microsoft\Internet Explorer\Main" /v "Start Page" /t REG_SZ /d "http://www.ya.ru" /f
rem ECHO Set always open pop-ups in a new tab
rem reg ADD "HKU\Default\Software\Microsoft\Internet Explorer\TabbedBrowsing" /v PopupsUseNewWindow /t REG_DWORD /d 2 /f
rem ECHO Unload hive of default user
rem reg UNLOAD HKU\Default
rem ECHO %done%
rem ELSE (
rem ECHO.
rem ECHO "Microsoft Internet Explorer 11" - your OS version %version% not compatible with package
rem )

IF /I %major-version% LEQ 6 (
ECHO.
ECHO Installing: "Microsoft .NET Framework 4.6"...
SET PathFile=dotNetFx4\NDP46-KB3045557-x86-x64-AllOS-ENU.exe
IF EXIST %PathRoot%\!PathFile! (
START /wait %PathRoot%\!PathFile! /q /norestart
REG ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" /V "NETLangPack" /T "REG_SZ" /D "%PathRoot%\NDP46-KB3045557-x86-x64-AllOS-RUS.exe /q /norestart" /F
ECHO %done%
)
)

IF /I %major-version% GEQ 10 (
ECHO.
ECHO Changing default system settings
ECHO.
ECHO Turn off Let apps use my advertising ID for experiences across apps
reg ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AdvertisingInfo" /v Enabled /t REG_DWORD /d 0 /f
ECHO Turn on SmartScreen Filter to check web content URLs that Windows Store apps use
reg ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AppHost" /v EnableWebContentEvaluation /t REG_DWORD /d 1 /f
ECHO Disable to send your device data to Microsoft
reg ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\DataCollection" /v AllowTelemetry /t REG_DWORD /d 1 /f
ECHO Turn off Malicious Software Reporting Tool telemetry
reg ADD "HKLM\SOFTWARE\Policies\Microsoft\MRT" /v DontReportInfectionInformation /t REG_DWORD /d 0 /f
ECHO Change the level of diagnostic and usage data sent to Basic
reg ADD "HKLM\SOFTWARE\Microsoft\Input\TIPC" /v Enabled /t REG_DWORD /d 0 /f
ECHO Enable Peer-to-Peer (P2P) Apps & Updates Download from More Than One Place only in local network
reg ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\DeliveryOptimization\Config" /v DODownloadMode /t REG_DWORD /d 1 /f
ECHO.
ECHO Load hive of default user
reg LOAD HKU\Default %SYSTEMDRIVE%\Users\Default\NTUSER.DAT
ECHO Set start with tabs from the the last session
reg ADD "HKU\Default\Software\Microsoft\Internet Explorer\ContinuousBrowsing" /v Enabled /t REG_DWORD /d 1 /f
ECHO Set always open pop-ups in a new tab
reg ADD "HKU\Default\Software\Microsoft\Internet Explorer\TabbedBrowsing" /v PopupsUseNewWindow /t REG_DWORD /d 2 /f
ECHO Disable Feedback & Diagnostics
reg ADD "HKU\Default\Software\Microsoft\Siuf\Rules" /v NumberOfSIUFInPeriod /t REG_DWORD /d 0 /f
ECHO Hide "Task view" Button on Taskbar
reg ADD "HKU\Default\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v ShowTaskViewButton /t REG_DWORD /d 0 /f
ECHO Turn Off App Suggestions on Start Menu
reg ADD "HKU\Default\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" /v SystemPaneSuggestionsEnabled /t REG_DWORD /d 0 /f
ECHO Unload hive of default user
reg UNLOAD HKU\Default
ECHO.
ECHO Done
)

:end
ECHO.
ECHO Setup is completed
IF "%interactive%"=="true" (PAUSE)
EXIT /B 0
Полагаю, что в IFe со скобками ему не нравятся двойные кавычки, но что с этим делать не знаю.

Iska
11-12-2016, 06:20
Дорогой друг! Должен Вам сказать — у Вас там чёрт голову сломит.

Определение:
SET PathFile=VCredist\vc_redist.x64.exe && IF EXIST %PathRoot%\!PathFile! START /wait %PathRoot%\!PathFile! /q /norestart
перестанет работать, как только Вы начнёте использовать кавычки в "%PathRoot%\!PathFile!" (как оно, вообще-то, по уму, положено), поскольку !PathFile! будет содержать пробел на конце. Я вообще не виду никакой необходимости в данном конкретном случае лепить две команды в одну строку. То есть: никаких случайных конечных пробелов в set быть не должно, это трудно определяется визуально (хотя любые вменяемые редакторы кода имеют параметр «Show white space») и затрудняет определение места ошибки. Вы даже можете использовать:
SET "PathFile=VCredist\vc_redist.x64.exe"
для точного ограничения определения.

Теперь давайте детально по коду: что именно у Вас в последнем коде не работает? Скажем так: «Не работает Раз — это …». Разберёмся с Раз, потом будет Два, Три и т.д.

Emulty
11-12-2016, 11:33
перестанет работать, как только Вы начнёте использовать кавычки в "%PathRoot%\!PathFile!" (как оно, вообще-то, по уму, положено), поскольку !PathFile! будет содержать пробел на конце. Я вообще не виду никакой необходимости в данном конкретном случае лепить две команды в одну строку. То есть: никаких случайных конечных пробелов в set быть не должно, это трудно определяется визуально (хотя любые вменяемые редакторы кода имеют параметр «Show white space») и затрудняет определение места ошибки. Вы даже можете использовать:»
Писал как умел на тот момент, да и сейчас не сильно умнее стал, командная строка вообще местами очень мутная вещь, понятного и полноценного мануала не встречал. Искал выход, когда собрал такую конструкцию, чтобы работало, и в данном случае оно даже отрабатывает нормально. Я правильно Вас понял, что вы предлагаете разбить на несколько строк данную конструкцию? Избавиться от !! в переменной, которые дают пробел в конце. Где почитать о подобных нюансах можно?

А не работает кусок кода с REG'ом, когда его заворачиваю в IF () в несколько строк, например, строка сама по себе работает
REG ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" /V "NETLangPack" /T "REG_SZ" /D "%PathRoot%\NDP46-KB3045557-x86-x64-AllOS-RUS.exe /q /norestart" /Fпомещяем в IF (), то не работает
IF /I %major-version% LEQ 6 (
SET PathFile=dotNetFx4\NDP46-KB3045557-x86-x64-AllOS-ENU.exe
IF EXIST %PathRoot%\!PathFile! (
START /wait %PathRoot%\!PathFile! /q /norestart
REG ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" /V "NETLangPack" /T "REG_SZ" /D "%PathRoot%\NDP46-KB3045557-x86-x64-AllOS-RUS.exe /q /norestart" /F
ECHO %done%
)
)
В примере выше отработает всё, кроме строки, что начинается на REG

Код прошу поругать, только конструктивно, желательно с примерами как можно и нужно иначе. Буду очень признателен.

Emulty
11-12-2016, 11:52
Уже точно не помню, но кажется !! к переменный добавлял именно в условиях, именно там без данного нюанса не раскрывались переменные правильно. Потому как внутри IF'а я ту же PathFile и переопределял каждый раз. Может быть Вы в силу своего опыта можете предложить более мудрую и универсальную конструкцию?

y--
11-12-2016, 22:13
Emulty,
можно использовать вполне нейтральный вариант:
IF /I %major-version% LEQ 6 CALL :METKA_6
:: дальнейшее тело скрипта
GOTO :EOF

:METKA_6
SET PathFile=dotNetFx4\NDP46-KB3045557-x86-x64-AllOS-ENU.exe
IF EXIST %PathRoot%\!PathFile! (
START /wait %PathRoot%\!PathFile! /q /norestart
REG ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" /V "NETLangPack" /T "REG_SZ" /D "%PathRoot%\NDP46-KB3045557-x86-x64-AllOS-RUS.exe /q /norestart" /F
ECHO %done%
)
GOTO :EOF


И тебе уже выше говорили о присвоениях - поэтому:SET "PathFile=dotNetFx4\NDP46-KB3045557-x86-x64-AllOS-ENU.exe"
IF EXIST "%PathRoot%\!PathFile!" (
START /wait "%PathRoot%\!PathFile!" /q /norestart
REG ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" /V "NETLangPack" /T "REG_SZ" /D "%PathRoot%\NDP46-KB3045557-x86-x64-AllOS-RUS.exe /q /norestart" /F
ECHO %done%
)
GOTO :EOF

y--
11-12-2016, 22:42
А вообще в твоем коде все пошло наперекосяк с первых строчек - можно обойтись без отложенного выполнения:FOR /F "TOKENS=2,3 DELIMS=[." %%i IN ('ver') DO SET "version=%%i"&SET "minor_version=%%j"
SET "major-version=%version:Version =%"
SET "version=%major-version%.%minor_version%"

Emulty
14-12-2016, 20:50
Большое спасибо всем за помощь! В принципе со всем разобрался, сейчас всё работает.
Низкий поклон.




© OSzone.net 2001-2012