Как передать имя переменной как часть параметра в пакетный файл, а затем использовать его?

Я пытаюсь запустить пакетный файл, который принимает строку, содержащую имя переменной. Тогда переменная будет использоваться в пакетном файле. Например...

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 ответов


код:

@ECHO off
SET param=%1
SET num=1
CALL SET x=%param%
ECHO %x%

выход:

user1

как я понимаю 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