命令结果捕获到变量不起作用

时间:2016-09-23 15:42:03

标签: file variables batch-file text set

我有一个复杂的批处理脚本,涉及多个BCP命令,可以使用平面文件数据加载SQL Server。我正在使用分支语句将命令的结果记录到日志文件中。这一切都很好。

结果也会在SQL表中记录为成功或失败。我想要做的是,在失败时,使用我认为的简单重定向将日志文件的内容插入到SQL日志表中。它不起作用。

以下是我在Win Server 2012环境中的批处理文件中所做的事情:

BCP (the parameters here don't matter) >> %LogFile% (
    MOVE %FileName% to Archive/%FileName%
    sqlcmd -E -Q "EXEC spImportLog 'SUCCESS', %FileName%, ''
) || (
   SET /p LogText=<%LogFile%
   sqlcmd -E -Q "EXEC spImportLog 'FAILED', %FileName%, %LogText%
)

此代码执行时没有错误。声明的真实部分运作正常。 假部分执行正常,但我最终得到空字符串而不是 %LogText%的内容。

当我从命令提示符运行它时,SET看起来像这样:

SET / p LogText&lt; 0Log_2016_9_23.log

%LogFile%是一个变量,因为它是根据今天的日期在运行时动态命名的。我不知道低于标志后的0来自何处,或者它是否是我问题的根源。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

YADXP。

   SET /p LogText=<%LogFile%
   setlocal enabledelayedexpansion
   sqlcmd -E -Q "EXEC spImportLog 'FAILED', %FileName%, !LogText!
   endlocal

应该有效。查看关于&#34;延迟扩展&#34;

的十亿左右的SO条目

正如我所说,set /p var=<filename将从文件的第一个行设置变量。由于文件累积值并且最初sset只包含一行(AAUI)&#39;无&#39;然后 是将从文件中读取的值。

尝试

   for /f "usebackqdelims=" %%a in ("%LogFile%") do set "logtext=%%a"
   setlocal enabledelayedexpansion
   sqlcmd -E -Q "EXEC spImportLog 'FAILED', %FileName%, !LogText!
   endlocal

应该读取%logfile%的每一行并依次分配logtest值(每行的值),这样当for终止时,logtext将会有文件的最后行的值。

答案 1 :(得分:0)

好的,谢谢你的帖子。它听起来不像我想做的事情是可能的。至少不是我试图这样做的方式。我想要的是将%LogFile%的全部内容作为文本流存储在变量中,然后将该文本流插入SQL Server中的varchar列。回想起来,我在最初的帖子中对我正试图解决的问题不够清楚。我知道我可以将命令结果(多行)存储在SQL Server的临时表中。它只需要使用xp_cmdshell,我希望避免使用它。