Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a: SQL Server
SSIS Integration Runtime em Azure Data Factory
O Foreach do Enumerador de Variáveis enumera os itens numa lista que lhe é passada numa variável e executa as mesmas tarefas em cada item. Pode usar código personalizado numa tarefa de Script para preencher uma lista para esse fim. Para mais informações sobre o enumerador, consulte Foreach Loop Container.
Note
Se quiser criar uma tarefa que possa reutilizar mais facilmente em vários pacotes, considere usar o código deste exemplo de tarefa Script como ponto de partida para uma tarefa personalizada. Para obter mais informações, consulte Desenvolvendo uma tarefa personalizada.
Description
O exemplo seguinte utiliza métodos do espaço de nomes System.IO para reunir uma lista de livros de trabalho Excel no computador que são mais recentes ou antigos do que um número de dias especificado pelo utilizador numa variável. Pesquisa recursivamente diretórios na Unidade C por ficheiros com extensão .xls e examina a data em que cada ficheiro foi modificado pela última vez para determinar se o ficheiro pertence à lista. Adiciona ficheiros qualificados a um ArrayList e guarda o ArrayList numa variável para uso posterior num contentor Foreach Loop. O contentor Foreach Loop está configurado para usar o Foreach from Variable enumerator.
Note
A variável que usas com o Foreach do Enumerador de Variáveis deve ser do tipo Objecto. O objeto que colocar na variável deve implementar uma das seguintes interfaces: System.Collections.IEnumerable, System.Runtime.InteropServices.ComTypes.IEnumVARIANT,System.ComponentModel IListSource ou Microsoft. SqlServer.Dts.Runtime.Wrapper.ForEachEnumeratorHost. Um Array ou ArrayList é comumente usado. O ArrayList requer uma referência e uma instrução Imports para o espaço de nomes System.Collections .
Pode experimentar esta tarefa usando diferentes valores positivos e negativos para a FileAge variável do pacote. Por exemplo, pode inserir 5 para procurar ficheiros criados nos últimos cinco dias, ou introduzir -3 para procurar ficheiros criados há mais de três dias. Esta tarefa pode demorar um ou dois minutos num disco com muitas pastas para pesquisar.
Para configurar este exemplo de Tarefa de Script
Crie uma variável de pacote chamada
FileAgede tipo inteiro e introduza um valor inteiro positivo ou negativo. Quando o valor é positivo, o código procura ficheiros mais recentes do que o número especificado de dias; quando negativo, para ficheiros com mais idade do que o número de dias especificado.Crie uma variável de pacote chamada
FileListdo tipo Object para receber a lista de ficheiros recolhidos pela tarefa Script para uso posterior pelo Foreach do Variable Enumerator.Adicione a
FileAgevariável à propriedade ReadOnlyVariables da tarefa Script e adicione aFileListvariável à propriedade ReadWriteVariables .No teu código, importa o System.Collections e os espaços de nomes System.IO .
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);
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);
}
}
}
}