Zbieranie listy dla pętli ForEach z zadaniem skryptów
Wylicza Foreach z modułu wyliczającego zmienna nad elementami na liście, która jest przekazywane do niej w zmiennej i wykonuje te same zadania dla każdego element.Niestandardowy kod zadania skryptu służy do wypełnienia listy w tym celu.Aby uzyskać więcej informacji na temat modułu wyliczającego zobacz Pętla foreach kontenera.
Uwaga
Jeśli chcesz utworzyć zadanie, które łatwo można używać w wielu pakietów, należy rozważyć przy użyciu kodu w tym przykładzie skrypt zadanie jako punkt początkowy dla niestandardowego zadania.Aby uzyskać więcej informacji zobaczOpracowywania niestandardowego zadania.
Description
W poniższym przykładzie użyto metody z System.IO obszar nazw, aby zebrać listę skoroszytów programu Excel na komputerze, na którym są nowsze lub starsze niż liczba dni określona przez użytkownika w zmiennej.Przeszukuje katalogi na dysk C cyklicznie dla plików, które mają rozszerzenie xls i sprawdza, czy data, w którym każdy ostatniej modyfikacji pliku do ustalenia, czy w pliku, należy na liście.Dodaje się pliki do ArrayList i zapisuje ArrayList do zmiennej w później wykorzystać w kontenerze Foreach pętli. Kontener Foreach pętli jest skonfigurowany do używania Foreach ze zmiennej moduł wyliczający.
Uwaga
Zmienna, która z Foreach z modułu wyliczającego zmienna musi być typu Object. Obiekt, który można umieścić w zmiennej musi implementować jeden z następujących interfejsów: System.Collections.IEnumerable, System.Runtime.InteropServices.ComTypes.IEnumVARIANT, System.ComponentModel IListSource, lub Microsoft.SqlServer.Dts.Runtime.Wrapper.ForEachEnumeratorHost. An Array or ArrayList is commonly used.The ArrayList requires a reference and an Imports instrukcja for the System.Collections namespace.
Można eksperymentować z tym zadaniem, przy użyciu różnych wartości dodatnich i ujemnych dla FileAge Zmienna pakiet. Na przykład można wprowadzić wartość 5, aby wyszukać pliki utworzone w ciągu ostatnich pięciu dni lub wprowadź -3, aby wyszukać pliki utworzone w więcej niż trzy dni temu.Zadanie to może zająć minutę lub dwie na dysku z wielu folderów wyszukiwania.
Aby skonfigurować ten przykład zadania skryptu
Utwórz pakiet zmienną o nazwie FileAge z typu Liczba całkowita i wprowadź wartość dodatnia lub ujemna liczba całkowita z zakresu. Jeśli wartością jest dodatnia, kod przeszukuje pliki nowsze niż określoną liczbę dni, jeśli jest ujemna, pliki starsze niż określona liczba dni.
Utwórz pakiet zmienną o nazwie FileList tego typu Object Aby otrzymać listę plików zgromadzone przez zadanie skryptu do późniejszego użytku przez Foreach ze zmiennej moduł wyliczający.
Dodawanie FileAge Zmienna z zadań skryptów ReadOnlyVariables Właściwość i Dodaj FileList zmienne do ReadWriteVariables Właściwość.
W kodzie, importowanie System.Collections oraz System.IO obszary nazw.
Code
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);
}
}
}
}
|