2017-12-24 13 views
-1

バッチで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 
+1

K-Popでは、適切な修正のためにスクリプトに間違いがあります。あなたの全体的なアプローチは完全に再考する必要があります。私は人々がcmd.exeバッチスクリプトを使ってコンソールセッションのような非cmd.exeを書くことを試みている多くの疑問を見てきました。これは* nixのように振る舞いますが、そうではありません。 _私はそれが合理的で価値のある追求であるとは思わない。 – Compo

答えて

1

おそらく、あなたはあなたが、その後

if "%word[1]%==ls" dir 
を修正する必要があると思い

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

を意図

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

をコード化されましたcmd.exeコマンドプロセッサそのものであるので、私はまた、変数名としてcmdを使用しないようにしたい

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

/iが比較大文字と小文字を区別しないを作るために挿入された場合)

から210

また、setlocalは、endlocalによってリリースされた現在の環境のコピーを確立することに注意してください。あなたのコードは現在のところ、あなたのsetlocalsはendlocalsによってバランスが取れていないので、あなたは常に蓄積されたネストされた環境配置を持っています - そしてネストレベルは限られています。

1

としてだけでなく、完全にあなたのSetLocal/EndLocal表現を見直し...

変更:

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

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

にも変更:

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

01に

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を与えたとき、あなたの文に依存していると言いました。あなたがコマンドを入力することを期待していて、そのコードで特殊文字と構文が個別の単語として認識されたら、あなたは失望する可能性があります。

関連する問題