Как изменить сохраненную информацию хеш-таблицы о результате SQL в Powershell

#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), затем вставьте пустое значение, если жалуется на нулевой массив. Пожалуйста, предложите выход из этого