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」をダブルクリックすると、すべてうまくいきます。

ただし、別のバッチ ファイル (たとえば「parent.cmd」) から「child.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="

dtexec Utility (SSIS Tool)child.cmdに関する 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 に答える