Windows PowerShell İçerik Sağlayıcısı Oluşturma

bu konu, kullanıcının bir veri deposundaki öğelerin içeriğini işlemesini sağlayan bir Windows PowerShell sağlayıcı oluşturmayı açıklamaktadır. sonuç olarak, öğelerin içeriğini işleyebilen bir sağlayıcı Windows PowerShell içerik sağlayıcısı olarak adlandırılır.

Not

Windows Vista ve .NET Framework 3,0 çalışma zamanı bileşenleri için Microsoft Windows yazılım geliştirme seti 'ni kullanarak bu sağlayıcının C# kaynak dosyasını (AccessDBSampleProvider06. cs) indirebilirsiniz. indirme yönergeleri için bkz. nasıl yüklenir Windows PowerShell ve Windows PowerShell SDK 'sını indirin. İndirilen kaynak dosyalar <PowerShell Samples> dizinde bulunur. diğer Windows PowerShell sağlayıcı uygulamaları hakkında daha fazla bilgi için, bkz. Windows PowerShell sağlayıcınızı tasarlama.

Windows PowerShell içerik sağlayıcı sınıfını tanımlayın

Windows PowerShell bir içerik sağlayıcısı, System. Management. Automation. provider. ıtentcmdletprovider arabirimini destekleyen bir .net sınıfı yaratmalıdır. Bu bölümde açıklanan öğe sağlayıcısı için sınıf tanımı aşağıda verilmiştir.

[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : NavigationCmdletProvider, IContentCmdletProvider

Bu sınıf tanımında System. Management. Automation. Provider. Cmdletproviderattribute özniteliğinin iki parametre içerdiğini unutmayın. İlk parametre, Windows PowerShell tarafından kullanılan sağlayıcı için Kullanıcı dostu bir ad belirtir. ikinci parametre, komut işleme sırasında sağlayıcının Windows PowerShell çalışma zamanına sunduğu Windows PowerShell özgü özellikleri belirtir. bu sağlayıcı için eklenen Windows PowerShell belirli yetenekler yok.

Taban sınıfın Işlevselliğini tanımlama

Windows PowerShell sağlayıcınızı tasarlamabölümünde açıklandığı gibi, System. Management. Automation. Provider. navigationcmdletprovider sınıfı, farklı sağlayıcı işlevselliği sağlayan diğer birçok sınıftan türetilir. bu nedenle, bir Windows PowerShell içerik sağlayıcısı, genellikle bu sınıfların sunduğu tüm işlevleri tanımlar.

oturuma özgü başlatma bilgilerini ekleme ve sağlayıcı tarafından kullanılan kaynakları serbest bırakma hakkında daha fazla bilgi için bkz. temel Windows PowerShell sağlayıcısı oluşturma. Ancak, burada açıklanan sağlayıcı dahil olmak üzere çoğu sağlayıcı, Windows PowerShell tarafından sağlanmış olan bu işlevselliğin varsayılan uygulamasını kullanabilir.

Veri deposuna erişmek için, sağlayıcının System. Management. Automation. Provider. Drivecmdletprovider temel sınıfının yöntemlerini uygulaması gerekir. bu yöntemleri uygulama hakkında daha fazla bilgi için bkz. Windows PowerShell sürücü sağlayıcısı oluşturma.

Öğe alma, ayarlama ve temizleme gibi bir veri deposunun öğelerini işlemek için, sağlayıcının System. Management. Automation. Provider. ıtemcmdletprovider temel sınıfı tarafından sunulan yöntemleri uygulaması gerekir. bu yöntemleri uygulama hakkında daha fazla bilgi için bkz. Windows PowerShell öğesi sağlayıcısı oluşturma.

Çok katmanlı veri depolarında çalışmak için, sağlayıcının System. Management. Automation. Provider. Containercmdletprovider temel sınıfı tarafından sunulan yöntemleri uygulaması gerekir. bu yöntemleri uygulama hakkında daha fazla bilgi için bkz. Windows PowerShell kapsayıcı sağlayıcısı oluşturma.

Özyinelemeli komutları, iç içe kapsayıcıları ve göreli yolları desteklemek için, sağlayıcının System. Management. Automation. Provider. Navigationcmdletprovider temel sınıfını uygulaması gerekir. buna ek olarak, bu Windows PowerShell içerik sağlayıcısı system . management. automation. provider. ıtentcmdletprovider arabirimini system. management. automation. provider. navigationcmdletprovider temel sınıfına ekleyebilir ve bu nedenle, bu sınıf tarafından sunulan yöntemleri uygulamalıdır. daha fazla bilgi için bkz. bu yöntemleri uygulama, bkz. bir gezinti Windows PowerShell sağlayıcısı uygulama.

Içerik okuyucu uygulama

Bir öğeden içerik okumak için, bir sağlayıcının System. Management. Automation. Provider. ıditentreader'dan türeyen bir içerik okuyucu sınıfını uygulamalıdır. Bu sağlayıcı için içerik okuyucu, veri tablosundaki bir satırın içeriğine erişim sağlar. İçerik okuyucu sınıfı, belirtilen satırdan verileri alan ve bu verileri temsil eden bir liste, içerik okuyucuyu taşınan bir arama yöntemi, içerik okuyucuyu kapatan bir Kapanış yöntemi ve bir Dispose yöntemi döndüren bir okuma yöntemi tanımlar.

public class AccessDBContentReader : IContentReader
{
    // A provider instance is required so as to get "content"
    private AccessDBProvider provider;
    private string path;
    private long currentOffset;

    internal AccessDBContentReader(string path, AccessDBProvider provider)
    {
        this.path = path;
        this.provider = provider;
    }

    /// <summary>
    /// Read the specified number of rows from the source.
    /// </summary>
    /// <param name="readCount">The number of items to 
    /// return.</param>
    /// <returns>An array of elements read.</returns>
    public IList Read(long readCount)
    {
        // Read the number of rows specified by readCount and increment
        // offset
        string tableName;
        int rowNumber;
        PathType type = provider.GetNamesFromPath(path, out tableName, out rowNumber);

        Collection<DatabaseRowInfo> rows =
            provider.GetRows(tableName);
        Collection<DataRow> results = new Collection<DataRow>();

        if (currentOffset < 0 || currentOffset >= rows.Count)
        {
            return null;
        }

        int rowsRead = 0;

        while (rowsRead < readCount && currentOffset < rows.Count)
        {
            results.Add(rows[(int)currentOffset].Data);
            rowsRead++;
            currentOffset++;
        }

        return results;
    } // Read

    /// <summary>
    /// Moves the content reader specified number of rows from the 
    /// origin
    /// </summary>
    /// <param name="offset">Number of rows to offset</param>
    /// <param name="origin">Starting row from which to offset</param>
    public void Seek(long offset, System.IO.SeekOrigin origin)
    {
        // get the number of rows in the table which will help in
        // calculating current position
        string tableName;
        int rowNumber;

        PathType type = provider.GetNamesFromPath(path, out tableName, out rowNumber);

        if (type == PathType.Invalid)
        {
            throw new ArgumentException("Path specified must represent a table or a row :" + path);
        }

        if (type == PathType.Table)
        {
            Collection<DatabaseRowInfo> rows = provider.GetRows(tableName);

            int numRows = rows.Count;

            if (offset > rows.Count)
            {
                throw new
                       ArgumentException(
                           "Offset cannot be greater than the number of rows available"
                                        );
            }

            if (origin == System.IO.SeekOrigin.Begin)
            {
                // starting from Beginning with an index 0, the current offset
                // has to be advanced to offset - 1
                currentOffset = offset - 1;
            }
            else if (origin == System.IO.SeekOrigin.End)
            {
                // starting from the end which is numRows - 1, the current
                // offset is so much less than numRows - 1
                currentOffset = numRows - 1 - offset;
            }
            else
            {
                // calculate from the previous value of current offset
                // advancing forward always
                currentOffset += offset;
            }
        } // if (type...
        else
        {
            // for row, the offset will always be set to 0
            currentOffset = 0;
        }

    } // Seek

    /// <summary>
    /// Closes the content reader, so all members are reset
    /// </summary>
    public void Close()
    {
        Dispose();
    } // Close

    /// <summary>
    /// Dispose any resources being used
    /// </summary>
    public void Dispose()
    {
        Seek(0, System.IO.SeekOrigin.Begin);
        
        GC.SuppressFinalize(this);
    } // Dispose
} // AccessDBContentReader

Içerik yazıcısını uygulama

Bir öğeye içerik yazmak için, bir sağlayıcının System. Management. Automation. Provider. Icontentwriter'dan türeyen bir içerik yazıcı sınıfı uygulaması gerekir. İçerik yazıcı sınıfı, belirtilen satır içeriğini yazan bir yazma yöntemi, içerik yazıcısını taşınan bir arama yöntemi, Içerik yazıcısını kapatan bir Kapanış yöntemi ve bir Dispose yöntemi tanımlar.

public class AccessDBContentWriter : IContentWriter
{
    // A provider instance is required so as to get "content"
    private AccessDBProvider provider;
    private string path;
    private long currentOffset;

    internal AccessDBContentWriter(string path, AccessDBProvider provider)
    {
        this.path = path;
        this.provider = provider;
    }

    /// <summary>
    /// Write the specified row contents in the source
    /// </summary>
    /// <param name="content"> The contents to be written to the source.
    /// </param>
    /// <returns>An array of elements which were successfully written to 
    /// the source</returns>
    /// 
    public IList Write(IList content)
    {
        if (content == null)
        {
            return null;
        }

        // Get the total number of rows currently available it will 
        // determine how much to overwrite and how much to append at
        // the end
        string tableName;
        int rowNumber;
        PathType type = provider.GetNamesFromPath(path, out tableName, out rowNumber);

        if (type == PathType.Table)
        {
            OdbcDataAdapter da = provider.GetAdapterForTable(tableName);
            if (da == null)
            {
                return null;
            }

            DataSet ds = provider.GetDataSetForTable(da, tableName);
            DataTable table = provider.GetDataTable(ds, tableName);

            string[] colValues = (content[0] as string).Split(',');

            // set the specified row
            DataRow row = table.NewRow();

            for (int i = 0; i < colValues.Length; i++)
            {
                if (!String.IsNullOrEmpty(colValues[i]))
                {
                    row[i] = colValues[i];
                }
            }

            //table.Rows.InsertAt(row, rowNumber);
            // Update the table
            table.Rows.Add(row);
            da.Update(ds, tableName);
            
        }
        else 
        {
            throw new InvalidOperationException("Operation not supported. Content can be added only for tables");
        }

        return null;
    } // Write

    /// <summary>
    /// Moves the content reader specified number of rows from the 
    /// origin
    /// </summary>
    /// <param name="offset">Number of rows to offset</param>
    /// <param name="origin">Starting row from which to offset</param>
    public void Seek(long offset, System.IO.SeekOrigin origin)
    {
        // get the number of rows in the table which will help in
        // calculating current position
        string tableName;
        int rowNumber;

        PathType type = provider.GetNamesFromPath(path, out tableName, out rowNumber);

        if (type == PathType.Invalid)
        {
            throw new ArgumentException("Path specified should represent either a table or a row : " + path);
        }

        Collection<DatabaseRowInfo> rows =
               provider.GetRows(tableName);

        int numRows = rows.Count;

        if (offset > rows.Count)
        {
            throw new
                   ArgumentException(
                       "Offset cannot be greater than the number of rows available"
                                           );
        }

        if (origin == System.IO.SeekOrigin.Begin)
        {
            // starting from Beginning with an index 0, the current offset
            // has to be advanced to offset - 1
            currentOffset = offset - 1;
        }
        else if (origin == System.IO.SeekOrigin.End)
        {
            // starting from the end which is numRows - 1, the current
            // offset is so much less than numRows - 1
            currentOffset = numRows - 1 - offset;
        }
        else
        {
            // calculate from the previous value of current offset
            // advancing forward always
            currentOffset += offset;
        }

    } // Seek

    /// <summary>
    /// Closes the content reader, so all members are reset
    /// </summary>
    public void Close()
    {
        Dispose();
    } // Close

    /// <summary>
    /// Dispose any resources being used
    /// </summary>
    public void Dispose()
    {
        Seek(0, System.IO.SeekOrigin.Begin);

        GC.SuppressFinalize(this);
    } // Dispose
} // AccessDBContentWriter

Içerik okuyucuyu alma

Bir öğeden içerik almak için, sağlayıcının cmdlet 'ini desteklemesi için System. Management. Automation. Provider. ıtentcmdletprovider. GetContentReader * uygulaması gerekir Get-Content . Bu yöntem, belirtilen yolda bulunan öğe için içerik okuyucuyu döndürür. Böylece, içerik okumak için Okuyucu nesnesi açılabilir.

Bu sağlayıcı için bu yöntem için System. Management. Automation. Provider. ıtentcmdletprovider. GetContentReader * uygulamasıdır.

public IContentReader GetContentReader(string path)
{
    string tableName;
    int rowNumber;

    PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

    if (type == PathType.Invalid)
    {
        ThrowTerminatingInvalidPathException(path);
    }
    else if (type == PathType.Row)
    {
        throw new InvalidOperationException("contents can be obtained only for tables");
    }

    return new AccessDBContentReader(path, this);
} // GetContentReader
public IContentReader GetContentReader(string path)
{
    string tableName;
    int rowNumber;

    PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

    if (type == PathType.Invalid)
    {
        ThrowTerminatingInvalidPathException(path);
    }
    else if (type == PathType.Row)
    {
        throw new InvalidOperationException("contents can be obtained only for tables");
    }

    return new AccessDBContentReader(path, this);
} // GetContentReader

GetContentReader 'ı uygulama hakkında hatırlamaları gerekenler

System. Management. Automation. Provider. ıtentcmdletprovider. GetContentReader *uygulaması için aşağıdaki koşullar geçerli olabilir:

Get-Content cmdlet 'Ine dinamik parametreler iliştirme

Get-ContentCmdlet 'i, çalışma zamanında dinamik olarak belirtilen ek parametreler gerektirebilir. bu dinamik parametreleri sağlamak için Windows PowerShell içerik sağlayıcısı System. Management. Automation. provider. ıtentcmdletprovider. getcontentreaderdynamicparameters * metodunu uygulamalıdır. Bu yöntem, belirtilen yoldaki öğe için dinamik parametreleri alır ve cmdlet sınıfına ya da System. Management. Automation. Runtimedefinedparameterdictionary nesnesine benzer ayrıştırma öznitelikleri olan özellikler ve alanlar içeren bir nesne döndürür. Windows PowerShell çalışma zamanı, cmdlet 'e parametreleri eklemek için döndürülen nesneyi kullanır.

bu Windows PowerShell kapsayıcı sağlayıcısı bu yöntemi uygulamaz. Ancak, aşağıdaki kod bu yöntemin varsayılan uygulamasıdır.

public object GetContentReaderDynamicParameters(string path)
{
    return null;
}
public object GetContentReaderDynamicParameters(string path)
{
    return null;
}

Içerik yazıcısı alınıyor

Bir öğeye içerik yazmak için sağlayıcının ve cmdlet 'lerini desteklemek için System. Management. Automation. Provider. ıtentcmdletprovider. Getcontentwriter * uygulaması gerekir Set-Content Add-Content . Bu yöntem, belirtilen yolda bulunan öğe için içerik yazıcısını döndürür.

Bu yöntem için System. Management. Automation. Provider. ıtentcmdletprovider. Getcontentwriter * uygulamasıdır.

public IContentWriter GetContentWriter(string path)
{
    string tableName;
    int rowNumber;

    PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

    if (type == PathType.Invalid)
    {
        ThrowTerminatingInvalidPathException(path);
    }
    else if (type == PathType.Row)
    {
        throw new InvalidOperationException("contents can be added only to tables");
    }

    return new AccessDBContentWriter(path, this);
}
public IContentWriter GetContentWriter(string path)
{
    string tableName;
    int rowNumber;

    PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

    if (type == PathType.Invalid)
    {
        ThrowTerminatingInvalidPathException(path);
    }
    else if (type == PathType.Row)
    {
        throw new InvalidOperationException("contents can be added only to tables");
    }

    return new AccessDBContentWriter(path, this);
}

GetContentWriter uygulama hakkında hatırlamaları gerekenler

System. Management. Automation. Provider. ıtentcmdletprovider. Getcontentwriter *uygulamanız için aşağıdaki koşullar geçerli olabilir:

Add-Content ve Set-Content cmdlet 'Lerine dinamik parametreler iliştirme

Add-ContentVe Set-Content cmdlet 'leri, çalışma zamanı eklenen ek dinamik parametreler gerektirebilir. bu dinamik parametreleri sağlamak için Windows PowerShell içerik sağlayıcısı, bu parametreleri işlemek için System. Management. Automation. provider. ıtentcmdletprovider. Getcontentwriterdynamicparameters * metodunu uygulamalıdır. Bu yöntem, belirtilen yoldaki öğe için dinamik parametreleri alır ve cmdlet sınıfına ya da System. Management. Automation. Runtimedefinedparameterdictionary nesnesine benzer ayrıştırma öznitelikleri olan özellikler ve alanlar içeren bir nesne döndürür. Windows PowerShell çalışma zamanı, cmdlet 'lere parametreleri eklemek için döndürülen nesnesini kullanır.

bu Windows PowerShell kapsayıcı sağlayıcısı bu yöntemi uygulamaz. Ancak, aşağıdaki kod bu yöntemin varsayılan uygulamasıdır.

public object GetContentWriterDynamicParameters(string path)
{
    return null;
}

Içerik temizleniyor

İçerik sağlayıcınız cmdlet 'i desteklemek için System. Management. Automation. Provider. ıtentcmdletprovider. ClearContent * metodunu uygular Clear-Content . Bu yöntem, belirtilen yoldaki öğenin içeriğini kaldırır, ancak öğeyi dokunulmamış halde bırakır.

Bu sağlayıcı için System. Management. Automation. Provider. ıtentcmdletprovider. ClearContent * yönteminin uygulamasıdır.

public void ClearContent(string path)
{
    string tableName;
    int rowNumber;

    PathType type = GetNamesFromPath(path, out tableName, out rowNumber);

    if (type != PathType.Table)
    {
        WriteError(new ErrorRecord(
            new InvalidOperationException("Operation not supported. Content can be cleared only for table"),
                "NotValidRow", ErrorCategory.InvalidArgument,
                    path));
        return;
    }

    OdbcDataAdapter da = GetAdapterForTable(tableName);

    if (da == null)
    {
        return;
    }

    DataSet ds = GetDataSetForTable(da, tableName);
    DataTable table = GetDataTable(ds, tableName);

    // Clear contents at the specified location
    for (int i = 0; i < table.Rows.Count; i++)
    {
        table.Rows[i].Delete();
    }

    if (ShouldProcess(path, "ClearContent"))
    {
        da.Update(ds, tableName);
    }

} // ClearContent

ClearContent uygulama hakkında hatırlamaları gerekenler

System. Management. Automation. Provider. ıtentcmdletprovider. ClearContent *uygulaması için aşağıdaki koşullar geçerli olabilir:

Clear-Content cmdlet 'Ine dinamik parametreler iliştirme

Clear-ContentCmdlet 'i, çalışma zamanında eklenen ek dinamik parametreler gerektirebilir. bu dinamik parametreleri sağlamak için Windows PowerShell içerik sağlayıcısı, bu parametreleri işlemek için System. Management. Automation. provider. ıtentcmdletprovider. clearcontentdynamicparameters * metodunu uygulamalıdır. Bu yöntem, belirtilen yoldaki öğenin parametrelerini alır. Bu yöntem, belirtilen yoldaki öğe için dinamik parametreleri alır ve cmdlet sınıfına ya da System. Management. Automation. Runtimedefinedparameterdictionary nesnesine benzer ayrıştırma öznitelikleri olan özellikler ve alanlar içeren bir nesne döndürür. Windows PowerShell çalışma zamanı, cmdlet 'e parametreleri eklemek için döndürülen nesneyi kullanır.

bu Windows PowerShell kapsayıcı sağlayıcısı bu yöntemi uygulamaz. Ancak, aşağıdaki kod bu yöntemin varsayılan uygulamasıdır.

public object ClearContentDynamicParameters(string path)
{
    return null;
}
public object ClearContentDynamicParameters(string path)
{
    return null;
}

Kod Örneği

Tüm örnek kod için bkz. AccessDbProviderSample06 Code Sample.

Nesne türlerini ve biçimlendirmeyi tanımlama

Sağlayıcı yazarken, varolan nesnelere üye eklemek veya yeni nesneler tanımlamak gerekebilir. bu işlem tamamlandığında, Windows PowerShell nesnenin üyelerini ve nesnenin nasıl görüntülendiğini tanımlayan bir biçim dosyasını tanımlamak için kullanabileceği bir tür dosyası oluşturmanız gerekir. Daha fazla bilgi için bkz. nesne türlerini ve biçimlendirmeyi genişletme.

Windows PowerShell sağlayıcısı oluşturma

Bkz. cmdlet 'leri, sağlayıcıları ve ana bilgisayar uygulamalarını kaydetme.

Windows PowerShell sağlayıcıyı test etme

Windows PowerShell sağlayıcınız Windows PowerShell ile kaydettirilirse, komut satırında desteklenen cmdlet 'leri çalıştırarak test edebilirsiniz. Örneğin, örnek içerik sağlayıcısını test edin.

Get-ContentParametresi tarafından belirtilen yoldaki veritabanı tablosunda belirtilen öğenin içeriğini almak için cmdlet 'ini kullanın Path . ReadCountParametresi, tanımlı içerik okuyucusunun okunacağı öğelerin sayısını belirtir (varsayılan 1). Aşağıdaki komut girdisiyle, cmdlet tablodaki iki satırı (öğe) alır ve içeriklerini görüntüler. Aşağıdaki örnek çıktının kurgusal bir Access veritabanı kullandığını unutmayın.

Get-Content -Path mydb:\Customers -ReadCount 2
ID        : 1
FirstName : Eric
LastName  : Gruber
Email     : ericgruber@fabrikam.com
Title     : President
Company   : Fabrikam
WorkPhone : (425) 555-0100
Address   : 4567 Main Street
City      : Buffalo
State     : NY
Zip       : 98052
Country   : USA
ID        : 2
FirstName : Eva
LastName  : Corets
Email     : evacorets@cohowinery.com
Title     : Sales Representative
Company   : Coho Winery
WorkPhone : (360) 555-0100
Address   : 8910 Main Street
City      : Cabmerlot
State     : WA
Zip       : 98089
Country   : USA

Ayrıca Bkz.

Windows PowerShell sağlayıcıları oluşturma

Windows PowerShell sağlayıcınızı tasarlama

Nesne türlerini ve biçimlendirmeyi genişletme

gezinti Windows PowerShell sağlayıcısı uygulama

Cmdlet 'Leri, sağlayıcıları ve ana bilgisayar uygulamalarını kaydetme

Windows PowerShell SDK’sı

Windows PowerShell Programcı Kılavuzu