通过 Windows 批处理文件执行时 ECHO 无法正常工作

Posted

技术标签:

【中文标题】通过 Windows 批处理文件执行时 ECHO 无法正常工作【英文标题】:ECHO not working correctly when executing via Windows batch file 【发布时间】:2012-05-14 20:05:58 【问题描述】:

我正在尝试编写一个简单的批处理脚本,如果该环境最近已刷新并清除了我们的更改,我们的用户可以使用该脚本将一些代码重新部署到该环境。

该脚本运行良好,但它并没有按照我想要的方式进行记录。对我们的部署过程进行限制(我不是 DBA,只是一个开发人员),我们不能在文件中包含 ECHO 命令。

为了解决这个问题,作为批处理脚本的一部分,我在工作目录中创建了一个login.sql 文件,其中包含“SET ECHO ON”和“SPOOL file.log APPEND”命令。目标是这将在脚本之前执行并假脱机我的输出。然而,虽然 SPOOL 命令似乎在工作,但脚本的内容并没有被 ECHO。

这是批处理脚本中的相关代码:

:: Identify all files that begin with a number and end with .sql and write to a file.
dir /b *.sql | findstr /b "[0-9]" > ScriptsToImplement.txt

:: Show the user the files to be executed and confirm whether to proceed
echo The following scripts will be executed in %DB%:
for /f "delims=" %%i in (ScriptsToImplement.txt) do echo %%i
echo:
set /p PROCEED=Proceed with implementation? [y/n] ^>
if /i "%PROCEED%" NEQ "y" (goto :opt_to_terminate)

:: Build the user profile SQL file that will be executed after logging into SQLPlus
:: This allows for the spooling of the output without having the SPOOL command declared in the file.
echo SET ECHO ON >> login.sql
echo SPOOL %DB%~%FOLDER%~%DATESTAMP%.log APPEND >> login.sql

:: Go through the SQL files in the text file and execute them in the specified database.
for /f "delims=" %%i in (ScriptsToImplement.txt) do (
echo exit | sqlplus -L -S %DB_USER%/%DB_PASS%@%DB% @%%i
if %errorlevel% NEQ 0 (@echo an error occurred with applying %%i; stopping further script execution... & pause & goto :terminate) else (@echo %%i was applied successfully) >> %DATESTAMP%_run_all.log
)

我的理解是,由于这是使用每个单独的脚本启动一个单独的 SQL*Plus 会话,它每次都调用 login.sql 文件,因此每次都应该使用 SET ECHO ON 命令。

【问题讨论】:

这是echo exit | sqlplus -L -S %DB_USER%/%DB_PASS%@%DB% @%%i 您每次都称为“调用login.sql”的行。这就是它的工作方式。 您确认脚本不包含SET ECHO OFF吗? @dbenham 是的,我编写了脚本。它们包含的唯一非 DDL/DML 是 ALTER SESSION 命令。 【参考方案1】:

如果您在 BAT 文件中使用它,请记住 ECHO 是命令,而不是环境变量。开启回显的命令是ECHO ONSET ECHO ON 不影响回声行为。它返回 “环境变量 ECHO 未定义”

【讨论】:

SET ECHO ON 是一个 SQL*Plus 命令。我正在将该命令写入我的 login.sql 文件,希望它在我的脚本之前执行。

以上是关于通过 Windows 批处理文件执行时 ECHO 无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

bat 如何实现换行

批处理自动备份并生成日志文件

windows通过批处理怎么查找关键字 ,脚本怎么写?

重定向 Windows 批处理文件命令的回显

如何执行 perl 程序以及通过相同的 Windows 批处理文件给用户输入

通过批处理进行Windows服务的安装/卸载&启动/停止