Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理操作系统输入系统中的一个错误_Batch File - Fatal编程技术网

Batch file 批处理操作系统输入系统中的一个错误

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%"==""

我正在批量制作一个操作系统。我的输入系统有问题。如果我输入一个空格(或多个空格)作为输入,它会显示一个不应该出现的错误。我也不知道如何修复它

另外,如果“%comm%”==“goto loop,则带有
的行检查输出是否为空。这不是错误制造者

@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:研究得很好,但为了使它可靠,你必须避开所有有毒字符(
&
|
)。这很不容易,但可能值得做额外的工作。