3

以下に概説されているタスクを実行する必要がありますが、どのように進めればよいかわかりません。Windows Server 2003 を使用して、これをコマンド スクリプトまたは SSIS のスクリプト タスクで実行できますか? 私は SSIS 2005 を使用しており、ファイル システム タスクがあることは知っていますが、これまで使用したことがありません。

  • ローカルに「target.file」というファイルがあります。
  • ネットワーク サーバーに「ターゲット」フォルダがあります。
  • 「ターゲット」の下には数百のフォルダーがあります。
  • これらのフォルダーの一部の下に「バックアップ」フォルダーがあります。
  • 「target.file」を「target」フォルダーの下のフォルダーにコピーする必要があります。
    • ただし、「target.file」が既に存在する場合にのみコピー/置換してください。
    • 「target.file」が存在する場合、バックアップ フォルダーが存在する場合は、そのファイルをバックアップ フォルダーにコピーして置き換えます。
    • そうでない場合は、最初にバックアップ フォルダーを作成します。
4

2 に答える 2

4

C# と VB.NET を使用して SSIS 2012 で記述されたサンプル パッケージ

これは、SSIS 2012 で記述された、スクリプト タスクを使用して探していることを実行するサンプル パッケージです。SSIS を使用する必要はありません。単純な C# または VB.NET コンソール アプリケーションを使用してこれを行うこともできますが、SSIS を使用すると、情報をログに記録してジョブをスケジュールする柔軟性が得られます。

フォルダ構成(初期)

フォルダが次のように構成されているとします。

コピーしたいソースファイルがあります。

Source
    |- Sample_File.txt

ターゲットのフォルダー構造は次のとおりです。

Target
    |- Target_1
    |    |- Archive
    |    |- Sample_File.txt
    |- Target_2
    |- Target_3
        |- Sample_File.txt

SSIS パッケージを作成し、フォルダー変数を作成します。

Variable name       Data type  Value
------------------ ---------- ----------------------
Backup_FolderName  String      Archive
Source_FileName    String      Sample_File.txt
Source_FilePath    String
Source_Folder      String      D:\SSIS\Files\Source\
Target_Folder      String      D:\SSIS\Files\Target\

変数Source_FilePathを選択し、 をクリックF4してプロパティを表示します。プロパティEvaluateAsExpressionを true に変更します。プロパティの横にある省略記号ボタンをクリックして、式ビルダーExpressionを開きます。式を に設定します。@[User::Source_Folder] + "\\" + @[User::Source_FileName]

ソース ファイル パスを格納する変数を 1 つだけ持つことができます。私は通常、ソース フォルダーとファイル名を分けておくことを好みます。

スクリプト タスクを制御フロー タブにドラッグ アンド ドロップします。スクリプト タスクをダブルクリックして、スクリプト タスク エディターを開きます。スクリプト タブ ページで、横にある省略記号ボタンをクリックしReadOnlyVariables、次の変数を選択します。これらの変数はスクリプト タスク コードで使用するためです。

User::Source_FilePath
User::Target_Folder
User::Backup_FolderName

[スクリプトの編集... ] ボタンをクリックし、以下に示すようにコードを入力します。

SSIS 2008 以降の C# のみのスクリプト タスク コード:

スクリプト タスク コードは次のことを行います。

  • ソースファイルのパスが有効かどうかをチェックします。無効な場合は、メッセージをスローしてプロセスを終了します。

  • ターゲット フォルダが有効かどうかを確認します。無効な場合は、メッセージをスローしてプロセスを終了します。

  • ソース ファイル パスとターゲット フォルダーが有効な場合、ロジックは、ターゲット フォルダー内のサブフォルダー内のソース ファイル名の一致するすべての場所をループします。一致するファイルがある場合、ターゲット ファイルをバックアップ フォルダにコピーし、ターゲット ファイルをソース ファイルで上書きします。

  • スクリプト タスクは適切な情報を出力するため、SSIS 2012 の SQL Server Data Tools (SSDT) または SSIS 2005 - SSIS 2008 R2 の Business Intelligence Development Studio (BIDS) の進行状況/実行結果タブ内でステータスを追跡できます。

    地域の名前空間

    システムを使用する; System.Data の使用; Microsoft.SqlServer.Dts.Runtime を使用します。System.Windows.Forms を使用します。System.IO の使用;

    エンドリージョン

    名前空間 ST_523853dfbc0d4123be43383671f8a6c6 { [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute] public 部分クラス ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase { public void Main() { try { bool fireAgain = false; string backupFolder = string.Empty; string backupFilePath = string.Empty;

                string sourcFilePath = Dts.Variables["User::Source_FilePath"].Value.ToString();
                string targetFolder = Dts.Variables["User::Target_Folder"].Value.ToString();
                string backupFolderName = Dts.Variables["User::Backup_FolderName"].Value.ToString();
    
                if (String.IsNullOrEmpty(sourcFilePath) || !File.Exists(sourcFilePath))
                {
                    // Check if a valid source file path was specified on the package variable
                    Dts.Events.FireError(101, "Source path error", String.Format("You need to set a valid source file path in the package variable 'Source_FilePath'. Invalid path: '{0}'", sourcFilePath), string.Empty, 0);
                    Dts.TaskResult = (int)ScriptResults.Failure;
                }
                else if (String.IsNullOrEmpty(targetFolder) || !Directory.Exists(targetFolder))
                {
                    // Check if a valid target folder was specified on the package variable
                    Dts.Events.FireError(102, "Target folder error", String.Format("You need to set a valid target folder location in the package variable 'Target_Folder'. Invalid folder: '{0}'", targetFolder), string.Empty, 0);
                    Dts.TaskResult = (int)ScriptResults.Failure;
                }
                else
                {
                    FileInfo sourceInfo = new FileInfo(sourcFilePath);
    
                    // Loop through each file that matches the name of the source file
                    foreach (string targetFilePath in Directory.EnumerateFiles(targetFolder, sourceInfo.Name, SearchOption.AllDirectories))
                    {
                        FileInfo targetInfo = new FileInfo(targetFilePath);
                        backupFolder = Path.Combine(targetInfo.Directory.FullName, backupFolderName);
                        backupFilePath = Path.Combine(backupFolder, backupFolderName);
    
                        // If the backup folder does not exist in the folder within root target folder, create the backup folder.
                        if (!Directory.Exists(backupFolder))
                        {
                            Directory.CreateDirectory(backupFolder);
                            Dts.Events.FireInformation(401, "Backup folder created", String.Format("Backup folder '{0}' was created.", backupFolder), string.Empty, 0, ref fireAgain);
                        }
    
                        // Archive the target file to the backup folder.
                        File.Copy(targetFilePath, backupFilePath, true);
                        Dts.Events.FireInformation(402, "Target file archived", String.Format("Target file '{0}' was archived to the backup folder '{1}'.", targetFilePath, backupFolder), string.Empty, 0, ref fireAgain);
    
                        // Overwrite the target file with the source file.
                        File.Copy(sourcFilePath, targetFilePath, true);
                        Dts.Events.FireInformation(403, "Target file overwritten", String.Format("Target file '{0}' was overwritten with the source file '{1}'.", sourcFilePath, targetFilePath), string.Empty, 0, ref fireAgain);
                    }
    
                    Dts.TaskResult = (int)ScriptResults.Success;
                }
            }
            catch (Exception ex)
            {
                Dts.Events.FireError(100, "Unhandled exception", ex.ToString(), string.Empty, 0);
            }
        }
    
        #region ScriptResults declaration
        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };
        #endregion
    }
    

    }

SSIS 2005 以降の VB.NET のスクリプト タスク コード:

#Region "Imports"
Imports System
Imports System.Data
Imports System.Math
Imports System.IO
Imports Microsoft.SqlServer.Dts.Runtime
#End Region

<Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute()> _
<System.CLSCompliantAttribute(False)> _
Partial Public Class ScriptMain
    Inherits Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase

    Public Sub Main()

        Try
            Dim fireAgain As Boolean = False
            Dim backupFolder As String = String.Empty
            Dim backupFilePath As String = String.Empty

            Dim sourcFilePath As String = Dts.Variables("User::Source_FilePath").Value.ToString()
            Dim targetFolder As String = Dts.Variables("User::Target_Folder").Value.ToString()
            Dim backupFolderName As String = Dts.Variables("User::Backup_FolderName").Value.ToString()

            If String.IsNullOrEmpty(sourcFilePath) OrElse Not File.Exists(sourcFilePath) Then
                ' Check if a valid source file path was specified on the package variable
                Dts.Events.FireError(101, "Source path error", String.Format("You need to set a valid source file path in the package variable 'Source_FilePath'. Invalid path: '{0}'", sourcFilePath), String.Empty, 0)
                Dts.TaskResult = ScriptResults.Failure

            ElseIf String.IsNullOrEmpty(targetFolder) OrElse Not Directory.Exists(targetFolder) Then
                ' Check if a valid target folder was specified on the package variable
                Dts.Events.FireError(102, "Target folder error", String.Format("You need to set a valid target folder location in the package variable 'Target_Folder'. Invalid folder: '{0}'", targetFolder), String.Empty, 0)
                Dts.TaskResult = ScriptResults.Failure

            Else
                Dim sourceInfo As FileInfo = New FileInfo(sourcFilePath)

                ' Loop through each file that matches the name of the source file
                For Each targetFilePath As String In Directory.EnumerateFiles(targetFolder, sourceInfo.Name, SearchOption.AllDirectories)

                    Dim targetInfo As FileInfo = New FileInfo(targetFilePath)
                    backupFolder = Path.Combine(targetInfo.Directory.FullName, backupFolderName)
                    backupFilePath = Path.Combine(backupFolder, backupFolderName)

                    ' If the backup folder does not exist in the folder within root target folder, create the backup folder.
                    If Not Directory.Exists(backupFolder) Then
                        Directory.CreateDirectory(backupFolder)
                        Dts.Events.FireInformation(401, "Backup folder created", String.Format("Backup folder '{0}' was created.", backupFolder), String.Empty, 0, fireAgain)
                    End If

                    ' Archive the target file to the backup folder.
                    File.Copy(targetFilePath, backupFilePath, True)
                    Dts.Events.FireInformation(402, "Target file archived", String.Format("Target file '{0}' was archived to the backup folder '{1}'.", targetFilePath, backupFolder), String.Empty, 0, fireAgain)

                    ' Overwrite the target file with the source file.
                    File.Copy(sourcFilePath, targetFilePath, True)
                    Dts.Events.FireInformation(403, "Target file overwritten", String.Format("Target file '{0}' was overwritten with the source file '{1}'.", sourcFilePath, targetFilePath), String.Empty, 0, fireAgain)

                Next

                Dts.TaskResult = ScriptResults.Success

            End If

        Catch ex As Exception
            Dts.Events.FireError(100, "Unhandled exception", ex.ToString(), String.Empty, 0)
            Dts.TaskResult = ScriptResults.Failure
        End Try

    End Sub

#Region "ScriptResults declaration"
    Enum ScriptResults
        Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success
        Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
    End Enum

#End Region

End Class

無効なソース ファイル パスが指定された場合、パッケージは次のエラー メッセージをスローします。

ソースファイルエラー

無効なターゲット フォルダーが指定されている場合、パッケージは次のエラー メッセージをスローします。

対象ファイルエラー

ソースとターゲットの場所が有効な場合、パッケージは正常に実行されます。この例では、

  • の下Target_1にバックアップ フォルダがあったため、フォルダは作成されませんでしたが、ファイルはバックアップ フォルダにコピーされました。
  • に一致するファイルがなかったTarget_2ため、アクションは実行されませんでした。
  • でバックアップ フォルダが作成されましTarget_3た。ファイルはターゲットの場所にコピーされ、ソース ファイルで上書きされました。

成功

フォルダ構成(最終)

パッケージの実行後、ターゲットの場所は次のようになります。

Target
    |- Target_1
    |    |- Archive
    |        |- Sample_File.txt
    |    |- Sample_File.txt
    |- Target_2
    |- Target_3
        |- Archive
            |- Sample_File.txt
        |- Sample_File.txt
于 2013-02-19T16:54:39.737 に答える
1

どうやら@Sivaはあなたの質問に答える途方もない仕事をしました。ただし、次の場合、作業がはるかに悪くなるのではないかと思います(このスクリプトを思い付くのにそれほど時間はかからなかったと思いますが)。

@ECHO OFF

SET "srcname=target.file"
SET "srcpath=D:\path\to\source"
SET "tgtpath=\\remotehost\shared\folder"
SET "bakname=Backup"

FOR /D %%D IN ("%tgtpath%\*") DO (
  IF EXIST "%%D\%srcname%" (
    IF NOT EXIST "%%D\%bakname%" MKDIR "%%D\%bakname%"
    COPY /Y "%%D\%srcname%" "%%D\%bakname%"
    COPY /Y "%srcpath%\%srcname%" "%%D"
  )
)
于 2013-02-20T13:13:38.160 に答える