PowerShell:基于SQL数据集创建和删除文件夹

PowerShell:基于SQL数据集创建和删除文件夹,powershell,Powershell,我正在尝试编写一个PowerShell脚本,该脚本将执行以下操作: 执行存储过程或运行返回值列表的t-SQL命令 将步骤1中的数据与现有文件目录结构进行比较 为步骤1中不在现有目录结构中的值创建目录 删除现有目录结构中不在步骤1中的值的目录 我已经使用SSIS构建了一个类似的流程,但我想尝试将其移动到PowerShell脚本中,因为我怀疑它的性能会比我当前的SSIS包好得多。我最终自己找到了答案,下面列出了代码 如果有人能发布一种更快的方法来删除丢失的文件夹,而不必遍历每个文件夹的数据集,那就太

我正在尝试编写一个PowerShell脚本,该脚本将执行以下操作:

  • 执行存储过程或运行返回值列表的t-SQL命令
  • 将步骤1中的数据与现有文件目录结构进行比较
  • 为步骤1中不在现有目录结构中的值创建目录
  • 删除现有目录结构中不在步骤1中的值的目录
  • 我已经使用SSIS构建了一个类似的流程,但我想尝试将其移动到PowerShell脚本中,因为我怀疑它的性能会比我当前的SSIS包好得多。我最终自己找到了答案,下面列出了代码

    如果有人能发布一种更快的方法来删除丢失的文件夹,而不必遍历每个文件夹的数据集,那就太好了,但我还没有找到一种方法。我尝试了包含和比较对象,但我无法找到实现目标的方法

    $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
        }
    }
    

    我可能会基于dir和存储过程结果构建几个集合,并将它们与compare对象进行比较。结果上的“SideIndicator”字段应该告诉您需要做什么。

    我在周五自己解决了这个问题,并添加了问题的答案