我正在尝试编写将执行以下操作的PowerShell脚本:
我已经使用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
}
}
答案 0 :(得分:0)
我可能会根据dir和存储过程结果构建一些集合,并将它们与compare-object进行比较。结果中的“SideIndicator”字段应该告诉您需要做什么。
答案 1 :(得分:0)
我星期五自己解决了这个问题并添加了问题的答案。