0

在“child.cmd”文件中,我有以下命令:

DTEXEC.EXE /FILE "\"%~dp0..\SSIS Packages\%stepName%.dtsx\"" /CONNECTION DestinationConnectionOLEDB;"\"Data Source=%serverName%;Initial Catalog=%databaseName%;Provider=%databaseProvider%;%security%;Auto Translate=false;\"" /CONNECTION SourceConnectionExcel;"\"Provider=%excelProvider%;Data Source=%~dp0..\Excel Import Files\BAs Code Tables.xlsx;Extended Properties=%extendedProperties%;HDR=YES;\"" /CHECKPOINTING OFF  /REPORTING %reporting% > "%~dp0..\Logs\Import\%stepName%.txt"

本质上,我使用 DTEXEC.EXE 执行 SSIS 包,并将输出发送到文本文件。如果我双击“child.cmd”,一切都会很好。

但是,如果我尝试从另一个批处理文件中调用“child.cmd”,比如“parent.cmd”,它就不再起作用了。我的“parent.cmd”文件如下所示:

call "%~dp0""Batch Files\child.cmd"

当我运行“parent.cmd”时,我试图在“child.cmd”文件中传递给 DTEXEC.EXE 的参数似乎不再是相同的格式,这会导致错误:

Option "Files\..\SSIS" is not valid.

其中“Files..\SSIS”是 /FILE 文件路径输入的一部分。该路径的“文件”部分之前有一个空格。有谁知道这里发生了什么?

注意:由于有空格,很多变量都返回双引号中的文本。我觉得任何有空间的地方都是导致问题的原因。我不知道为什么仅在尝试将其作为子批次运行时才出现问题。

编辑: “child.cmd”是比“parent.cmd”更深的文件夹。我已经更新了上面我在“parent.cmd”中调用“child.cmd”的代码。此外,我没有在我的 cmd 文件中设置 CD,而且我的谷歌搜索似乎表明,当你不知道要从哪个文件位置运行“parent.cmd”时,这样做并不容易,就像案例在这里。

4

1 回答 1

0

我建议文件parent.cmd

@echo off
rem Define variable CmdPath with path of directory containing this command
rem file ending with directory separator backslash and used also by the
rem called child command file.

set "CmdPath=%~dp0"
call "%CmdPath%Batch Files\child.cmd"
set "CmdPath="

child.cmd在阅读有关dtexec Utility (SSIS Tool)的 Microsoft TechNet 文章后,我建议归档:

@echo off
rem Variable CmdPath is defined usually in parent command file. But if just
rem this command file is executed and therefore the variable CmdPath is not
rem defined, variable CmdPath is defined here in this file with path of the
rem parent directory of the directory containing this command file.

if "%CmdPath%" == "" (
    rem Command FOR is used to get path of parent directory already
    rem expanded with directory separator backslash at end appended.
    for /F "delims=" %%D in ("%~dp0..\") do set "CmdPath=%%~fD"
)
dtexec.exe /File "%CmdPath%SSIS Packages\%stepName%.dtsx" /Connection "DestinationConnectionOLEDB;Data Source=%serverName%;Initial Catalog=%databaseName%;Provider=%databaseProvider%;%security%;Auto Translate=false" /Connection "SourceConnectionExcel;Provider=%excelProvider%;Data Source=%CmdPath%Excel Import Files\BAs Code Tables.xlsx;Extended Properties=%extendedProperties%;HDR=YES" /CheckPointing off  /Reporting "%reporting%" >"%CmdPath%Logs\Import\%stepName%.txt"

注释解释了这里使用的方法来获取包含parent.cmd首先执行的命令文件的目录路径。

要了解使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • call /?
  • for /?
  • if /?
  • rem /?
  • set /?
于 2015-11-14T16:42:18.790 回答