2014-02-02 4 views
1

У меня есть пакетный скрипт, который по сути представляет собой бесконечный цикл, который сбрасывается после паузы> nul. Тем не менее, мне нужен способ заменить каждый набор/p на набор, чтобы удалить запрос, все еще показывая ввод, который был указан в предыдущем цикле. Могу ли я реализовать что-то в этом скрипте, чтобы самостоятельно отредактировать весь набор/p для установки?Batch Self-Altering Script

@echo off 
title 
setlocal enabledelayedexpansion 
:a 
cls 
set /p a=Hello, world 
echo %a% 
pause>nul 
goto a 

Вывод, который я хочу после первой петли:

@echo off 
title 
setlocal enabledelayedexpansion 
:a 
cls 
set a=Hello, world 
echo %a% 
echo %a% 
pause>nul 
goto a 

Может кто-нибудь, пожалуйста, объясните мне answser Aacini, потому что это, кажется, работает отлично.

+2

Пожалуйста, покажите нам сценарий, который вы хотите изменить самостоятельно, и код, который вы должны сделать до сих пор. – Monacraft

+0

Я обновил сообщение, чтобы показать сценарий. – user3093536

+0

, который не установлен ... – nephi12

ответ

1

idk, что вы пробовали, или как выглядит ваш сценарий, но попробуйте что-то вроде этого.

set p=/p var=prompt 
:a 
set %p% 
pause>nul 
set p=var=prompt 
goto a 

Если это не поможет, пожалуйста, опишите вашу проблему дальше.

ps, ​​а не на компьютере со списком прямо сейчас, поэтому не можете проверить это.

+0

Это не работает. – Monacraft

+0

Единственная проблема, с которой я вижу, заключается в том, что она оставила переменную навсегда, как var = prompt после первого цикла. Мне нужно изменение, которое позволяет использовать p как «/ p var = prompt», когда оно выполняется в первый раз, но затем изменено на «var = prompt» для следующего выполнения. – user3093536

+0

monacraft, это действительно работа. он делает именно то, что он должен был делать, так как в то время у меня не было кода, чтобы уйти, кроме цикла goto, cls и паузы. – nephi12

2

Это решить первоначальную просьбу заменить каждыеset /p ... команды по set ... из них:

@echo off 
title 
setlocal enabledelayedexpansion 
set pSwitch=/p 
:a 
cls 
set %pSwitch% a=Hello, world 
echo %a% 
pause>nul 
set "pSwitch=" 
goto a 

Просто используйте формат set %pSwitch% ... во всех командах, которые вы хотите изменить.

EDIT: Ответить на комментарии

В вашем примере вы изменили команду set /p var=Prompt по set var=Prompt, то есть после первого цикла вы назначаете Запрашивать переменной! После того, как вы прочли свой последний комментарий, я понял, что вы хотите «сохранить переменные, введенные пользователем постоянно». Вы можете сделать это следующим образом:

  • В начале вашей программы вставьте: call :initVars.
  • Изменить каждую команду set /p var=Prompt от call :mySet var="Prompt".
  • В конце вашей программы, вставки:

.

:mySet var="Prompt" 
if not defined %1 (
    set /P "%1=%~2" 
    echo set "%1=!%1!" >> "%~F0" 
) 
exit /B 

:initVars 

Например:

@echo off 
title 
setlocal enabledelayedexpansion 
call :initVars 

:a 
cls 
call :mySet a="Hello, world" 
echo %a% 
pause>nul 
goto a 

:mySet var="Prompt" 
if not defined %1 (
    set /P "%1=%~2" 
    echo set "%1=!%1!" >> "%~F0" 
) 
exit /B 

:initVars 
+0

Это именно то, что было опубликовано выше, но мне нужно сделать это для нескольких переменных, которые определены на разных этапах бесконечного цикла. – user3093536

+0

Это решение «заменит все установленные/заданные параметры», как вы просили, после выполнения _anyone_ из набора/p. Вы хотите выборочно заменить _one_ set/p для установки после его выполнения? В вашем запросе вы указываете «каждый набор/p на набор» два раза ... – Aacini

+0

Я имею в виду это в том смысле, что будет несколько наборов/p, которые вводятся в различные циклы, и поэтому я пытаюсь выполнить каждый набор/p, прежде чем менять его на набор. – user3093536

1

Это будет просить значение в самый первый раз и использовать «Привет, мир» во всех остальных работает в цикле (то есть то, что говорит ваш пример):

@echo off 
set "a=" 
    :a 
if not defined a (set /p "a=Hello, world:") else (set a=Hello, world) 
echo %a% 
pause>nul 
goto :a 

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

@echo off 
set "a=" 
    :a 
if not defined a (set /p "a=Hello, world:") else (echo %a%) 
pause>nul 
goto :a 
+0

Размещение, если утверждения для каждой переменной были бы утомительными, но это то, что соответствует тому, что я ищу. Может ли это быть сделано таким образом, чтобы максимально эффективно использовать переменные? – user3093536