Как передать имя переменной как часть параметра в пакетный файл, а затем использовать его?
Я пытаюсь запустить пакетный файл, который принимает строку, содержащую имя переменной. Тогда переменная будет использоваться в пакетном файле. Например...
C:>test.bat user%num%
в пакетном файле...
set num=1
(This is where I need help... Somehow set domainusername=user1)
echo %domainusername%
set num=2
...
идея состоит в том, чтобы разрешить пакетный вызов работать одинаково независимо от того, где находится имя переменной. Образцы..
C:>test.bat %num%user
or
C:>test.bat us%num%er
Edit:
Я уже провел много исследований, пытаясь сделать эту работу. Самая многообещающая идея, которую я пробовал цикл for для рекурсивной оценки %1 (в Примере). К сожалению, у меня ничего не получилось. Надеюсь, это пробудит некоторые идеи для других.
4 ответов
как я понимаю OP, ответы Aacini и stackoverflow неверны.
решение отложенного расширения (Aacini) может работать только если num
определяется перед запуском пакета, else %mnm%
никогда не будет расширяться.
C:\>set "num="
C:\>myBatch.bat user%num%
результаты к выходуuser%num%
другое решение (stackoverflow) работает немного лучше, но не, когда num
определен
я добавил второй set num=2
to продемонстрируйте это
@ECHO off
SET param=%1
SET num=1
CALL SET x=%param%
ECHO %x%
set num=2
CALL SET x=%param%
ECHO %x%
вызов его два раза показывает проблему
C:\>myBatch user%num%
user1
user2
C:\>myBatch user%num%
user2
user2
во втором заходе вы получили 2
два раза, в результате фиксируется при запуске пакета.
это хорошая идея, чтобы повторить содержание %1
чтобы увидеть, если действительно есть или если %num%
уже расширен.
как я понимаю OP (возможно, что я этого не понимаю!), вопрос о используя заполнитель,
но это сложно с процентами, поскольку он работает только в командной строке (не из другого пакета), и он работает только в том случае, если переменная не определена в этот момент.
Потому что, если переменная определена, то %num%
будет расширяться немедленно и содержание %1
is user2
, а не user%num%
(при условии num=2).
то, что он иногда работает, является только побочным эффектом анализатора cmd-line, поскольку он не удаляет неопределенную переменную (как внутри пакетного файла), вместо этого расширение неопределенной переменной никоим образом не изменится.
echo "%thisIsUndefined%" - from cmd-line this outputs `"%thisIsUndefined%"`
echo "%thisIsUndefined%" - from a batch file this outputs `""`
но в качестве побочного эффекта не существует способа избежать знака процента в контексте cmd-line.
Существует только обходной путь для псевдо побег.mybatch user%num^%
На самом деле он не избегает процента, но в основном не будет существовать переменной с именем num^
.
тогда решение stackoverlow будет работать, с:
myBatch user%num^%
но я бы предпочел отсроченное расширение, упомянутое Аачини.
Вы бы назвали пакет восклицательными знаками, а не процентами, обычно это работает хорошо, так как отложенное расширение по умолчанию отключено.
myBatch user!num!
сама партия будет выглядеть так
@echo off
set "param=%1"
Setlocal EnableDelayedExpansion
set num=1
echo %param%
set num=2
echo %param%
извините. Думаю, я не совсем понимаю, чего ты хочешь. Однако...
если вы передадите имя переменной в пакетный файл, вы можете присвоить значение этой переменной непосредственно таким образом:
set %1=Any value
если вы хотите get значение такой переменной, необходимо использовать отложенное расширение: insert setlocal EnableDelayedExpansion
команда в начале и заключите имя переменной (параметр %1) в восклицательный знак Маркс:
setlocal EnableDelayedExpansion
set varValue=!%1!
в вашем случае, я думаю, вы хотите достичь чего-то подобного:
set num=1
set domainusername=!user%num%!
echo %domainusername%
но это не использует параметр %1, Как вы сказали, поэтому я не знаю...
надеюсь, это поможет...
редактировать: возможно этот пост может быть для вас полезной...
дополнительное соглашение: после того, как я понял, чего хочет OP, это мое решение:
@ECHO off
setlocal EnableDelayedExpansion
SET param=%1
SET num=1
SET x=!param!
ECHO %x%
задержки расширение выполняется быстрее вызова...
как запоздалая мысль, вы можете рассмотреть возможность тестирования этой переменной, прежде чем решить, что она действительно существует. Добавьте это в начало вашей программы:
if %1.==. goto :usage_orwherever