【问题标题】:Command result capture into variable is not working命令结果捕获到变量中不起作用
【发布时间】:2016-09-23 15:42:03
【问题描述】:

我有一个复杂的批处理脚本,其中涉及多个 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

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

【问题讨论】:

  • 我猜在最后一个( 之前的BCP 命令行末尾缺少&amp;&amp;... BCP 是批处理文件吗?如果是这样,请在其前面加上call。对于LogText,您需要delayed expansion,因为您正在修改在同一代码块中读取该变量...
  • 是的,在 ( 之前有一个 &&。我用 BCP 编辑了我的原始代码(我的参数)>> %LogFile% && ( true 语句) || (SET /p LogText=
  • 延迟扩展设置在批处理文件的开头并在末尾停止。它仍然无法正常工作。
  • 请注意,SET /p LogText=&lt;%LogFile% 仅将 first 行文本分配给变量;你可能期待别的东西......?

标签: file variables batch-file text set


【解决方案1】:

YADXP.

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

应该可以。查看有关“延迟扩张”的十亿左右 SO 条目


正如我所说,set /p var=&lt;filename 将从文件的 first 行设置变量。由于文件累积值并且最初设置为仅包含一行 (AAUI) 'None',因此 that 是将从文件中读取的值。

试试

   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将具有最后的值 文件的行。

【讨论】:

  • 以上方法我都试过了。到目前为止,它不起作用。我尝试的是在批处理开始时设置延迟扩展,并在所有 BCP 命令运行后结束。那没有用。没有错误,只是相同的结果。当答案显示时,我将尝试将它包裹在 sqlcmd 语句中,看看这是否会有所不同。
  • 围绕 sqlcmd 语句也不起作用。为了进一步详细说明,我在批处理开始时将 LogText 变量初始化为“None”。 'None' 是插入到我的日志表中的内容,而不是 SET /p LogText=
  • 刚刚通过连续运行三个 bcp 语句进行验证。 LogFile 的状态没有改变。它仍然是“无”。
  • 所以 logfile 总是只包含 None ?您知道&gt;&gt; 附加到文件中,不是吗?因此,如果BCP 生成输出,则该输出将附加到初始Noneset /p 将只读取第一行。你想读最后一行吗 - 但正如你所说,logfile 没有改变。
  • 糟糕,我的意思是变量 %LogText% 的状态没有改变。日志文件正确附加了 BCP 输出。我要解决的问题是将 %LogFile% 的内容存储在变量 %LogText% 中,但它不起作用。 %LogText% 的状态从不改变其初始值“无”。此外,作为测试,我尝试使用硬编码名称而不是变量名称来设置 %LogText% 的值。它也不起作用。即.. SET /p LogText=Log_2016_09_23.log
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    相关资源
    最近更新 更多