我正在尝试使用批处理制作类似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
答案 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设置你的话时,它依赖于你的句子。如果您希望输入命令并将特殊字符和语法识别为具有该代码的单个单词,那么您可能会感到失望。