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

时间:2015-12-05 12:41:01

标签: batch-file cmd

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

这是我代码的一部分(完整代码长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

3 个答案:

答案 0 :(得分:1)

if "%mappaneve: =%" EQU "" goto hiba

即,用 nothing 替换所有空格,如果结果是 nothing ,则输入必须是所有空格(如果那是什么你在问)

答案 1 :(得分:0)

引号用于变量asignation以确保正确处理空间。除非您想使用它,否则不要在变量中包含引号。将代码更改为此。

  

set / p“mappaneve =文件夹的名称:”

答案 2 :(得分:0)

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命令。因此,建议避免choice(Microsoft文章)作为环境变量或标签的名称。使用UserChoice(CamelCase拼写更容易阅读)代替Choice

    命令选择对于第一个用户提示是一个非常好的选择,因为用户不能输入不同于1,2,3或4的内容。

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

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

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

  7. 建议在提示用户或清除变量之前为环境变量定义默认值。用户只能点击 RETURN ENTER ,在这种情况下环境变量会保持其值。

    这是针对Choice完成的,但mappaneve已被遗忘。

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

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

  10. 由于文件夹名称中存在1个或多个无效字符,文件已存在同名,或者用户无权创建文件夹,因此文件夹创建可能会失败。

    最后一个原因是当前目录是用户的桌面目录,如果用户真的只输入文件夹名称而不是目录路径来创建目录(树),这也是非常不可能的。< / p>

    因此建议在创建文件夹时测试成功。

  11. 要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

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

    另请阅读Microsoft文章: