if语句后批处理文件崩溃

时间:2017-12-24 08:25:01

标签: batch-file cmd

我正在尝试使用批处理制作类似Linux的终端。我不知道代码有什么问题。 它在

之后崩溃了

Set "word[!i!]=%cmd: ="&Set /A i+=1&Set "word[!i!]=%" echo %word[1]% if "%word[1]%==ls" dir

这是我的代码:

@Echo on
pushd C:\
Set "cmd="
For /F "Delims==" %%A In ('Set word[') Do Set "%%A="
set "UserAccount=%username%"
cls
:Loop
SetLocal EnableDelayedExpansion
Set /P "cmd=%UserAccount%@%UserAccount%~%cd%$ "
If Not Defined cmd EndLocal EnableDelayedExpansion & GoTo Loop
Set "i=1"
Set "word[!i!]=%cmd: ="&Set /A i+=1&Set "word[!i!]=%"
echo %word[1]%

if "%word[1]%==ls" dir
if "%word[1]%==cd" goto cd
if "%word[1]%==cd .."  cd..
if "%word[1]%==cd ." cd.
GoTo Loop
:cd
if Not Defined %word[2]% echo %cd% & GoTo Loop
cd %word[2]%

EndLocal EnableDelayedExpansion
goto Loop

2 个答案:

答案 0 :(得分:1)

可能你已编码

Set "word[!i!]=%cmd: ="&Set /A i+=1&Set "word[!i!]=%"

你想要的地方

Set "word[!i!]=%cmd: =%"&Set /A i+=1&Set "word[!i!]="

然后你需要修复

if "%word[1]%==ls" dir

if /i "%word[1]%"=="ls" dir

(已插入/i以使比较不区分大小写)

我还避免使用cmd作为变量名,因为cmd.exe是命令处理器本身。

另请注意,setlocal会建立endlocal发布的当前环境的副本。正如您的代码目前所代表的那样setlocals不会被endlocals所平衡,因此您有一个不断积累的嵌套环境安排 - 并且嵌套级别有限。

答案 1 :(得分:1)

同样彻底改变你的SetLocal/EndLocal表达式......

变化:

if "%word[1]%==ls"

If /I "%word[1]%"=="ls"

同样改变:

if "%word[1]%==cd"

If /I "%word[1]%"=="cd"

这两个是不可能的,因为每个都是两个单词,其中%word[1]%只是cd

if "%word[1]%==cd .." 
if "%word[1]%==cd ."

同样改变:

if Not Defined %word[2]%

If Not Defined word[2]

另外,我告诉你,当我给你the code设置你的话时,它依赖于你的句子。如果您希望输入命令并将特殊字符和语法识别为具有该代码的单个单词,那么您可能会感到失望。