2012-12-30 76 views
1

我有一個奇怪的問題。下面的程序應該檢查用戶的輸入並在屏幕上回顯它,除非輸入是某種」命令「我已經在」if「語句中定義了類似於/ h或/ r或/ x。IF語句的語句,它將把字符串視爲單個項目而不是多個單獨的字符串,所以當我輸入一個分號如 的逗號) 分號(;) 等於(=) 空格() 表() 引用(「) 它將搜索第二個項目,從而引發錯誤並退出。 這是我的問題。如果你不理解我,請測試這個程序。 我想以某種方式首先檢查這些「命令」,然後再回應輸入。 請賜教! :/ 謝謝。空間和「是非法輸入,而我回顯變量%輸入%

@echo off 

:again 
set /p input= ^> 

if /i {%input%}=={/h} (
cls 
echo /h 
echo /r 
echo /x 
goto again 
) 

if /i {%input%}=={/r} (
cls 
type blablafile.txt 
goto again 
) 

if /i {%input%}=={/x} (
exit 
) 

echo %input% 
goto again 
+1

「它不會工作」究竟怎麼了? IE瀏覽器。發生了什麼事情,它與應該發生的事情有什麼不同? (最好編輯問題,而不是在評論中解釋。) – hyde

+0

你的編輯沒有幫助。重複「它不工作」再也沒有告訴我們什麼是不工作的。請再次編輯,準確告訴我們**「什麼」不起作用「的意思,並提供一些」不起作用「的示例輸入。 –

+0

你是對的。抱歉。我搜索了更多,並更多地瞭解了關於「if」命令的內容,並意識到了問題的根源。我已更新原始帖子。 – Leajian

回答

3

IF語句具有IF Value1 CompareOperator Value2 COMMAND

該生產線具有的一般形式爲實際執行的IF之前被解析成各個部件。有很多情況可能導致無效的語法。

一些明顯的有特殊字符,如&|<>:這些必須進行轉義像^&或引用像"&"

沒有那麼明顯的一個問題是令牌的分隔符像<space><tab>;,=。這些也必須逃脫或引用。以你的程序中的一行爲例,用<space>作爲用戶輸入。的'%輸入%膨脹之後,行是

if /i { }=={/h} (

解析器在第一未轉義/無引號標記定界符終止值1,因此它認爲是值1和{它認爲}是CompareOperator的一部分。這會產生語法錯誤。

另一個問題是奇數引號的值,例如您的用戶輸入示例"

if /i {"}=={/h} (

行情是一個狀態機。一旦啓用引用,解析器會認爲所有字符都一直到下一個引用都是同一個字符串的一部分。所以解析器認爲Value1是{"}=={/h} (,並且該命令不完整 - 另一個語法錯誤。

部分解決

你可以做類似

if /i "%input%"=="/h" ... 

,它會與像;<space>,或者=輸入工作等

但仍有很多輸入將失敗。例如:""&"

完整的解決方案

唯一肯定的方式做試驗是使延遲擴展和使用!input!,而不是%input%。這是有效的,因爲解析器在延遲擴展發生之前檢測到IF語句的各個組件。

if /i !input!==/h (

解析器標識值1是!input!,然後剛好在執行之前,該值被擴展到用戶輸入。此時不再需要進行解析--IF語句「知道」整個擴展值是要比較的值。

這裏是你的代碼的一個完整的工作版本與延遲擴展的解決辦法:

@echo off 
setlocal enableDelayedExpansion 

:again 
set /p input= ^> 

if /i !input!==/h (
cls 
echo /h 
echo /r 
echo /x 
goto again 
) 

if /i !input!==/r (
cls 
echo type blablafile.txt 
goto again 
) 

if /i !input!==/x (
exit /b 
) 

echo !input! 
+0

但是,如果我想將變量!input!回顯到一個文件中呢?就像echo!input!>> inputs.txt它只是輸出文本!輸入!到inputs.txt。 – Leajian

+0

@Leajian - 這應該工作。你確定你啓用了延遲擴展嗎? – dbenham

+0

忘記我的上面的評論...但是,有什麼區別!輸入! 和我輸入%?我問,因爲在我的完整程序中,我都有!var_name!和%var_name%變量。當啓用延遲擴展時,程序會感到困惑。 – Leajian

4

嘗試將所有花括號改爲雙引號。這解決了您提到的一些簡單情況下的分隔符問題,例如輸入字符串中的空格。例如,

if /i {%input%}=={/h} 

可改爲

if /i "%input%"=="/h" 

注意,這不處理其他一些情況下,比如在輸入字符串中的雙引號。看到解決這個問題的其他答案。

+0

這並不解決單引號「''作爲輸入的問題,正如原始問題中所報告的那樣。請參閱[我的答案](http://stackoverflow.com/a/14096327/1012053)中的解釋,作爲一個傻瓜證明的解決方案 – dbenham

+0

@dbenham謝謝,我已經編輯了我的答案,並提供了一個關於你提到的雙引號問題的註釋,順便說一句,請問下面的人請解釋他們的關注(希望我通過這個編輯來解決它)? – 808sound

+0

我認爲一個投票是苛刻的,而且沒有要求,只是你知道,它不是我 – dbenham