【问题标题】:How to succesfully run a batch file in an SQL Agent job?如何在 SQL 代理作业中成功运行批处理文件?
【发布时间】:2024-01-01 03:25:01
【问题描述】:

尊敬的 * 用户,

我有一个 SQL 代理作业,它在 PDF 文件中生成特定报告,然后将 PDF 复制到网络目录,然后删除源目录中的 PDF 文件。

SQL 作业由 2 个步骤组成: 1. 生成报告 2. 将报告复制到网络位置。

对于第 2 步,我制作了一个 bat 文件,用于处理 pdf 文件的复制和删除。

bat文件如下:

set source_dir=C:\Reports\Energie\Uur
set dest_dir=\\KWS2-WEB-SERVER\Share\Reports\Uur

C:\Windows\System32\Robocopy.exe %source_dir% %dest_dir% /MOV /Z

但是,当我运行作业时,它会挂在第二步。状态只是停留在“正在执行”。

这是我在步骤中声明的行(要执行的 bat 文件的位置):

cmd.exe /c "C:\Reports\rapport_uur_copy.bat"

我的工作设置如下:

第 1 步

类型:操作系统 (CmdExec) 成功时:转到下一步

失败时:退出作业报告失败

第 2 步

类型:操作系统(CmdExec)

成功时:辞职报告成功

失败时:退出作业报告失败

一些事实:

  • 我有网络目录的读/写权限
  • 我以管理员帐户(登录用户,默认)运行这些步骤
  • 第一步成功
  • 我运行的是 Windows Server 2008 R2 Standard
  • 我有 SQL Server 2008 R2
  • 当我从 cmd 手动运行脚本时,它可以工作(在管理员帐户下)。

提前致谢!

【问题讨论】:

  • 直接运行批处理文件会发生什么?它提示你对吗?你需要找出正确的开关来停止它的提示。 SQL 代理无法运行的另一个原因是它运行的帐户与您的帐户不同。例如,默认情况下 SQL 代理帐户无法访问任何网络驱动器,即使您可以。
  • @ElectricLlama 当我直接运行批处理脚本(即双击文件)时,不会出现任何提示。它只是运行。我以管理员身份运行脚本。我创建了一个名为“asAdminProxy”的代理,其中定义了管理员凭据。
  • 抱歉,我看到您已经尝试手动运行它。当作业挂起时,您可以打开任务管理器并检查您的 CMD 进程是否在预期的凭据下?您可以尝试将 /Log: 参数添加到日志操作(无论如何这是个好主意)。只要确保您登录到您肯定可以访问的文件。您也可以使用 /v 来表示详细信息。您还可以使用"C:\Reports\rapport_uur_copy.bat" >> C:\Log.TXT 将您的批处理文件记录到另一个日志中。

标签: sql-server-2008 batch-file jobs sql-agent


【解决方案1】:

当批处理脚本需要使用非本地驱动器时,例如共享它总是需要特殊权限,意味着you need to use an account to run the script which is allowed to log on as batch task in secpol - (单击开始类型 secpol.msc 并启动它 - 在 MSC 管理单元中选择“本地策略” - 选择“用户权限分配”-右键单击“作为批处理作业登录”并选择属性-单击“添加用户或组”,并包括相关用户。)

在正常批处理中也无法使用\\drives,它们必须映射为带有字符的驱动器,例如V:\drivegot to be made by the batch itselfuser account used running the batch 的映射我在我的脚本中经历了这一点。

【讨论】:

  • @Naz33m 不再感兴趣了?
最近更新 更多