Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 为什么我的变量没有在选项中设置。蝙蝠_Batch File - Fatal编程技术网

Batch file 为什么我的变量没有在选项中设置。蝙蝠

Batch file 为什么我的变量没有在选项中设置。蝙蝠,batch-file,Batch File,我有一个批处理文件,当我执行它时,它得到了不同的变量。我不知道我在哪里失败了。它有两种选择,首先选择哪个游戏,然后将其设置为变量game,然后选择它使用的电脑转到命令。但结果是不同的。这是我的代码: @ECHO OFF CLS ECHO Copy Game Files From Choices Below ECHO 1.Crossfire ECHO 2.Dota2 ECHO 3.Dragon Nest ECHO 4.Fortnite ECHO 5.Rules Of Survival ECHO 6

我有一个批处理文件,当我执行它时,它得到了不同的变量。我不知道我在哪里失败了。它有两种选择,首先选择哪个游戏,然后将其设置为变量
game
,然后选择它使用的电脑
转到
命令。但结果是不同的。这是我的代码:

@ECHO OFF
CLS
ECHO Copy Game Files From Choices Below
ECHO 1.Crossfire
ECHO 2.Dota2
ECHO 3.Dragon Nest
ECHO 4.Fortnite
ECHO 5.Rules Of Survival
ECHO 6.World Of Tantra
ECHO.

CHOICE /C 123456 /M "Enter your choice:  "
:: Note - list ERRORLEVELS in decreasing order
IF ERRORLEVEL 6 Set Game=WorldOfTantra
IF ERRORLEVEL 5 Set Game=RulesOfSurvival
IF ERRORLEVEL 4 Set Game=Fortnite
IF ERRORLEVEL 3 Set Game=DragonNest
IF ERRORLEVEL 2 Set Game=Dota2
IF ERRORLEVEL 1 Set Game=Crossfire


::=====================================

ECHO Select PC to Copy Files
ECHO 1.PC1
ECHO 2.PC2
ECHO 3.PC3
ECHO 4.PC4
ECHO.

CHOICE /C 1234 /M "Enter your choice:  "

:: Note - list ERRORLEVELS in decreasing order
IF ERRORLEVEL 4 SET PCCode=JeraldPunx04 GOTO CopyFiles
IF ERRORLEVEL 3 SET PCCode=JeraldPunx03 GOTO CopyFiles
IF ERRORLEVEL 2 SET PCCode=JeraldPunx02 GOTO CopyFiles
IF ERRORLEVEL 1 SET PCCode=JeraldPunx01 GOTO CopyFiles

::=====================================

:CopyFiles
echo "Test Variable: %Game% in %PCCode%"
if %Game%==WorldOfTantra (
echo "Copying %Game% in %PCCode%"
)
if %Game%==RulesOfSurvival (
echo "Copying %Game% in %PCCode%"
)
if %Game%==Fortnite (
echo "Copying %Game% in %PCCode%"
)
if %Game%==DragonNest (
echo "Copying %Game% in %PCCode%"
)
if %Game%==Dota2 (
echo "Copying %Game% in %PCCode%"
)
if %Game%==Crossfire (
echo "Copying %Game% in %PCCode%"
)

GOTO End

::=====================================


:End
pause

这只是一个简单的问题,但我很难找到答案。

如果您将文件重命名为.cmd,它会正常工作

批处理文件使用稍微不同的语法。如果您坚持将其保留为.BAT,我会像这样重写您的选择块:

CHOICE /C 123456 /M "Enter your choice:  "
SET ErrLvl=%errorlevel%
IF %ErrLvl%==6 Set Game=WorldOfTantra
IF %ErrLvl%==5 Set Game=RulesOfSurvival
IF %ErrLvl%==4 Set Game=Fortnite
IF %ErrLvl%==3 Set Game=DragonNest
IF %ErrLvl%==2 Set Game=Dota2
IF %ErrLvl%==1 Set Game=Crossfire

在您的代码中,
ErrorLevel
未进行比较,每次您都将获得在最新的set语句中设置的值。例如,Game=Crossfire,所以Game总是返回Crossfire。 将您的代码替换为以下代码:

请参见下面的语法: 变量的用法类似于
%ERRORLEVEL%
,我们应该在批处理文件中使用
eq
运算符进行比较

@ECHO OFF
CLS
ECHO Copy Game Files From Choices Below
ECHO 1.Crossfire
ECHO 2.Dota2
ECHO 3.Dragon Nest
ECHO 4.Fortnite
ECHO 5.Rules Of Survival
ECHO 6.World Of Tantra
ECHO.

CHOICE /C 123456 /M "Enter your choice:  "
:: Note - list ERRORLEVELS in decreasing order
IF %ERRORLEVEL% EQU 6 Set Game=WorldOfTantra
IF %ERRORLEVEL% EQU 5 Set Game=RulesOfSurvival
IF %ERRORLEVEL% EQU 4 Set Game=Fortnite
IF %ERRORLEVEL% EQU 3 Set Game=DragonNest
IF %ERRORLEVEL% EQU 2 Set Game=Dota2
IF %ERRORLEVEL% EQU 1 Set Game=Crossfire

::=====================================

ECHO Select PC to Copy Files
ECHO 1.PC1
ECHO 2.PC2
ECHO 3.PC3
ECHO 4.PC4
ECHO.

CHOICE /C 1234 /M "Enter your choice:  "

:: Note - list ERRORLEVELS in decreasing order
IF %ERRORLEVEL% EQU SET PCCode=JeraldPunx04 GOTO CopyFiles
IF %ERRORLEVEL% EQU SET PCCode=JeraldPunx03 GOTO CopyFiles
IF %ERRORLEVEL% EQU SET PCCode=JeraldPunx02 GOTO CopyFiles
IF %ERRORLEVEL% EQU SET PCCode=JeraldPunx01 GOTO CopyFiles


::=====================================

:CopyFiles
echo "Test Variable: %Game% in %PCCode%"
if %Game%==WorldOfTantra (
echo "Copying %Game% in %PCCode%"
)
if %Game%==RulesOfSurvival (
echo "Copying %Game% in %PCCode%"
)
if %Game%==Fortnite (
echo "Copying %Game% in %PCCode%"
)
if %Game%==DragonNest (
echo "Copying %Game% in %PCCode%"
)
if %Game%==Dota2 (
echo "Copying %Game% in %PCCode%"
)
if %Game%==Crossfire (
echo "Copying %Game% in %PCCode%"
)

GOTO End

::=====================================
:End
pause

我的评论作为回答,显示了我提到的修改和您在第二个
Choice
命令中使用的
ErrorLevel
方法,这是安全的,因为它们后面有
GoTo
命令:

@Echo关闭
ClS
从下面的选项复制游戏文件
回声1。交叉火力
回声2。第二世界
回声3。龙巢
回声4。福特尼特
回声5。生存法则
回声6。坦陀罗世界
回音(
选择/C 123456/M“输入您的选择”
如果“%ErrorLevel%”==“6”设置“游戏=WorldOfTantra”
如果“%ErrorLevel%”==“5”设置“游戏=生存规则”
如果“%ErrorLevel%”==“4”设置“Game=Fortnite”
如果“%ErrorLevel%”==“3”设置“游戏=龙巢”
如果“%ErrorLevel%”==“2”设置“Game=Dota2”
如果“%ErrorLevel%”==“1”设置“游戏=交叉火力”
::=====================================
Echo选择PC以复制文件
Echo 1.PC1
Echo 2.PC2
Echo 3.PC3
Echo 4.PC4
回音(
选择/C 1234/M“输入您的选择”
如果错误级别4设置“PCCode=JeraldPunx04”&转到复制文件
如果错误级别3设置“PCCode=JeraldPunx03”&转到复制文件
如果错误级别2设置“PCCode=JeraldPunx02”&转到复制文件
如果错误级别1设置“PCCode=JeraldPunx01”&转到复制文件
::=====================================
:复制文件
Echo“测试变量:%Game%在%PCCode%中”
如果“%Game%”==“WorldOfTantra”(
Echo“正在%PCCode%中复制%Game%”
)
如果“%Game%”==“rulesofsofsurvival”(
Echo“正在%PCCode%中复制%Game%”
)
如果“%Game%”==“Fortnite”(
Echo“正在%PCCode%中复制%Game%”
)
如果“%Game%”==“DragonNest”(
Echo“正在%PCCode%中复制%Game%”
)
如果“%Game%”==“Dota2”(
Echo“正在%PCCode%中复制%Game%”
)
如果“%Game%”==“Crossfire”(
Echo“正在%PCCode%中复制%Game%”
)
::=====================================
:结束
暂停

这是我的方法,使用一对
命令和直接使用
%errorlevel%
值:

@ECHO OFF
rem Next command in needed to process array elements
setlocal EnableDelayedExpansion

rem Define "games" array at same time the menu is displayed
CLS
ECHO Copy Game Files From Choices Below
set "i=0"
for %%a in (Crossfire Dota2 "Dragon Nest" Fortnite "Rules Of Survival" "World Of Tantra") do (
   set "game=%%~a"
   set /A i+=1
   echo !i!.!game!
   set "games[!i!]=!game: =!"
)
ECHO/

CHOICE /C 123456 /M "Enter your choice:  "
rem Assign the corresponding element from "games" array
Set "Game=!games[%errorlevel%]!"

::=====================================

ECHO Select PC to Copy Files
for /L %%i in (1,1,4) do ECHO %%i.PC%%i
ECHO/

CHOICE /C 1234 /M "Enter your choice:  "
SET PCCode=JeraldPunx0%errorlevel%

::=====================================

:CopyFiles

rem "Game" variable can only have one of the previously assigned values,
rem so it is not necessary to check any value

echo "Copying %Game% in %PCCode%"

GOTO End

::=====================================

:End
pause

使用引号(以避免空格或其他特殊字符的麻烦):
如果“%Game%”==“WorldOfTantra”(…)
如果ErrorLevel 6
将按预期工作,不幸的是,所有
ErrorLevel
5..1
对于
ErrorLevel
6
也将是正确的,因为
如果ErrorLevel 1
意味着错误级别是
1
或更高。请改为此语法,
如果“%ErrorLevel%”==“6”盘游戏=世界杯"
等等。为什么不直接使用
%errorlevel%
值呢?假设您有一个值可能在1到6之间的N变量,您想将其添加到SUM变量中。您会怎么做:
如果%N%eq 1 SET/A SUM=SUM+1
如果%N%eq 2 SET/A SUM=SUM+2
等等,或者只是一个简单的
SET/A SUM=SUM+%N%
:/
见下文。。。