Batch file 批处理操作系统输入系统中的一个错误
我正在批量制作一个操作系统。我的输入系统有问题。如果我输入一个空格(或多个空格)作为输入,它会显示一个不应该出现的错误。我也不知道如何修复它 另外,如果“%comm%”==“goto loop,则带有Batch file 批处理操作系统输入系统中的一个错误,batch-file,Batch File,我正在批量制作一个操作系统。我的输入系统有问题。如果我输入一个空格(或多个空格)作为输入,它会显示一个不应该出现的错误。我也不知道如何修复它 另外,如果“%comm%”==“goto loop,则带有的行检查输出是否为空。这不是错误制造者 @echo off color a :loop set comm= title %username%@%computername% : %cd% set /p comm=[%username%@%computername%] if "%comm%"==""
的行检查输出是否为空。这不是错误制造者
@echo off
color a
:loop
set comm=
title %username%@%computername% : %cd%
set /p comm=[%username%@%computername%]
if "%comm%"=="" goto loop
if exist "%cd%"\%comm%.* (
call "%cd%"\%comm% 2>nul
)
goto error
:error
echo '%comm%' is not recognized as a programm or command.
goto loop
:nosw
@echo off
cls
echo Access Denied.
pause
好的,在阅读了关于正确引用命令行参数的文章之后,我终于找到了这个解决方案:
set comm=%comm: =^^ %
set comm=%comm:"=""%
此代码将放置在设置/p…
行下方和如果…
条件之前。它以插入符号(第1行)位于所有空格之前,并将所有双引号(第2行)加倍。这样,这些角色中的任何一个都不再被视为有毒角色
解释
插入符号(^)被cmd.exe命令行解释器用作所谓的“行延续字符”,这意味着按字面理解下一个字符,而不是解释其(可能的)特殊含义(包括空格字符的特殊含义,用于在命令行上拆分命令)
根据本线程中的其他讨论:方括号“[]”根本不作为任何特殊字符处理。这就是为什么当内部有空间时它仍然失败的原因
与此相反,双引号确实被视为特殊字符,意思是在第一次找到双引号后,口译员将逐字解释所有即将到来的文本。但是解释器也会这样做,直到找到下一个双引号,这就是为什么if
对不平衡双引号的求值仍然失败的原因。为了防止这种情况,每个双引号本身也需要加倍
希望现在能有所帮助。(很抱歉将其作为一个答案,评论中不可能有格式)
@当字符串中有未配对的引号时,这两种方法都会失败;如果有成对的引号,这两种方法都有效。我仍然不认为使用括号有什么好处,但在使用有毒字符(甚至空格!)的情况下,qoutes效果更好
C:\>if "a"b"c" == "a"b"c" echo paired quotes
paired quotes
C:\>if "a"b" == "a"b" echo unpaired quotes
"echo" kann syntaktisch an dieser Stelle nicht verarbeitet werden.
C:\>if [a"b"c] == [a"b"c] echo paired quotes
paired quotes
C:\>if [a"b] == [a"b] echo unpaired quotes
"echo" kann syntaktisch an dieser Stelle nicht verarbeitet werden.
C:\>if ""a"" == ""a"" echo parameter is already in quotes
parameter is already in quotes
C:\>if ["a"] == ["a"] echo parameter is already in quotes
parameter is already in quotes
C:\>if "a b" =="a b" echo poison character
poison character
C:\>if [a b] ==[a b] echo poison character
"b]" kann syntaktisch an dieser Stelle nicht verarbeitet werden.
对于robvanderwoude关于%1
的问题:如果“%~1”==“hello”
(该~
最终删除了周围的引号),则使用可以轻松解决问题您可以标记您的输入(以空格作为分隔符)并重新组合它们:
@echo off
setlocal enabledelayedexpansion
:loop
set "comm="
set /p "comm=[%username%@%computername%] "
set /a count=0
REM tokenize input:
for %%i in (%comm%) do (
set /a count+=1
set "word!count!=%%i"
)
REM check for empty input (or spaces only):
if %count% == 0 ( echo no valid input & goto :loop )
REM debug: show all words:
for /l %%i in (1,1,%count%) do echo [!word%%i!]
REM reassemble the words:
set "words="
for /l %%i in (1,1,%count%) do set "words=!words! !word%%i!"
REM remove first space (from assembling):
set "words=%words:~1%"
echo -%words%-
REM do with it whatever has to be done
goto :loop
这是可行的,因为两个或多个连续分隔符(空格)被视为一个。是否允许%comm%
有空格?%comm%可以有空格,但只能像这样“abc abc”(不带引号)。当我键入“abc”或“abc”时,它会给我一个错误。最好使用引号而不是括号(防止有毒字符,例如,如果[a>b]=[a>b]
将失败,如果“a>b”==“a>b”
工作正常。)@Stephan:似乎取决于变量的建议内容。“我很好奇;你能给我举个例子吗,方括号比qoutes更好用吗?@Stephan:据我所知,当内容本身包含引号时,引号不起作用。但是我不能在我的Mac电脑上测试这个-下周之前不行。还想知道这是否真的是真的。当我设置%comm%a空格时,它会给出“]==[此时选择的任何内容都是意外的”并退出。有人能测试一下我的程序,看看我在说什么吗?感谢这里提供的全面示例。确实,你说服了我更喜欢引号,而不是方括号,因为评估它似乎更“稳定”在某些情况下。因此,下面的问题似乎是:如何处理特殊字符,以及如何正确引用,因为用户输入后shell不会自动引用。%comm%可以有空格,但只能像这样“abc abc”(不带引号)。当我键入“abc”或“abc”这给了我一个错误。@Stephan:现在找到了解决不平衡引号问题的正确方法-->@Marco:研究得很好,但为了使它可靠,你必须避开所有有毒字符(&
,|
,
)。这很不容易,但可能值得做额外的工作。