Назначение переменной для аргументов с циклом for [closed]


1

Итак, я довольно долго искал, как это сделать, но я сдался, потому что просто не мог ничего найти.

Итак, у меня есть код (ниже); его главная цель - получить 9 аргументов и назначить их как переменные - игнорировать эхо и пиппинг.

Мой вопрос: Как я могу упростить это с помощью цикла for или такого, чтобы он не занимал так много кода, и если возможно, иметь более 9 аргументов

set pkg1=%1
set pkg2=%2
set pkg3=%3
set pkg4=%4
set pkg5=%5
set pkg6=%6
set pkg7=%7
set pkg8=%8
set pkg9=%9

IF DEFINED pkg1 (echo %1.ini 1> %WINGET_TEMP%\args.rdc 2>nul)
IF DEFINED pkg2 (echo %2.ini 1>> %WINGET_TEMP%\args.rdc 2>nul)
IF DEFINED pkg3 (echo %3.ini 1>> %WINGET_TEMP%\args.rdc 2>nul)
IF DEFINED pkg4 (echo %4.ini 1>> %WINGET_TEMP%\args.rdc 2>nul)
IF DEFINED pkg5 (echo %5.ini 1>> %WINGET_TEMP%\args.rdc 2>nul)
IF DEFINED pkg6 (echo %6.ini 1>> %WINGET_TEMP%\args.rdc 2>nul)
IF DEFINED pkg7 (echo %7.ini 1>> %WINGET_TEMP%\args.rdc 2>nul)
IF DEFINED pkg8 (echo %8.ini 1>> %WINGET_TEMP%\args.rdc 2>nul)
IF DEFINED pkg9 (echo %9.ini 1>> %WINGET_TEMP%\args.rdc 2>nul)

Вы собираетесь передать это? Или введите их в начале сценария? В каком формате вы хотите получить аргументы?
Austin T French

Ответы:


6

Без каких-либо уродливых идти к заявления:

@echo off
setlocal enabledelayedexpansion
set cnt=0
for %%a in (%*) do (
  set /a cnt+=1
  set pkg!cnt!=%%a
)
for /l %%a in (1,1,!cnt!) do (
  echo pkg%%a=!pkg%%a!
)
endlocal

Выход

C:\>loopbat a b c d e f g h i j k l "m n" o p q r s t u v w x y z
pkg1=a
pkg2=b
pkg3=c
pkg4=d
pkg5=e
pkg6=f
pkg7=g
pkg8=h
pkg9=i
pkg10=j
pkg11=k
pkg12=l
pkg13="m n"
pkg14=o
pkg15=p
pkg16=q
pkg17=r
pkg18=s
pkg19=t
pkg20=u
pkg21=v
pkg22=w
pkg23=x
pkg24=y
pkg25=z

Если вы хотите удалить кавычки из аргументов, содержащих пробелы, используйте set pkg!cnt!=%%~a вместо set pkg!cnt!=%%a (в первой есть дополнительная тильда на случай, если вы не заметите разницу).


1
Это работает до тех пор, пока ни один из аргументов не содержит *, ?, или же !, Но будут проблемы, если какой-либо из этих символов будет присутствовать в аргументах. Надежное решение, которое поддерживает эти символы, требует GOTO.
dbenham

1
Позвольте мне повторить это. Может быть возможным создать надежный скрипт без GOTO, который выполняется без CALL. Но GOTO с SHIFT - лучший вариант для разумного надежного решения.
dbenham

2

Это должно помочь вам достичь того, что вы хотите:

@echo off
set i=1

:again
rem use %~1 to remove any potential surrounding quotes (")
if "%~1"=="" goto end
set pkg%i%=%~1

set /a i+=1
shift
goto again

:end
set i=

Вот проверка этого в командном файле с именем doit.bat:

C:\Users\johnma>doit a b c d "e f" g hi j k l mn o p

C:\Users\johnma>set
.
.
.
pkg1=a
pkg10=l
pkg11=mn
pkg12=o
pkg13=p
pkg2=b
pkg3=c 
pkg4=d
pkg5=e f
pkg6=g
pkg7=hi
pkg8=j
pkg9=k
.
.    
C:\Users\johnma>

1
+1, но код был бы более надежным, если бы вы использовали сравнение IF "%~1" вместо "%1", Ваше заявление о приращении может быть упрощено до set /a i+=1
dbenham

0

GetAll.cmd:

@set AllArg=%*
@echo %AllArg%

Разделить переменную AllArg любой метод.


2
Это сработало бы, если не спрашивать больше как разделить его или обойти это. Instaof просто получить все это в один большой кусок, как это.
Jared Allard

2
Это хорошая идея, но не очень полезная, так как вы не показали, как это сделать. Это сложно, потому что вы не хотите разделять на кавычки. Возможно, что еще более важно, это почти невозможно реализовать должным образом, потому что без кавычек = является разделителем токенов и не существует практического метода поиска и замены = в пределах партии.
dbenham
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.