Код.NET, который будет заменен командлетом PowerShell в PS1

Здравствуйте, я написал следующий код в PowerShell версии 2. Я использую код C#.NET для запроса Windows поиска файлов PDF в определенной папке, введенной пользователем, против значений в файле Excel. Если значение найдено в одном из файлов PDF, он выводит имя файла PDF в Excel рядом с ключом.

SerarchItemsInPDFs.ps1:

# Starting C# code

$Assem = ( 
 "System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
 )
$Source = @"
using System.Collections.Generic;
using System.Data.OleDb;
namespace Windows.Search
{ 
    public class Tool2
    { 
        public static List<string> Get(string Key, string Path)
        {
                using (OleDbConnection conn = new OleDbConnection("Provider=Search.CollatorDSO;Extended Properties='Application=Windows';"))
                {
                    conn.Open();
                    OleDbCommand cmd = new OleDbCommand("SELECT System.ItemPathDisplay FROM SYSTEMINDEX WHERE FREETEXT('" + Key + "') AND DIRECTORY = '" + Path + "'", conn);
                    using (OleDbDataReader reader = cmd.ExecuteReader())
                    {
                        List<string> row = new List<string>();
                        while (reader.Read())
                        {
                            for (int i = 0; i < reader.FieldCount; i++)
                            {
                                row.Add(reader[i].ToString()); 
                            }

                        }
                        return row;
                    }
                }

         }
    }
}
"@

Add-Type -ReferencedAssemblies $Assem -TypeDefinition $Source -Language CSharp

# End of C# code

# PoswerShell script begins
function IsData($variable) {if ($variable) {$true} else {$false}}


$ExcelPath = Read-Host "Enter the path to excel file" 
$SheetName = "New Database"
$Excel = New-Object -ComObject "Excel.Application"

$Workbook = $Excel.workbooks.open($ExcelPath)
$Sheet = $Workbook.Worksheets.Item($SheetName)


$PDFsPath = Read-Host "Enter the path to PDFs folder" 

$TotalUsedRows = $Sheet.usedRange.SpecialCells(11).row

"Starting rescue log file" | out-File "C:\Temp\output.txt"

for ($i=2; $i -le $TotalUsedRows; $i++)
{
    $CellValue = $Sheet.Cells.Item($i,1).Text
    If(!(IsData($CellValue))){continue}
    $PDFsNames = [Windows.Search.Tool2]::Get($CellValue, $PDFsPath)
    $records_found = 2
    Write-Host $CellValue
    foreach ($PDFName in $PDFsNames)
    {
        Write-Host $PDFName
        $Sheet.Cells.Item($i, $records_found) = $PDFName
        $CellValue + ";" + $PDFName + "," | out-File -Append "C:\Temp\output.txt"
        $records_found++
    }
}

$Workbook.SaveAs(“c:\Temp\results.xlsx”)
Write-Host "Job Done"

# End of PowerShell script

Поскольку в PowerShell появилось много новых командлетов, начиная с версии 2.0, есть ли способ избавиться от части кода C# с помощью POSH v4?

Можем ли мы принести больше оптимизации синтаксиса, учитывая, что мы используем все крайние версии продукта (Windows 8.1, PowerShell 4 и Office 2013)?

1 ответ

Да, вы можете читать из базы данных, не используя C# в PowerShell, даже в v1. Поскольку PowerShell может использовать любой класс.Net, вы можете делать точно такой же код в PowerShell. использование New-Object в PowerShell вместо new в C# и остальной код в основном то же самое. Некоторые примеры здесь.

Может быть, потерять ненужную функцию IsData. Код, вероятно, будет немного быстрее, если вы сначала создадите вывод, а затем в конце напишите вывод вместо того, чтобы каждый раз открывать файл. Я не вижу других оптимизаций, которые вы могли бы использовать в PowerShell v4.

Обновить

Вот пример использования Windows Search все в PowerShell.

Другие вопросы по тегам