使用变量值的空格设置/ p

时间:2016-11-26 17:15:01

标签: batch-file cmd command-prompt prompt

我想批量生成一个基本的文本编辑器,我使用set / p来获取用户输入并将其写入文件。

当我输入类似"你好"或者"你好"它工作得很好,但是一旦我用空格和其他字符写一些东西,比如" hello world",窗口就会关闭。

我的代码是:

set /p append=Write what you want to append: 

然后我尝试了:

set /p "append=Write what you want to append: "

我在网上找到了,但它没有用。

暂停没有任何帮助,因为一旦按下回车,程序就会崩溃。

帮助!

以下是完整代码:

:append
set /p "append=Write what you want to append: "
if %append%==return (
    cls
    goto start
)
echo %append% >> %filename%
goto append

:override
cls
echo Name: %filename%
set /p override="Write new content: "
echo %override% > %filename%
pause
cls
goto start

:writefile
echo.
set /p filename=Write file name.extension: 
choice /c AO /m "Append to file or override? "
if %ERRORLEVEL%==1 (
    cls
    echo Name: %filename%
    goto append
) else (
    goto override
)

3 个答案:

答案 0 :(得分:1)

将您的set更改为在引号字符串周围的正确位置放置引号,并将if行更改为在正在测试的字符串周围放置引号。

set /p append="Write what you want: " 
set append 
echo xx%append%yy
if "%append%"=="return" (
   echo Yes!
)

答案 1 :(得分:1)

你的问题在于

if %append%==return (

如果append包含空格,则会出现语法错误。

使用

if "%append%"=="return" (

"引用一个字符串"使cmd将其解释为单个元素,因此需要if的语法,

if string==string (

不再受到侵犯。

答案 2 :(得分:1)

每当使用set /P提示批处理文件的用户输入字符串时,用户可以自由

  1. 只需按 RETURN ENTER 即可输入任何内容,这导致环境变量在提示之后仍未定义,如果之前未定义,或变量保留其当前值(如果之前已定义)或
  2. 输入任何包括字符串的字符串,由于稍后批处理代码中的语法错误或不需要的行为,可能导致批处理执行退出。
  3. 让我们看一下

    if %append%==return (
    

    如果之前没有使用默认值定义环境变量且批处理用户什么都不输入,则此行在预处理步骤中会扩展为:

    if ==return (
    

    此命令行当然无效,并且由于语法错误导致批处理退出。

    现在让我们假设用户输入字符串:

    I want to append this string.
    

    然后 IF 命令行扩展为:

    if I want to append this string.==return (
    

    当然这个命令行也是无效的。

    其他的回答者建议将两个字符串括起来用双引号进行比较,即使用命令行:

    if "%append%"=="return" (
    

    但这真的能解决所有可能的问题吗?

    现在代码对任何用户输入都是安全的。

    让我们看看如果用户输入字符串会发生什么:

    " is a double quote. It should be used around paths like "%ProgramFiles(x86)%".
    

    IF 命令行现在扩展为:

    if "" is a double quote. It should be used around paths like "%ProgramFiles(x86)%""=="return" (
    

    此命令行再次无效,由于语法错误导致批处理文件退出。

    那么如何确保批量代码对任何用户输入都是安全的呢?

    解决方案是在用户输入字符串的任何地方使用延迟环境变量扩展。

    示例:

    @echo off
    setlocal EnableDelayedExpansion
    echo.
    echo Enter EXIT to exit this batch script.
    
    :PromptUser
    echo.
    set "UserInput=Nothing^!"
    set /P "UserInput=Please enter a string: "
    if /I "!UserInput!" == "exit" goto EndBatch
    echo You entered: !UserInput!
    goto PromptUser
    
    :EndBatch
    echo.
    echo Thanks for running this example batch code.
    echo.
    echo The batch file ends in 3 seconds ...
    endlocal
    %SystemRoot%\System32\ping.exe localhost -n 4 >nul
    

    通过使用延迟扩展,用户输入的字符串无法在以后的代码中导致无效或意外的命令行。这对命令行也很重要

    echo !append!>>%filename%
    

    重要的是>>没有空格字符,或者此空格字符也会作为尾随空格写入文件。

    但是,如果用户输入2只会导致echo %append%>>%filename%

    ,则延迟扩展也很重要
    echo 2>>%filename%
    

    不会将字符2附加到文件中,但会将 STDERR 附加到文件中,从而导致写入文件的空行。

    用户输入的字符串也需要延迟扩展:

    (Var1 > 0x2F) && (Var1 < 0x3A)
    

    应该使用 ECHO 写入输入的文件,而不是在使用echo %append%>>%filename%扩展字符串后Windows命令解释程序将产生的内容。