Как мне использовать пакетный скрипт для создания других скриптов? - PullRequest
5 голосов
/ 05 марта 2012

Я создаю скрипт, который я хочу сделать двойным:

  1. Скрипт будет использовать параметры пользовательского ввода для выполнения команд для изменения некоторых настроек.Эта часть почти закончена.

    • Скрипт собирает выбор пользователя в локальные переменные среды с помощью SETLOCAL / ENDLOCAL и SET /P и вызывает переменные позже в скрипте для выполнения команды.

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

  2. Сценарий предоставит пользователю возможность автоматически создавать новый сценарий с его опциями, встроенными для будущего удобства.

Вот моя концепция текущего плана для достиженияЗадача № 2, хотя я не совсем уверен, как ее написать:

  1. Создание шаблона сценария, который можно скопировать, чтобы начать создание пользовательских сценариев.

    • В самом начале сценария шаблона SETLOCAL изолирует переменные среды, созданные завершенным сценарием, чтобы они не сохранялись после завершения выполнения сценария.

    • Сразу после SETLOCAL будет команда GOTO, которая указывает на метку в самом конце скрипта.Метка будет началом раздела определений переменных в завершенных сценариях.

    • После команды GOTO будет метка STARTEXEC, к которой будет переходить после завершения определения переменных.

    • Непосредственно перед меткой раздела переменных будет помечен раздел с некоторыми командами для выхода из сценария.

  2. В текущий скрипт:

    • Добавьте CHOICE во время шага проверки, который спрашивает пользователя, хочет ли он создать статический скрипт.Если да, запросите у пользователя имя файла через SET /P, затем включите команды построения скрипта в поток выполнения этого скрипта через GOTO.
  3. Используйте некоторые командыаналогично этому, для построения раздела переменных статического скрипта:

    COPY ScriptTemplate.bat %UserFileName%.bat
    ECHO SET VAR1=%UserVar1% >> %UserFileName%.bat
    ECHO SET VAR2=%UserVar2% >> %UserFileName%.bat

  4. Добавьте еще одну строку вубедитесь, что статический скрипт переходит к выполнению команды.

    ECHO GOTO STARTEXEC >> %UserFileName%.bat

Мои вопросы здесь:

  1. Мои методыдовольно хорошо, или есть лучший способ сделать это, все еще с помощью пакетного сценария?

  2. Что я должен использовать, чтобы выйти из статического сценария, прежде чем вернуться к разделу переменных?Я знаю, мне понадобится ENDLOCAL.Будет ли EXIT работать здесь или есть что-то еще более подходящее для этого?

Ответы [ 2 ]

1 голос
/ 08 марта 2012

Идея шаблона, кажется, простой метод (не уверен насчет краткости, но, возможно, именно так я и подошел к нему.) Создайте отдельный шаблон на основе оригинала, удалив все команды SET / P.

EDIT:

Удален старый ответ.

В конце шаблона напишите:

GOTO:EOF

:User_Defined_Variables

В начале файла напишите:

CALL:User_Defined_Variables

В исходном сценарии, после того как пользователь подтвердит создание пользовательского сценария, создайте копию файла шаблона. COPY /y template.bat userscript.bat отправьте в него все переменные пользователя.

(ECHO var1 = %uservar1% 
 ECHO var2 = %uservar2%
 Echo var3 = %uservar4%)>> userscript.bat
GOTO:EOF

Поэтому, когда пользователь запускает сценарий, CALL: User_Defined_Variables установит параметры сценария пользователя и продолжит работу с остальной частью сценария.

0 голосов
/ 08 марта 2012

Iszi,

У меня есть похожая функция, которую мы выполняем на моей работе ... у нас есть другой набор пользовательских переменных, которые мы используем для запуска других функций для каждого клиента, с которым мы имеем дело.Я написал сложный сценарий для Batch, который позволяет мне и коллегам добиться этого, однако, по моему мнению, создание отдельного пакетного файла в любое время не является необходимым.

Есть 2 способа, которые я считаю целесообразными для достижения того, что выВы ищете:

  1. Вы можете установить все свои переменные в начале и отредактировать их оттуда

  2. Вы можете запрашивать свои переменные каждый развремя / написать новый сценарий

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

Итак, вот несколько примеров того, что вы можете сделать:

1.

@ECHO off
TITLE Install Script
COLOR 0A
SETLOCAL

REM ---------------------------
REM  *** EDIT VARIABLES BELOW ***
REM ---------------------------

:sharepath
set sharepath=\\SCIncapps\sharepath
REM SHAREPATH = The location of the files that will be copied to the client machine. List of files you will need in your SCIncIntViewer folder: 
REM vcredist_x86.exe, msxml6.msi,  Browser Access Client Controls.msi,  Automated Update Service.msi, bac.ico, dotnetfx35.exe, dotNetFx40_Full_x86_x64.exe,  Episys Client.msi
REM This Sharepath is where the Script needs to be located and has to be an already existing directory

:primaryStaging
set primaryStaging=SCIncweb
REM primaryStaging = The name of the back office server that handles AutoUpdate. This is usually the same as websrvr, except in distributed  environments

:webserver
set websrvr=SCIncweb
REM websrvr = The name of the Web Server; i.e. SCIncweb, SCInc14Doc1, 10.1.1.1, 192.168.1.20, etc.

:install_variables
set dotnet35=F
REM Defines the installation of .NET 3.5 SP 1 as True(T) or False(F)
set dotnet40=F
REM Defines the installation of .NET 4.0 as True(T) or False(F)
set regedit=F
REM Defines the creation of the Registry File to edit all IE settings as True(T) or False(F)
set SSL=F
REM Defines the use of SSL for the BAC URL; SSL is set as True(T) or False(F)
set org=0000
REM Defines the Organization for the BAC url shortcut that is created on the desktop for all users (enter the numeric org #)
set favorite=T
REM This will put the  Browser Access Client URL in their favorite folder and on their browser's quick link bar as True(T) or False(F)
set reboot=F
REM Defines whether or not the script will reboot the machine after it's complete as True(T) or False(F)
REM If using the PsExec.exe to push this script this will force the Domain Administrator to logoff the machine
set reloadAll=F
REM This defines if the _Installed_Files.txt will be overwritten to install all products again as True(T) or False(F)
REM NOTE This will copy down all items and install everything except .NET 3.5 SP1 and .NET 4.0

:creditUnion_Variables
set episys=F
REM Defines the installation of Episys Integration for  as True(T) or False(F)

:bank_Variables
set silver2020=F
REM Defines the installation of SCInc Integration for  as True(T) or False(F)
set coreDirector=F
REM Defines the use of Core Director for banks as True(T) or False(F)
set iseries=1.1.1.1
REM Defines the IP address of the iSeries if in-house Some Company, Inc Core, otherwise irrelevant
set dualinQuiry=F
REM Defines the deletion of the old SCInc Viewer if NOT using Dual Inquiry as True(T) or False(F)
set thinClient=F
REM Defines the /install and /execute flags on a Terminal Server as True(T) or False(F)
set vportsPath=%sharepath%
REM Defines the vports.xml file's location, this variable should be kept as the sharepath unless the client specifies otherwise

:Logs
set PCaudit=T
REM Defines whether or not you want just the PC name to be logged to a file as True(T) or False(F)
REM Creates a list of all the PC's that this script has been run on and puts it in the sharepath folder

REM ---------------------------
REM *** DO NOT EDIT BELOW ***
REM ---------------------------

IF /I '%scanStation%'=='T' goto:eof
REM If running the Scan Station Install tool only the variables are read and then the  Scan Station Install Tool.bat will resume
goto thinClient_inst

:thinClient_inst
IF /I '%thinClient%'=='F' goto date_time
change user /install

:date_time
FOR /F %%A IN ('TIME/T') DO SET time=%%A
REM Sets the time in a proper format for Error Logging
FOR /F "tokens=1-4 delims=/ " %%B IN ('DATE /t') DO SET date=%%C/%%D/%%E
REM Sets the date in a proper format for Error Logging

:errorLog
REM Logs the error messages for each product that the script attempts to install
IF exist %sharepath%\%org%_ _Installed_PCs_ErrorLog.txt goto PCaudit
echo.Microsoft Website for Errors:> %sharepath%\%org%_ _Installed_PCs_ErrorLog.txt
echo.http://msdn.microsoft.com/en-us/library/ms681381(VS.85).aspx>> %sharepath%\%org%_ _Installed_PCs_ErrorLog.txt
echo.(Popular Error: 9009, 1616 :: File does not exist in directory)>> %sharepath%\%org%_ _Installed_PCs_ErrorLog.txt
echo.--------------------------------------------------------------->> %sharepath%\%org%_ _Installed_PCs_ErrorLog.txt
set cleanInstall=0
REM Checks if the ErrorLog file already exists, if not it writes the fist 2 lines which contain the URL for determining the Errors from Microsoft
goto PCaudit

:PCaudit
REM Logs the Computer Name to the Installed_PC text file
REM This checks to make sure that the PC name doesn't already exist in that file and if it does it puts it into another file called %org%_ _Repeat_Installs_Log.txt
verify >nul
IF /I '%PCaudit%'=='f' set PCaudit=F
IF /I '%PCaudit%'=='F' goto start
IF /I '%PCaudit%'=='t' set PCaudit=T
set repeat=F
findstr /x "%computername%" %sharepath%\%org%_ _Installed_PCs_AuditList.txt 
IF '%ERRORLEVEL%'=='0' set repeat=T
IF /I '%repeat%'=='T' echo.%date% - %time% - %computername%>> %sharepath%\%org%_ _Repeat_Installs_Log.txt
IF /I '%repeat%'=='T' goto start
IF /I '%repeat%'=='F' echo.%computername%>> %sharepath%\%org%_ _Installed_PCs_AuditList.txt
goto start

:start
REM Changes all variables for True(T) and False(F) to capital letters since batch is case sensitive
set HKEY=HKEY_LOCAL_MACHINE
REM This script is meant to be run by a user with ADMIN privledges; 
REM " HKEY_LOCAL_MACHINE " registry items can only be edited by an admin

:_done
IF NOT exist "c:\SCInc\ \_done" md c:\SCInc\ \_done
IF NOT exist "c:\SCInc\ \_done\ _Installed_Files.txt" echo. Installed Files for %computername%: > c:\SCInc\ \_done\ _Installed_Files.txt
IF /I '%reloadAll%'=='T' echo. Installed Files: > c:\SCInc\ \_done\ _Installed_Files.txt
goto iviewerUrl
REM Creates the _done folder and the _Installed_Files.txt which will be local to the PC and will keep the products they install to prevent reinstallation
REM Delete this folder to reinstall all products or delete the line of text inside to reinstall a particular product

:iviewerUrl
set iviewerUrl=http://%websrvr%
IF /I '%SSL%'=='T' (set iviewerUrl=https://%websrvr%)
REM This sets the 'iviewerUrl' variable depeneding on if you have SSL enabled or not
set SCIncUrl=/bac/user/User_SO.asp?%OrgName=
REM This sets the rest of the URL for the browser shortcut (the '?' doesn't get a long with batch scripts)

:copy
REM Copies the files from the sharepath to the local machine
echo.
echo.Copying Necessary Files for Installation
echo.This could take a few minutes...
md C:\SCInc\ 
md C:\SCInc\Temp
REM Creates the ' \SCInc\ ' and ' \SCInc\Temp ' directories
goto 1

:1
verify >nul
findstr /x "copy_vcredist" "c:\SCInc\ \_done\ _Installed_Files.txt" 
IF '%ERRORLEVEL%'=='0' goto 2
echo.Copying vcredist_x86.exe
copy %sharepath%\vcredist_x86.exe c:\SCInc\temp
REM Copies the C++ Redistributable installer
IF '%ERRORLEVEL%'=='0' echo.copy_vcredist>> C:\SCInc\ \_done\ _Installed_Files.txt
IF NOT '%ERRORLEVEL%'=='0' echo.%date% - %time% - %computername% - There was an error copying vcredist_x86: Error Code %errorlevel%>> %sharepath%\%org%_ _Installed_PCs_ErrorLog.txt & set cleanInstall=1
goto 2
:2
verify >nul
findstr /x "copy_msxml6" "c:\SCInc\ \_done\ _Installed_Files.txt" 
IF '%ERRORLEVEL%'=='0' goto 3
echo.Copying msxml6.msi
copy %sharepath%\msxml6.msi c:\SCInc\temp
REM Copies MSXML 6.0 Parser installer
IF '%ERRORLEVEL%'=='0' echo.copy_msxml6>> C:\SCInc\ \_done\ _Installed_Files.txt
IF NOT '%ERRORLEVEL%'=='0' echo.%date% - %time% - %computername% - There was an error copying msxml6.msi: Error Code %errorlevel%>> %sharepath%\%org%_ _Installed_PCs_ErrorLog.txt & set cleanInstall=1
goto 3
:3
verify >nul
findstr /x "copy_BAC" "c:\SCInc\ \_done\ _Installed_Files.txt" 
IF '%ERRORLEVEL%'=='0' goto 4
echo.Copying  Browser Access Client Controls.msi
copy %sharepath%\" Browser Access Client Controls.msi" C:\SCInc\temp
REM Copies the  Browser Access Client Controls installer
IF '%ERRORLEVEL%'=='0' echo.copy_BAC>> C:\SCInc\ \_done\ _Installed_Files.txt
IF NOT '%ERRORLEVEL%'=='0' echo.%date% - %time% - %computername% - There was an error copying  Browser Access Client Controls.msi: Error Code %errorlevel%>> %sharepath%\%org%_ _Installed_PCs_ErrorLog.txt & set cleanInstall=1
goto 4
:4
verify >nul
findstr /x "copy_AutoUpdate" "c:\SCInc\ \_done\ _Installed_Files.txt" 
IF '%ERRORLEVEL%'=='0' goto 5
echo.Copying  Automated Update Service.msi
copy %sharepath%\" Automated Update Service.msi" C:\SCInc\temp
REM Copies the  Automated Update Service installer
IF '%ERRORLEVEL%'=='0' echo.copy_AutoUpdate>> C:\SCInc\ \_done\ _Installed_Files.txt
IF NOT '%ERRORLEVEL%'=='0' echo.%date% - %time% - %computername% - There was an error copying  Automated Update Service.msi: Error Code %errorlevel%>> %sharepath%\%org%_ _Installed_PCs_ErrorLog.txt & set cleanInstall=1
goto 5
:5
verify >nul
findstr /x "copy_icon" "c:\SCInc\ \_done\ _Installed_Files.txt" 
IF '%ERRORLEVEL%'=='0' goto copy_dotnet35
echo.Copying  BAC Icon
copy %sharepath%\bac.ico %windir%\System32
REM Copies the  Browser icon file to the System32 folder
IF '%ERRORLEVEL%'=='0' echo.copy_icon>> C:\SCInc\ \_done\ _Installed_Files.txt
IF NOT '%ERRORLEVEL%'=='0' echo.%date% - %time% - %computername% - There was an error copying bac.ico: Error Code %errorlevel%>> %sharepath%\%org%_ _Installed_PCs_ErrorLog.txt & set cleanInstall=1
echo.
echo.Created the following directories:
echo.-------------------------------------------------------
echo.
echo.C:\SCInc\ 
echo.C:\SCInc\Temp
echo.
echo.-------------------------------------------------------
goto copy_dotnet35

:copy_dotnet35
verify >nul
REM Copies .NET 3.5 Service Pack 1
reg query "HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5"| findstr Install
REM Checks for .NET 3.5 and installs it if it doesn't find it
IF '%ERRORLEVEL%'=='0' set dotnet35=F
IF /I '%dotnet35%'=='F' goto copy_dotnet40
echo.Copying and installing .NET 3.5 Service Pack 1
echo.This will take a few minutes...
copy %sharepath%\dotnetfx35.exe C:\SCInc\Temp
IF NOT '%ERRORLEVEL%'=='0' echo.%date% - %time% - %computername% - There was an error copying .NET 3.5 SP1: Error Code %errorlevel%>> %sharepath%\%org%_ _Installed_PCs_ErrorLog.txt & set cleanInstall=1

:dotnet35
verify >nul
REM Installs .NET 3.5 Service Pack 1
echo.Installing .NET 3.5 Service Pack 1
echo.This could take a few minutes...
c:\SCInc\temp\dotnetfx35.exe /q /norestart
IF '%ERRORLEVEL%'=='0' echo.dotnet35>> C:\SCInc\ \_done\ _Installed_Files.txt & set net35=1
IF NOT '%ERRORLEVEL%'=='0' echo.%date% - %time% - %computername% - There was an error completing the installation of .NET 3.5 SP1: Error Code %errorlevel%>> %sharepath%\%org%_ _Installed_PCs_ErrorLog.txt & set cleanInstall=1
echo.
echo.-------------------------------------------------------
echo.
goto copy_dotnet40

:copy_dotnet40
verify >nul
REM Copies .NET 4.0
reg query "HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"| findstr Install
REM Checks for the FULL (not client) version of .NET 4.0 and installs it if it doesn't find it
IF '%ERRORLEVEL%'=='0' set dotnet40=F
IF /I '%dotnet40%'=='F' goto msxml60
echo.Copying and installing .NET 4.0
echo.This could take a few minutes...
copy %sharepath%\dotNetFx40_Full_x86_x64.exe c:\SCInc\temp
IF NOT '%ERRORLEVEL%'=='0' echo.%date% - %time% - %computername% - There was an error copying .NET 4: Error Code %errorlevel%>> %sharepath%\%org%_ _Installed_PCs_ErrorLog.txt & set cleanInstall=1

:dotnet40
verify >nul
REM Installs .NET 4.0
echo.Installing .NET 4.0
echo.This could take a few minutes...
c:\SCInc\temp\dotNetFx40_Full_x86_x64.exe /q /norestart
IF '%ERRORLEVEL%'=='0' echo.dotnet40>> C:\SCInc\ \_done\ _Installed_Files.txt & set net40=1
IF NOT '%ERRORLEVEL%'=='0' echo.%date% - %time% - %computername% - There was an error completing the installation of .NET 4: Error Code %errorlevel%>> %sharepath%\%org%_ _Installed_PCs_ErrorLog.txt & set cleanInstall=1
goto msxml60

Вышеуказанный скрипт является частичным и был отредактирован.

Как вы можете видеть, я установил все свои переменные в начале моего файла.Таким образом, каждый раз, когда мне нужно что-то изменить, я никогда не собираюсь делать код, как и мои коллеги.Некоторые из них способны изменить его, а некоторые нет, те, которым непросто понять, что изменить, потому что каждый тон задается в первых 70 строках файла.Причина, по которой я думаю, что это лучший способ, заключается в том, что у меня есть гибкость, чтобы изменить вещи на лету.У меня есть переменные, которые запускают другие установки, которые я, возможно, захочу поставить позже.С сценарием, который создает другой сценарий, вы можете столкнуться с отсутствием возможности изменить вещи без повторного запуска вашего первого пакетного файла.

@echo off
> usermessage.vbs ECHO WScript.Echo InputBox( "What is the name of the Service you want to restart?", "Service:", "MspSvc" )
FOR /F "tokens=*" %%A IN ('CSCRIPT.EXE //NoLogo usermessage.vbs') DO SET Service=%%A
ECHO You will restart %Service%
DEL usermessage.vbs

net stop %Service%
net start %Service%

Pause

Это от Роба Вандервуде.У него, вероятно, самый известный веб-сайт для команд пакетного сценария, который я знаю.Я изменил эту часть, чтобы получить ввод от пользователя и использовать его для записи моей переменной для перезапуска служб.Это может сработать для того, что вы хотите сделать для написания сценария, который пишет другой сценарий ..

Если это так, то вам нужно сделать следующее:

@ECHO off
TITLE Script Creator
COLOR 0A
SETLOCAL

> usermessage.vbs echo.WScript.Echo InputBox( "Pick something to test SETLOCAL/ENDLOCAL on?", "Variable:", "OUTSIDEVARIABLE" )
FOR /F "tokens=*" %%A IN ('CSCRIPT.EXE //NoLogo usermessage.vbs') DO SET outsideVar=%%A
echo.Your variable is %outsideVar%
DEL usermessage.vbs

echo.%outsideVar% is still set outside

echo.@echo off>c:\temp\newbatch.bat
echo.COLOR 1B>>c:\temp\newbatch.bat
echo.SETLOCAL>>c:\temp\newbatch.bat
echo.cls>>c:\temp\newbatch.bat
echo.set insideVar=%%outsideVar%% >>c:\temp\newbatch.bat
echo.^> usermessage.vbs echo.WScript.Echo InputBox( "Pick something to test SETLOCAL/ENDLOCAL on?", "Variable:", "INSIDEVARIABLE" ) >>c:\temp\newbatch.bat
echo.FOR /F "tokens=*" %%%%A IN ('CSCRIPT.EXE //NoLogo usermessage.vbs') DO SET insideVar=%%%%A >>c:\temp\newbatch.bat
echo.DEL usermessage.vbs >>c:\temp\newbatch.bat
echo.echo.Your variable is %%insideVar%% >>c:\temp\newbatch.bat
echo.echo.You have set the Second Variable: %%insideVar%% in this new batch file! >>c:\temp\newbatch.bat
echo.echo.%%insideVar%% is now Inside the new batch >>c:\temp\newbatch.bat
echo.Pause >>c:\temp\newbatch.bat
echo.ENDLOCAL >>c:\temp\newbatch.bat

echo.You are about to run the new batch file
pause
call c:\temp\newbatch.bat

cls
pause
echo.You created a batch file that set your outsideVar variable in it
echo.%outsideVar% is still set outside

ENDLOCAL
REM Install Batch Script
REM Created by Trevor G.

В этом сценарии у нас есть уникальный способ убедиться, что каждая строка будет записана в конец нового пакетного сценария, но также вы должны помнить ключевые моменты здесь ... бывают случаи, когда вам нужно будет использовать^ (карат) и время, когда вам нужно будет удвоить свой %%, чтобы убедиться, что обе ваши переменные будут пройдены, а также что вы не запускаете другую команду в своем скрипте перед записью ее в новый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...