在变量值中设置 /p 为空格

set /p with spaces in variable value

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

当我输入 "hello" 或 "hello " 之类的东西时,它工作正常,但是一旦我用 space 和后面的另一个字符写东西,比如 "hello world", window 关闭。

我的代码是:

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
)

更改 set 以在提示字符串周围的正确位置放置引号,并更改 if 行以在被测试的字符串周围放置引号。

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

你的问题在于

if %append%==return (

如果 append 包含空格,将给出语法错误。

使用

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

"quoting a string" 使 cmd 将其解释为单个元素,因此 if

所需的语法
if string==string (

不再违规

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

  1. 只需按 RETURNENTER 即可完全不输入任何内容,这会导致环境变量仍未定义如果之前没有定义,则在提示之后,或者如果之前已经定义,则变量保持其当前值,或者
  2. 实际上可以输入任何内容,包括一个字符串,该字符串可能会由于稍后批处理代码中某处的语法错误或不需要的行为而导致批处理执行退出。

让我们一起看看就行

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%

重要的是 >> 的左边没有 space 字符,否则这个 space 字符也会作为尾随 space.[=27= 写入文件]

但是延迟扩展在这里也很重要,例如用户输入 2 会导致 echo %append%>>%filename% in

echo 2>>%filename%

不会将字符 2 附加到文件,但会将 STDERR 附加到文件,这会导致向文件写入空行。

用户输入的这个字符串也需要延迟展开:

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

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