#sql #powershell #hashtable
#sql #powershell #хеш-таблица
Вопрос:
Сценарий: я пытаюсь получить кучу файлов из SFTP, а затем перебирать их, чтобы сравнить параметры файла с параметрами в моей таблице аудита, и если это совершенно новый файл, я вставляю информацию в таблицу аудита.
Вот фрагмент моего кода
$directory = $session.ListDirectory("/broken/")
$session.Dispose()
foreach ($fileInfo in $directory.Files)
{
$FileName = $($fileInfo.Name)
$FileSize = $($fileInfo.Length)
$DateModified = $($fileInfo.LastWriteTime)
If($FileName -eq '.' -or $FileName -eq '..' )
{
continue
}
#Check if file was downloaded earlier
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server = $SQLServer; Database = $SQLDBName; User ID = $SQLUsername; Password = $SQLPassword"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = "SELECT [FileName],[DateModified],[FileSize] FROM [FTP].[dbo].[Log] WHERE FileName='$FileName'"
$SqlCmd.Connection = $SqlConnection
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)
$SqlConnection.Close()
$Result = $DataSet.Tables[0]
####
Теперь, когда у меня есть информация о запросе SQL, извлекаемая в моей переменной хэш-таблицы PowerShell.
Как мне затем сравнить, были ли возвращены результаты или нет
Я попытался выполнить несколько следующих действий:
If ($Result.Matches.Count -ne 0 ){
### Naming the files
$SQLFTPFileName = $Result.RemoteFileName[0]
$SQLFTPFileDateModified = $Result.DateModified[0]
$SQLFTPFileSize = $Result.FileSize[0]
###
OR
If ($Result.RemoteFileName[0] -ne 0 ){
### Naming the files
$SQLFTPFileName = $Result.RemoteFileName[0]
$SQLFTPFileDateModified = $Result.DateModified[0]
$SQLFTPFileSize = $Result.FileSize[0]
###
}
Не могли бы вы помочь мне здесь?
Спасибо за помощь, оценил.
Комментарии:
1. В коде отсутствует финал
}
. Кроме того, в цикле вы снова и снова задаете локальную переменную$Result = $DataSet.Tables[0]
, но ваш цикл никогда ничего не выводит. Чтобы захватить выходные данные, выполните$Result = foreach ($fileInfo in $directory.Files) { .. }
и в последних строках цикла выведите результат с помощью just$DataSet.Tables[0]
, за которым следует$DataSet.Dispose()
2. @Theo Спасибо за ваш ответ, на самом деле в цикле foreach намного больше логики. Я закончил этот цикл только потому, что включил сюда весь код. Я все еще не уверен, как я могу проверить, имеет ли переменная $result значение null/ 0.
3. Хорошо… Это не имеет значения. Вы не выводите $Result в цикле.. Я считаю, что мой комментарий все еще остается в силе.
4. Извините, но я немного не могу понять, что на данный момент моя переменная $Result содержит PS C:WINDOWSsystem32 > $Result Удаленное имя файла с измененным по дате размером файла ————— ———— ——— local.txt 1/24/20202:21:11 AM 2582 Но это выражение If ($Result. Матчи. Значение Count (ne 0) оказывается ЛОЖНЫМ, я ожидаю, что оно будет ИСТИННЫМ, поскольку оно содержит значение. Спасибо
5. И если я сравню его с IF($Result. RemoteFileName[0] -ne 0), затем вставьте пустое значение, если жалуется на нулевой массив. Пожалуйста, предложите выход из этого