我想批量生成一个基本的文本编辑器,我使用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
)
答案 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
提示批处理文件的用户输入字符串时,用户可以自由
让我们看一下
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命令解释程序将产生的内容。