Batch file 如果一个变量被设置为一个变量的名称,那么它能成为那个变量吗?(批)

Batch file 如果一个变量被设置为一个变量的名称,那么它能成为那个变量吗?(批),batch-file,optimization,Batch File,Optimization,所有的p(数字)都是路径。例如,%P1%可能是D:\。然后,我让他们说出一个数字。如果他们选择1,我把它和一个P结合起来,得到了P1,第一个变量。我可以将A设置为变量P1吗?这将使代码更加优化。我想试着把所有的东西都放在一个小得可笑的空间里。 下载: 简短回答,基于初始代码: 使用delayedexpansion set "a=!P%Pc%!" echo %a% 还是用电话 call set "a=%%P%Pc%%%" echo %a% 不过。要做到这

所有的p(数字)都是路径。例如,%P1%可能是D:\。然后,我让他们说出一个数字。如果他们选择1,我把它和一个P结合起来,得到了P1,第一个变量。我可以将A设置为变量P1吗?这将使代码更加优化。我想试着把所有的东西都放在一个小得可笑的空间里。 下载:


简短回答,基于初始代码: 使用
delayedexpansion

set "a=!P%Pc%!"
echo %a%
还是用电话

call set "a=%%P%Pc%%%"
echo %a%
不过。要做到这一点,您需要更改配置文件的工作方式。 目前,您的配置有一个主要缺陷,您明确希望忽略某些行号,如果有人删除或添加行号,它将破坏您的代码。您需要使用一些for循环,然后跳过以
REM

因此,配置需要如下所示(为了缩短答案,我将其缩小):

现在是代码。部分

@echo off
setlocal enabledelayedexpansion
set pwnum=0
set iwnum=0
set spnum=0
for /f "tokens=1,* delims==" %%i in ('type launcherconfiguration.txt ^| findstr /v "REM "') do (
    if "%%i" equ "0" (
         echo not configured
         goto :eof
    )
    if "%%~i" == "pwads" (
        set /a pwnum+=1
        set "PWADlocat!pwnum!=%%~j"
      ) else (
    if "%%~i" == "iwads" (
        set /a iwnum+=1
        set "IWADlocat!iwnum!=%%~j"
      ) else (
    if "%%~i" == "sp" (
            set /a spnum+=1
            set "SPlocat!spnum!=%%~j"
    )
   )
  )
 )
echo PWADLocation:
for /l %%a in (1,1,%pwnum%) do echo %%a. !PWADLocat%%a!
set /p pw=Choose:
call echo you chose %%PWADlocat!pw!%%
call set "PW=%%PWADlocat!sp!%%"
echo you chose %PW%
pushd "%PW%" rem This will goto the dir
rem do other things
popd

echo IWADLocation:
for /l %%a in (1,1,%iwnum%) do echo %%a. !IWADLocat%%a!
set /p pw=Choose:
call set "IW=%%IWADlocat!sp!%%"
echo you chose %IW%
pushd "%IW%" rem This will goto chosen the dir
rem do other things
popd

echo SPLocation:
for /l %%a in (1,1,%spnum%) do echo %%a. !SPLocat%%a!
set /p sp=Choose:
call set "SP=%%SPlocat!sp!%%"
echo you chose %SP%
pushd "%SP%" rem This will goto the chosen SP dir
rem do other things
popd
让我简单地解释一下。我们为每个数据类型设置一个数字,只要在找到更多匹配的行时增加计数,然后使用另一个
for/l
循环再次使用计数

要测试这一点,您需要将此代码复制到新的批处理文件中,将其放置在与配置文件相同的位置并进行测试。您的代码还有很多内容,但我只关注您要求的内容


注意,我仍然希望使用
choice
,但由于您提到的蜂鸣,我在代码中保留了
set/p
选项。

有没有办法阻止蜂鸣?这是一个警告,表明您选择了错误的键。说明很清楚,有5个选项,不要使用另一个:)但可以设置为不嘟嘟声,但将根据系统而定。欢迎您使用You
set/p
不过,如果您愿意,我只是给了您选择,因为这是一种更好的使用选择的方式。我使用set/p只能得到“ECHO is off”。我将把它发布给公众,这样我就不想发出太大的恼人的声音。只显示echo off表示您设置了错误,编辑您的问题并显示完整的代码,包括如何设置
Pn
变量。您没有显示如何设置变量。必须在某个地方设置“P1=something”等。如果希望变量
a
包含另一个变量的名称(如
P1
),则需要将
echo%a%%
更改为
调用echo%%%a%%
echo!%a%何时启用(首选)。如果希望变量
a
包含另一个变量的值,请将
set“a=p%pc%”更改为
call set“a=%%p%pc%%”
set“a=!p%pc%!
(也带有延迟扩展)…
REM Please set this to 1, or the program will NOT run!
1
REM ------------------------------------------------------------------------------------------
REM Please put paths to the folder your [PWADS] are in. Not the pwads themselves.
REM ------------------------------------------------------------------------------------------ 
pwads=C:\Some path
pwads=D:\Another
REM ------------------------------------------------------------------------------------------
REM Please put the path to your [IWADS]. Only ten though! Make sure it's the iwads themselves.
REM ------------------------------------------------------------------------------------------
iwads=D:\iwads1
iwads=D:\some path2
REM ------------------------------------------------------------------------------------------
REM Please put the path to your [Source Port] exe's. You must be doing something weird if you have more than ten.
REM ------------------------------------------------------------------------------------------
sp=D:\
sp=E:\
REM ------------------------------------------------------------------------------------------
REM Now, please leave this alone. It's so I know everything works.
REM ------------------------------------------------------------------------------------------
1
@echo off
setlocal enabledelayedexpansion
set pwnum=0
set iwnum=0
set spnum=0
for /f "tokens=1,* delims==" %%i in ('type launcherconfiguration.txt ^| findstr /v "REM "') do (
    if "%%i" equ "0" (
         echo not configured
         goto :eof
    )
    if "%%~i" == "pwads" (
        set /a pwnum+=1
        set "PWADlocat!pwnum!=%%~j"
      ) else (
    if "%%~i" == "iwads" (
        set /a iwnum+=1
        set "IWADlocat!iwnum!=%%~j"
      ) else (
    if "%%~i" == "sp" (
            set /a spnum+=1
            set "SPlocat!spnum!=%%~j"
    )
   )
  )
 )
echo PWADLocation:
for /l %%a in (1,1,%pwnum%) do echo %%a. !PWADLocat%%a!
set /p pw=Choose:
call echo you chose %%PWADlocat!pw!%%
call set "PW=%%PWADlocat!sp!%%"
echo you chose %PW%
pushd "%PW%" rem This will goto the dir
rem do other things
popd

echo IWADLocation:
for /l %%a in (1,1,%iwnum%) do echo %%a. !IWADLocat%%a!
set /p pw=Choose:
call set "IW=%%IWADlocat!sp!%%"
echo you chose %IW%
pushd "%IW%" rem This will goto chosen the dir
rem do other things
popd

echo SPLocation:
for /l %%a in (1,1,%spnum%) do echo %%a. !SPLocat%%a!
set /p sp=Choose:
call set "SP=%%SPlocat!sp!%%"
echo you chose %SP%
pushd "%SP%" rem This will goto the chosen SP dir
rem do other things
popd