如何让Batch脚本支持多行粘贴输入以解密加密邮件?
Batch脚本实现多行粘贴输入的解决方案
方法一:通过循环读取直到空行结束
这种方式让用户粘贴内容后,输入空行即可终止输入,逻辑简单直观。
示例脚本:
@echo off setlocal enabledelayedexpansion :: 定义换行符,注意两行之间必须保留空行 set "newline=^ " echo 请粘贴多行加密邮件内容,输入空行结束: set "encrypted_content=" :read_line set "line=" set /p line= :: 若输入为空行,终止读取 if not defined line goto end_read :: 若已有内容,先追加换行符再添加新行 if defined encrypted_content set "encrypted_content=!encrypted_content!!newline!" set "encrypted_content=!encrypted_content!!line!" goto read_line :end_read echo 已获取完整加密内容: echo !encrypted_content! :: 在此处添加你的解密处理逻辑 endlocal
关键说明:
- 启用
enabledelayedexpansion是为了在循环中正确拼接字符串变量; set "newline=^"后面必须跟一个空行,才能正确定义Batch中的换行符;- 每次读取一行后判断是否为空,为空则结束输入循环。
方法二:通过Ctrl+Z(EOF)终止输入
这种方式适合用户直接粘贴完整内容后,按Ctrl+Z再回车结束输入,无需额外输入空行。
示例脚本:
@echo off setlocal enabledelayedexpansion :: 定义换行符 set "newline=^ " echo 请粘贴多行加密邮件内容,完成后按 Ctrl+Z 再按回车结束: set "encrypted_content=" :: 使用findstr读取所有输入行,每行添加行号前缀 for /f "delims=" %%a in ('findstr /n "^"') do ( set "line=%%a" :: 移除行号前缀(格式为"行号:内容") set "line=!line:*:=!" if defined encrypted_content set "encrypted_content=!encrypted_content!!newline!" set "encrypted_content=!encrypted_content!!line!" ) echo 完整加密内容: echo !encrypted_content! :: 在此处添加解密逻辑 endlocal
关键说明:
findstr /n "^"会读取所有输入行(包括空行),并为每行添加行号前缀;- 通过
!line:*:=!移除行号前缀,保留原始内容; - 输入完成后按
Ctrl+Z会触发EOF标记,终止for /f循环。
为什么set /p无法处理多行输入
set /p命令的设计逻辑是仅读取第一个换行符之前的内容,所以无论粘贴多少行,它只会捕获第一行内容,因此必须通过循环读取或结合其他命令来实现多行输入捕获。
内容的提问来源于stack exchange,提问作者Patfred
相关产品推荐
相关产品推荐

