Удалить несколько отчетов SSRS из подпапок с помощью командной строки?

Я новичок в развертывании SSRS, и я искал вокруг, но не могу найти точный сценарий, который применим к моей ситуации. У меня есть несколько отчетов, развернутых в разных подпапках в SSRS 2012. Например:

  • Продажи /salesReport1
  • Продажи /salesReport2
  • Финансы /finReport1
  • Финансы /finReport2
  • Разное /miscReport1
  • Разное /miscReport2

Из-за того, что иногда SSRS не нравится перезаписанный файл отчета, я хотел бы удалить все файлы отчетов в экземпляре перед развертыванием любых новых отчетов. Я могу успешно удалить папки и их содержимое, вызвав этот скрипт с помощью rs.exe:

Public Sub Main()  

  rs.Credentials = System.Net.CredentialCache.DefaultCredentials  

  Dim bh As New BatchHeader()  

  bh.BatchID = rs.CreateBatch()  

  rs.BatchHeaderValue = bh 

   'Delete all reports from Main Folder and sub folders.Note:The Folders will be deleted also.  
   'If do not want to delete the folder, we could use rs.CreateFolder(“Folder name”, “/Main     Folder”, “nothing”) to create a new one with nothing.  

 rs.DeleteItem("/Sales")
 rs.DeleteItem("/Finance")
 rs.DeleteItem("/Misc") 

   'Delete all reports from a sub folder, and delete the sub folder  
   'rs.DeleteItem("/Main Folder/Sub Folder ")  

  rs.BatchHeaderValue = bh       

  ' Delete folders using batch header.  

  Try  

     rs.ExecuteBatch()  
     Console.WriteLine("Folders deleted successfully.")  

  Catch e As SoapException  
     Console.WriteLine(e.Detail.InnerXml.ToString())  

  Finally  
      rs.BatchHeaderValue = Nothing 

  End Try  

End Sub 'Main 

Проблема заключается в том, что если какая-либо из этих папок не существует, сценарий остановится. Я пытаюсь определить лучший способ справиться с этим. Будет ли лучший способ очистить папки и оставить их там, или найти способ игнорировать ошибки и продолжить?

В зависимости от ответа, как бы я вызвал это в этом сценарии?

1 ответ

Решение

Вы можете проверить, существует ли папка, запустив элементы в родительской папке и найдя дочерние папки с ожидаемым именем. Тогда, только если это существует, попробуйте удалить папку.

Это должно решить вашу проблему, т.е. вы удалите ее только тогда, когда знаете, что она существует.

Ваш код может выглядеть примерно так:

Public Sub Main()

    rs.Credentials = System.Net.CredentialCache.DefaultCredentials

    DeleteFolder("Sales")
    DeleteFolder("Finance")

End Sub

Public Sub DeleteFolder(ByVal folderName As String)

    Dim items() as CatalogItem  
    Dim item As CatalogItem
    Dim folderExists As Boolean = False

    items = rs.ListChildren("/", False)

    For Each item In items

        If item.TypeName = "Folder" And item.Name.Equals(folderName)

            folderExists = True

        End If

    Next

    If folderExists

        Try

            rs.DeleteItem("/" + folderName)
            Console.WriteLine("Deleted folder {0}", folderName)

        Catch e As Exception

            Console.WriteLine(e.Message)

        End Try     

    Else

        Console.WriteLine("Folder {0} does not exist", folderName)

    End If

End Sub

Это проверяет / только папка - возможно, вам придется настроить в соответствии с вашими настройками.

Я выполнил принятый ответ для поддержки:

  • Удаление папки, которая не находится в корне
  • Удаление содержимого только папки
  • Поддержка SSRS 2017
  • Может использоваться как файл rss для использования в инструменте rs.exe

Так что код будет:

Dim TargetRSFolder As String = vTARGETRSFOLDER 
Dim TargetRSRoot As String = vTARGETROOT
Dim DeleteContentOnly As Boolean = vDeleteContentOnly 

Public Sub Main()

    rs.Credentials = System.Net.CredentialCache.DefaultCredentials

    DeleteFolder(TargetRSFolder)

End Sub

Public Sub DeleteFolder(ByVal folderName As String)

    Dim items() as CatalogItem  
    Dim item As CatalogItem
    Dim folderExists As Boolean = False
    Dim path As String = TargetRSRoot

    IF (path = "")
         path = "/"
    END IF


    items = rs.ListChildren(path, False)

    For Each item In items

        If item.Type.ToString() = "Folder" And item.Name.ToLower() = folderName.ToLower()

            folderExists = True

        End If

    Next

    If folderExists

        Try

            IF (DeleteContentOnly = True)   
                    items = rs.ListChildren(TargetRSRoot + "/" + folderName, False)
                     For Each item In items
                          rs.DeleteItem(item.Path)   
                     Next
                     Console.WriteLine("Deleted folder's contetnts : {0}", folderName)
            ELSE
                   rs.DeleteItem(TargetRSRoot + "/" + folderName)
                   Console.WriteLine("Deleted folder :{0}", folderName)
            END IF

        Catch e As Exception

            Console.WriteLine(e.Message)

        End Try     

    Else

        Console.WriteLine("Folder {0} does not exist", folderName)

    End If

End Sub

Предположим, у нас есть вышеуказанные коды в DeleteServerReportFolder.rss файл, и мы имеем "/bb/cc" папка.

  1. удалить cc только содержимое папки:

rs.exe -i DeleteServerReportFolder.rss -s http://server2/ReportServer2017 -v vTARGETRSFOLDER = cc -v vTARGETROOT = / bb -v vDeleteContentOnly = true

  1. Удалить bb папка полностью:

rs.exe -i DeleteServerReportFolder.rss -s http://server2/ReportServer2017 -v vTARGETRSFOLDER = bb -v vTARGETROOT = -v vDeleteContentOnly = false

Другие вопросы по тегам