PowerShell: создание и удаление папок на основе набора данных SQL - PullRequest
0 голосов
/ 23 сентября 2010

Я пытаюсь написать скрипт PowerShell, который будет делать следующее:

  1. Выполняет хранимую процедуру или запускает команду t-SQL, которая возвращает список значений.
  2. Сравнивает данные с шага 1 с существующей структурой файловых каталогов.
  3. Создает каталоги для значений на шаге 1, которых нет в существующей структуре каталогов.
  4. Удаляет каталоги для значений, не входящих в шаг 1, которые находятся в существующей структуре каталогов.

Я уже создал аналогичный процесс, используя SSIS, но я хотел бы попытаться перенести это в сценарий PowerShell, так как подозреваю, что он будет работать значительно лучше, чем мой текущий пакет SSIS. В конце концов я понял это сам, и код приведен ниже.

Было бы замечательно, если бы кто-нибудь опубликовал более быстрый способ удаления отсутствующих папок без необходимости перебирать набор данных для каждой папки, но я не смог найти способ. Я попробовал -contains и Compare-Object, но не смог найти способ достичь своей цели.

$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server = ServerName; Database = DatabaseName; Integrated Security = True"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = "SELECT DISTINCT folder = CONVERT(VARCHAR(MAX), id) FROM Some.Table (NOLOCK);"
$SqlCmd.Connection = $SqlConnection
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)
$SqlConnection.Close()

$RootDirectory = "\\Some\Root\Directory\Over\There\"

# Delete folders if they shouldn't exist.
$RootDirectoryChildItems = Get-ChildItem $RootDirectory
foreach ($i in $RootDirectoryChildItems)
{
    $Matched = 0
    $TargetDirectory = $RootDirectory + $i.Name

    $DataSetTableRows = $DataSet.Tables[0].Rows
    foreach ($Row in $DataSetTableRows)
    {
        if ($Row.folder -eq $i.Name)
        {
            $Matched = 1
        }
    }

    if ($Matched -eq 0)
    {
        Write-Output 'Deleted folder' $TargetDirectory; Remove-Item $TargetDirectory -Recurse | Out-Null
    }
}

# Create folders if they don't exist.
$DataSetTableRows = $DataSet.Tables[0].Rows
foreach ($Row in $DataSetTableRows)
{  
    $TargetDirectory = $RootDirectory + $Row.folder
    if (!(Test-Path $TargetDirectory))
    {
        Write-Output 'Created folder' $TargetDirectory '.'; New-Item $TargetDirectory -type directory | Out-Null
    }
}

Ответы [ 2 ]

0 голосов
/ 28 сентября 2010

Я сам решил эту проблему в пятницу и добавил ответ на вопрос.

0 голосов
/ 24 сентября 2010

Вероятно, я бы собрал несколько коллекций на основе результатов dir и хранимых процедур и сравнил бы их с объектами сравнения.Поле «SideIndicator» в результатах должно указывать, что вам нужно делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...