Я пытаюсь написать скрипт PowerShell, который будет делать следующее:
- Выполняет хранимую процедуру или запускает команду t-SQL, которая возвращает список значений.
- Сравнивает данные с шага 1 с существующей структурой файловых каталогов.
- Создает каталоги для значений на шаге 1, которых нет в существующей структуре каталогов.
- Удаляет каталоги для значений, не входящих в шаг 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
}
}