如何在批处理脚本中识别空格键



所以,我创建了一个程序,可以在桌面上创建和删除文件夹。我有一个问题,当我只为名称写一个空格时,我得到了错误"请写一个有效的文件夹名称!"所以它有效,但如果我使用了多个空格,它会说"文件夹创建成功",我想让这个程序在我只使用文件夹名称中的空格时出错。请帮忙!

这是我代码的一部分(完整代码长132行)

set Choice=
set /p Choice="Choose an option: "
if '"%Choice%"'=='"1"' goto masodik
if '"%Choice%"'=='"2"' goto negyedik
if '"%Choice%"'=='"3"' goto otodik
if '"%Choice%"'=='"4"' goto harmadik
if not '"%Choice%"'=='"1"' goto hiba2
if not '"%Choice%"'=='"2"' goto hiba2
if not '"%Choice%"'=='"3"' goto hiba2
if not '"%Choice%"'=='"4"' goto hiba2
:masodik
cls
echo Create a folder
echo ---------------
echo.
cd "%systemdrive%/documents and settings/%username%/desktop"
echo Enter the folder's name!
echo.
set /p mappaneve="The folder's name: "
if "%mappaneve%" EQU "" goto hiba
if EXIST "%mappaneve%" goto hiba3
md "%mappaneve%"
cls
echo Create a folder
echo ---------------
echo.
echo Successfully created "%mappaneve%"!
timeout /t 3 >nul
cls
goto elso
if "%mappaneve: =%" EQU "" goto hiba

即,用nothing替换所有空间,如果结果是none,那么输入必须是所有空间(如果你问的是这样的话)

在变量签名中使用引号,以确保正确处理空间。除非你想使用它,否则不要在变量中包含引号。试着把代码改成这样。

set/p"mappaneve=文件夹名称:"

Magoo在他的简短回答中发布了正确的代码。

这里有一个更长的答案,带有注释的批处理代码,并与问题文章中的代码相比,对该代码的各种改进进行了额外的解释。

set "UserChoice="
set /p "UserChoice=Choose an option: "
if "%UserChoice%" == "1" goto masodik
if "%UserChoice%" == "2" goto negyedik
if "%UserChoice%" == "3" goto otodik
if "%UserChoice%" == "4" goto harmadik
rem None of the 4 valid numbers was entered.
goto hiba2
:masodik
rem Set current directory to desktop directory of current user.
cd /D "%USERPROFILE%Desktop"
cls
echo Create a folder
echo ---------------
echo.
rem Define a double quote as default value to be able to remove all
rem double qotes from input string with no syntax error even if the
rem user just hits key RETURN or ENTER without entering any string.
set "mappaneve=""
set /p "mappaneve=Enter folder name: "
rem Remove all double quotes from entered folder name.
set "mappaneve=%mappaneve:"=%"
rem Check if user has entered anything at all and if entered folder name
rem does not exist of only 1 or more spaces by using environment variable
rem substitution which removes for string comparison all spaces from the
rem entered folder name.
if "%mappaneve%" == "" goto hiba
if "%mappaneve: =%" == "" goto hiba
rem Appending * makes sure to test on existence of a folder and not a file.
rem It does not matter if entered folder name ends already with a backslash.
rem Does the folder already exist?
if exist "%mappaneve%*" goto hiba3
rem Create the folder and verify if that was successful with
rem saving error message into a temporary file for output below.
md "%mappaneve%" 2>"%TEMP%%~n0_FolderError.tmp"
if errorlevel 1 goto FolderError
rem On successful creation of the folder an empty file is
rem created which should be removed before processing further.
del "%TEMP%%~n0_FolderError.tmp"
cls
echo Create a folder
echo ---------------
echo.
echo Created successfully "%mappaneve%".
timeout /t 3 >nul
cls
goto elso
:FolderError
cls
echo Failed to create folder "%mappaneve%".
echo.
echo Error message:
echo.
type "%TEMP%%~n0_FolderError.tmp"
del "%TEMP%%~n0_FolderError.tmp"
echo.
pause

改进是:

  1. 将字符串与命令IF进行比较时,应仅使用环绕的双引号。单引号将从4个字符串比较中删除。

    当然,如果批处理用户输入例如"2"(带双引号的数字2),则由于处理if ""2"" == "1" goto masodik引起的语法错误,命令处理器将退出批处理执行。使用延迟变量展开将是解决此问题的一种方法。

  2. 具有if not '"%Choice%"'==...的4行可以简单地用goto hiba2代替,因为在前4个字符串比较之后它们都是绝对正确的。

  3. choice(SS64文章)是一个标准的Windows命令。因此,建议避免选择(Microsoft文章)作为环境变量或标签的名称。使用UserChoice(CamelCase拼写以便于阅读)代替Choice

    命令选项将是第一个用户提示的一个很好的选择,因为这样用户就不能输入不同于1、2、3或4的内容。

  4. Windows预定义了环境变量USERPROFILE,该变量包含用户配置文件目录的路径,该目录包含目录Desktop和其他与用户帐户相关的目录。应该使用此变量,而不是使用其他变量构建路径。

  5. Windows上的目录分隔符是反斜杠字符,而不是正斜杠字符。同时,Windows也支持使用/而不是的目录路径,但最好使用正确的目录分隔符。

  6. 用户的配置文件目录可以位于不同于系统驱动器的驱动器上。或者执行批处理文件的驱动器与用户配置文件目录的驱动器不同。因此,建议使用带有参数/D的命令CD,否则,如果当前驱动器与用户配置文件目录的驱动器不同,则更改目录可能会失败。

  7. 建议在提示用户或清除变量之前为环境变量定义默认值。用户只需点击RETURNENTER

    这是为Choice完成的,但为mappaneve忘记了。

  8. 用户可以用双引号输入文件夹名称。因此,建议从输入的文件夹名称中删除所有双引号,否则,由于在进一步处理批处理文件时出现语法错误,命令处理器将退出批处理脚本处理。

  9. 为了真正测试具有if exist而不是文件的文件夹的存在,有必要将*附加到文件夹名称,否则if exist也可能为真,用户输入字符串为现有文件的名称。

  10. 文件夹的创建可能会失败,原因是文件夹名称中有一个或多个无效字符,已存在同名文件,或者用户没有创建文件夹的权限。

    最后一个原因在这里是不太可能的,因为如果用户真的只输入了一个文件夹名称,而不是一个目录路径来创建目录(树),那么当前目录就是用户的桌面目录,这在这里也是可能的。

    因此,建议测试创建文件夹的成功率。

为了理解所使用的命令及其工作方式,请打开命令提示符窗口,在那里执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面。

  • cd /?
  • cls /?
  • del /?
  • echo /?
  • goto /?
  • if /?
  • md /?
  • rem /?
  • set /?
  • timeout /?
  • type /?

同时阅读微软的文章:

  • 测试批处理文件中的特定错误级别
  • 使用命令重定向运算符

最新更新