Mengumpulkan Daftar untuk Perulangan ForEach dengan Tugas Skrip

Berlaku untuk: Integration Runtime SSIS SQL Server di Azure Data Factory

Foreach dari Variable Enumerator menghitung item dalam daftar yang diteruskan ke dalam variabel dan melakukan tugas yang sama pada setiap item. Anda dapat menggunakan kode kustom dalam tugas Skrip untuk mengisi daftar untuk tujuan ini. Untuk informasi selengkapnya tentang enumerator, lihat Kontainer Perulangan Foreach.

Catatan

Jika Anda ingin membuat tugas yang dapat digunakan kembali dengan lebih mudah di beberapa paket, pertimbangkan untuk menggunakan kode dalam sampel tugas Skrip ini sebagai titik awal untuk tugas kustom. Untuk informasi selengkapnya, lihat Mengembangkan Tugas Kustom.

Deskripsi

Contoh berikut menggunakan metode dari namespace System.IO untuk mengumpulkan daftar buku kerja Excel di komputer yang lebih baru atau lebih lama dari sejumlah hari yang ditentukan oleh pengguna dalam variabel. Ini mencari direktori di Drive C secara rekursif untuk file yang memiliki ekstensi .xls dan memeriksa tanggal di mana setiap file terakhir dimodifikasi untuk menentukan apakah file termasuk dalam daftar. Ini menambahkan file yang memenuhi syarat ke ArrayList dan menyimpan ArrayList ke variabel untuk digunakan nanti dalam kontainer Foreach Loop. Kontainer Foreach Loop dikonfigurasi untuk menggunakan Foreach dari Enumerator variabel.

Catatan

Variabel yang Anda gunakan dengan Foreach dari Enumerator Variabel harus berjenis Objek. Objek yang Anda tempatkan dalam variabel harus menerapkan salah satu antarmuka berikut: System.Collections.IEnumerable, System.Runtime.InteropServices.ComTypes.IEnumVARIANT, System.ComponentModel IListSource, atau Microsoft.SqlServer.Dts.Runtime.Wrapper.ForEachEnumeratorHost. Array atau ArrayList umumnya digunakan. ArrayList memerlukan referensi dan pernyataan Impor untuk namespace System.Collections.

Anda dapat bereksperimen dengan tugas ini dengan menggunakan nilai positif dan negatif yang berbeda untuk FileAge variabel paket. Misalnya, Anda dapat memasukkan 5 untuk mencari file yang dibuat dalam lima hari terakhir, atau memasukkan -3 untuk mencari file yang dibuat lebih dari tiga hari yang lalu. Tugas ini mungkin memakan waktu satu atau dua menit pada drive dengan banyak folder untuk dicari.

Untuk mengonfigurasi contoh Tugas Skrip ini

  1. Buat variabel paket bernama FileAge bilangan bulat jenis dan masukkan nilai bilangan bulat positif atau negatif. Ketika nilainya positif, kode mencari file yang lebih baru dari jumlah hari yang ditentukan; ketika negatif, untuk file yang lebih lama dari jumlah hari yang ditentukan.

  2. Buat variabel paket bernama FileList tipe Objek untuk menerima daftar file yang dikumpulkan oleh tugas Skrip untuk digunakan nanti oleh Foreach dari Variable Enumerator.

  3. FileAge Tambahkan variabel ke properti ReadOnlyVariables tugas Skrip, dan tambahkan FileList variabel ke properti ReadWriteVariables.

  4. Dalam kode Anda, impor System.Collections dan namespace System.IO .

Kode

Imports System  
Imports System.Data  
Imports System.Math  
Imports Microsoft.SqlServer.Dts.Runtime  
Imports System.Collections  
Imports System.IO  
  
Public Class ScriptMain  
  
  Private Const FILE_AGE As Integer = -50  
  
  Private Const FILE_ROOT As String = "C:\"  
  Private Const FILE_FILTER As String = "*.xls"  
  
  Private isCheckForNewer As Boolean = True  
  Dim fileAgeLimit As Integer  
  Private listForEnumerator As ArrayList  
  
  Public Sub Main()  
  
    fileAgeLimit = DirectCast(Dts.Variables("FileAge").Value, Integer)  
  
    ' If value provided is positive, we want files NEWER THAN n days.  
    '  If negative, we want files OLDER THAN n days.  
    If fileAgeLimit < 0 Then  
      isCheckForNewer = False  
    End If  
    ' Extract number of days as positive integer.  
    fileAgeLimit = Math.Abs(fileAgeLimit)  
  
    listForEnumerator = New ArrayList  
  
    GetFilesInFolder(FILE_ROOT)  
  
    ' Return the list of files to the variable  
    '  for later use by the Foreach from Variable enumerator.  
    System.Windows.Forms.MessageBox.Show("Matching files: " & listForEnumerator.Count.ToString, "Results", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Information)  
    Dts.Variables("FileList").Value = listForEnumerator  
  
    Dts.TaskResult = ScriptResults.Success  
  
  End Sub  
  
  Private Sub GetFilesInFolder(ByVal folderPath As String)  
  
    Dim localFiles() As String  
    Dim localFile As String  
    Dim fileChangeDate As Date  
    Dim fileAge As TimeSpan  
    Dim fileAgeInDays As Integer  
    Dim childFolder As String  
  
    Try  
      localFiles = Directory.GetFiles(folderPath, FILE_FILTER)  
      For Each localFile In localFiles  
        fileChangeDate = File.GetLastWriteTime(localFile)  
        fileAge = DateTime.Now.Subtract(fileChangeDate)  
        fileAgeInDays = fileAge.Days  
        CheckAgeOfFile(localFile, fileAgeInDays)  
      Next  
  
      If Directory.GetDirectories(folderPath).Length > 0 Then  
        For Each childFolder In Directory.GetDirectories(folderPath)  
          GetFilesInFolder(childFolder)  
        Next  
      End If  
  
    Catch  
      ' Ignore exceptions on special folders such as System Volume Information.  
    End Try  
  
  End Sub  
  
  Private Sub CheckAgeOfFile(ByVal localFile As String, ByVal fileAgeInDays As Integer)  
  
    If isCheckForNewer Then  
      If fileAgeInDays <= fileAgeLimit Then  
        listForEnumerator.Add(localFile)  
      End If  
    Else  
      If fileAgeInDays > fileAgeLimit Then  
        listForEnumerator.Add(localFile)  
      End If  
    End If  
  
  End Sub  
  
End Class  
using System;  
using System.Data;  
using System.Math;  
using Microsoft.SqlServer.Dts.Runtime;  
using System.Collections;  
using System.IO;  
  
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase  
    {  
  
        private const int FILE_AGE = -50;  
  
        private const string FILE_ROOT = "C:\\";  
        private const string FILE_FILTER = "*.xls";  
  
        private bool isCheckForNewer = true;  
        int fileAgeLimit;  
        private ArrayList listForEnumerator;  
  
        public void Main()  
  {  
  
    fileAgeLimit = (int)(Dts.Variables["FileAge"].Value);  
  
    // If value provided is positive, we want files NEWER THAN n days.  
    // If negative, we want files OLDER THAN n days.  
    if (fileAgeLimit<0)  
    {  
      isCheckForNewer = false;  
    }  
    // Extract number of days as positive integer.  
    fileAgeLimit = Math.Abs(fileAgeLimit);  
  
    listForEnumerator = new ArrayList();  
  
    GetFilesInFolder(FILE_ROOT);  
  
    // Return the list of files to the variable  
    // for later use by the Foreach from Variable enumerator.  
    System.Windows.Forms.MessageBox.Show("Matching files: "+ listForEnumerator.Count, "Results",   
MessageBoxButtons.OK, MessageBoxIcon.Information);  
    Dts.Variables["FileList"].Value = listForEnumerator;  
  
    Dts.TaskResult = (int)ScriptResults.Success;  
  
  }  
  
        private void GetFilesInFolder(string folderPath)  
        {  
  
            string[] localFiles;  
            DateTime fileChangeDate;  
            TimeSpan fileAge;  
            int fileAgeInDays;  
  
            try  
            {  
                localFiles = Directory.GetFiles(folderPath, FILE_FILTER);  
                foreach (string localFile in localFiles)  
                {  
                    fileChangeDate = File.GetLastWriteTime(localFile);  
                    fileAge = DateTime.Now.Subtract(fileChangeDate);  
                    fileAgeInDays = fileAge.Days;  
                    CheckAgeOfFile(localFile, fileAgeInDays);  
                }  
  
                if (Directory.GetDirectories(folderPath).Length > 0)  
                {  
                    foreach (string childFolder in Directory.GetDirectories(folderPath))  
                    {  
                        GetFilesInFolder(childFolder);  
                    }  
                }  
  
            }  
            catch  
            {  
                // Ignore exceptions on special folders, such as System Volume Information.  
            }  
  
        }  
  
        private void CheckAgeOfFile(string localFile, int fileAgeInDays)  
        {  
  
            if (isCheckForNewer)  
            {  
                if (fileAgeInDays <= fileAgeLimit)  
                {  
                    listForEnumerator.Add(localFile);  
                }  
            }  
            else  
            {  
                if (fileAgeInDays > fileAgeLimit)  
                {  
                    listForEnumerator.Add(localFile);  
                }  
            }  
  
        }  
  
    }  

Lihat juga

Kontainer Perulangan Foreach
Mengonfigurasi Kontainer Perulangan Foreach