Zbieranie listy pętli ForEach zadania skryptu
Wylicza Foreach z modułu wyliczającego zmiennej nad elementami jest przekazywane do niej w zmiennej i wykonuje te same zadania każdego element listy.Za pomocą kodu niestandardowego zadania skryptu do wypełnienia listy w tym celu.Aby uzyskać więcej informacji na temat modułu wyliczającego, zobacz Kontener foreach pętli.
Ostrzeżenie
Aby utworzyć zadanie łatwiej można użyć ponownie w wielu pakietach, należy rozważyć przy użyciu kodu w tym przykładzie zadanie skryptu jako punktu wyjścia dla niestandardowego zadania.Aby uzyskać więcej informacji, zobacz Opracowywania niestandardowego zadania.
Opis
Poniższy przykład używa metody z System.IO nazw zebrać listę skoroszytów programu Excel na komputerze, na którym są nowsze czy starsze niż liczba dni określona przez użytkownika w zmiennej.Przeszukuje katalogi na dysku c rekursywnie dla plików, które mają rozszerzenie xls i sprawdza data, w którym każdy plik ostatniej modyfikacji do ustalenia, czy plik należy z listy.Dodaje pliki uprawniającego do ArrayList i zapisuje ArrayList do zmiennej dla później użyć kontener Foreach pętli.Kontener Foreach pętli jest skonfigurowany do używania Foreach z modułu wyliczającego zmiennej.
Ostrzeżenie
Zmienna, która pomocą Foreach z modułu wyliczającego zmiennej musi być typu Object.Obiekt, który można umieścić w zmiennej, należy zaimplementować jedną z następujących interfejsów: System.Collections.IEnumerable, System.Runtime.InteropServices.ComTypes.IEnumVARIANT, System.ComponentModel IListSource, or Microsoft.SqlServer.Dts.Runtime.Wrapper.ForEachEnumeratorHost.Array Lub ArrayList jest powszechnie używany.ArrayList Wymaga odwołania i Imports instrukcja dla System.Collections obszaru nazw.
Można eksperymentować z tego zadania przy użyciu różnych wartości dodatnie i ujemne dla FileAge pakiet zmiennej.Na przykład można wprowadzić wartość 5, aby wyszukać pliki utworzone w ciągu ostatnich pięciu dni lub wprowadzić -3, aby wyszukać pliki utworzone w więcej niż trzy dni temu.To zadanie może zająć minutę lub dwie na dysku zawierającym wiele folderów wyszukiwania.
Aby skonfigurować ten przykład zadania skryptu
Utwórz pakiet w zmiennej o nazwie FileAge typu całkowitego i wprowadź wartość dodatnią lub ujemną liczbą całkowitą.Gdy wartość jest dodatnia, kod szuka plików nowsze niż określoną liczbę dni; Gdy ujemny, pliki starsze niż określona liczba dni.
Utwórz pakiet w zmiennej o nazwie FileList typu Object Aby otrzymać listę plików zgromadzone przez zadania skryptu do późniejszego użycia przez Foreach ze zmiennej moduł wyliczający.
Dodaj FileAge Zmienna zadania skryptu ReadOnlyVariables właściwość i dodać FileList do zmiennej ReadWriteVariables właściwość.
W kodzie, importowanie System.Collections i System.IO obszarów nazw.
Kod
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);
ArrayList 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);
}
}
}
}
|
Zobacz także
Bieżąco z usług integracji