【问题标题】:Calling Powershell script via SQL Server agent job - start-transcript doesn't get output通过 SQL Server 代理作业调用 Powershell 脚本 - start-transcript 没有得到输出
【发布时间】:2012-04-03 12:12:19
【问题描述】:

(here) 已有一个关于此的问题。但我希望因为我使用的是 PowerShell 2 和 SQL Server 2008,所以如果我再问一次,我可能会得到不同的答案。

基本上,我有一个 SQL Server 代理作业,它运行如下 cmd 脚本:

powershell "&D:\SQL\Job\JobDir\Upload.ps1 (various arguments including log file name)"

当它运行 start-transcript 时,文件被创建,但除了标题之外什么都没有写入文件。但是,当我在命令行上运行时,一切都会正确记录。

我已经有很多逻辑来管理 powershell 脚本中的旧日志文件,并且不想只使用 SQL Server 代理提供的默认日志记录。

为了写出信息,我使用带有详细标志的invoke-sqlcmd,以及写消息和写错误。

感谢您的任何指点! 西尔维娅

【问题讨论】:

    标签: sql-server powershell


    【解决方案1】:

    start-transcript 创建一个文本文件

    很可能是运行代理作业的权限没有权限创建powershell要创建的文本文件

    【讨论】:

    • 感谢您的评论。我修改了问题以使其更清晰,但实际上正在创建文件,几乎没有写入任何内容。
    • 我仍然会怀疑权限 - 尝试使用您自己的凭据运行作业。
    【解决方案2】:

    权限对我来说不是问题。我认为有一些方法可以非常精确地处理 powershell 的输出,包括所有不同的输出流(错误、详细等),但我没有深入了解这些细节,而是使用 SQL Server 代理为每个作业步骤提供的默认日志记录.它工作正常。我仍然使用我编写的逻辑来管理和归档脚本中的日志文件,即使日志文件本身是由 SQL Server 生成的,我也可以这样做。

    【讨论】:

      【解决方案3】:

      我认为当控制台未启动(例如在服务中)时 start-transcript 不起作用:未生成输出,这可以解释文件为空的原因。

      start-transcript causes script to fail in a background job

      【讨论】:

        【解决方案4】:

        如上所述,Start-Transcript 将在指定位置创建一个文件(只要代理有权在该位置创建文件)。然而,由于技术上没有控制台窗口正在运行,因此不会将任何内容流式传输到脚本文件。

        通过 SQL 代理(2012 年之前)运行 powershell 文件时,例如 C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe C:\myscript.ps1 "SOMEPARAMETER"

        我只是在 SQL 步骤高级属性中使用 SQL 代理的本机输出文件选项,例如 C:\LOGGING\myfile_$(ESCAPE_SQUOTE(STRTDT))_$(ESCAPE_SQUOTE(STRTTM)).txt 并跳过powershell的转录能力。

        在必要时包括 Write-Host。 Write-Host "rn" 将适当地创建新行。 还包括允许的 -Verbose 和带有错误输出的 try / catch 之类的内容,文件将正确记录。

        【讨论】:

          猜你喜欢
          • 2021-05-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多