Запустить MsiExec из PowerShell и получить код возврата

С BAT / CMD скриптом я могу просто использовать "msiexec / i / тихо / нет "

CREATE PROCEDURE Breadth_First (@StartNode varchar(50), @LinkStrength decimal(10,7) = 0.1, @EndNode varchar(50) = NULL)
    AS
    BEGIN
        -- Automatically rollback the transaction if something goes wrong.   
        SET XACT_ABORT ON   
        BEGIN TRAN

        -- Increase performance and do not intefere with the results.
        SET NOCOUNT ON;

        -- Create a temporary table for storing the discovered nodes as the algorithm runs
        CREATE TABLE #Discovered
        (
             DiscoveredUser varchar(50) NOT NULL,    -- The Node Id
            Predecessor varchar(50) NULL,    -- The node we came from to get to this node.
            LinkStrength decimal(10,7) NULL, -- positive - from predecessor to  DiscoveredUser, negative - from  DiscoveredUser to predecessor
            OrderDiscovered int -- The order in which the nodes were discovered.
        )

        -- Initially, only the start node is discovered.
        INSERT INTO #Discovered ( DiscoveredUser, Predecessor, LinkStrength, OrderDiscovered)
        VALUES (@StartNode, NULL, NULL, 0)

        -- Add all nodes that we can get to from the current set of nodes,
        -- that are not already discovered. Run until no more nodes are discovered.
        WHILE @@ROWCOUNT > 0
        BEGIN
            -- If we have found the node we were looking for, abort now.
            IF @EndNode IS NOT NULL
                IF EXISTS (SELECT TOP 1 1 FROM #Discovered WHERE  DiscoveredUser = @EndNode)
                    BREAK   

            -- We need to group by ToNode and select one FromNode since multiple
            -- edges could lead us to new same node, and we only want to insert it once.
            INSERT INTO #Discovered ( DiscoveredUser, Predecessor, LinkStrength, OrderDiscovered)
            (SELECT mc.called_party, mc.calling_party, mc.link_strength, d.OrderDiscovered + 1
            FROM #Discovered d JOIN monthly_connections mc ON d. DiscoveredUser = mc.calling_party
            WHERE mc.called_party NOT IN (SELECT  DiscoveredUser From #Discovered) AND mc.link_strength > @LinkStrength
            UNION
            SELECT mc.calling_party, mc.called_party, mc.link_strength * (-1), d.OrderDiscovered + 1
            FROM #Discovered d JOIN monthly_connections mc ON d. DiscoveredUser = mc.called_party
            WHERE mc.calling_party NOT IN (SELECT  DiscoveredUser FROM #Discovered) AND mc.link_strength > @LinkStrength
            )
        END;

        -- Select the results. We use a recursive common table expression to
        -- get the full path from the start node to the current node.
        WITH BacktraceCTE(Predecessor,  DiscoveredUser, LinkStrength, OrderDiscovered, Path)
        AS
        (
            -- Anchor/base member of the recursion, this selects the start node.
            SELECT d.Predecessor, n. DiscoveredUser, d.LinkStrength, d.OrderDiscovered, 
                CAST(n. DiscoveredUser AS varchar(MAX))
            FROM #Discovered d JOIN users n ON d. DiscoveredUser = n. DiscoveredUser
            WHERE d. DiscoveredUser = @StartNode

            UNION ALL

            -- Recursive member, select all the nodes which have the previous
            -- one as their predecessor. Concat the paths together.
            SELECT d.Predecessor, n. DiscoveredUser, d.LinkStrength, d.OrderDiscovered,
                CAST(cte.Path + ',' + CAST(n. DiscoveredUser as varchar(30)) as varchar(MAX))
            FROM #Discovered d JOIN BacktraceCTE cte ON d.Predecessor = cte. DiscoveredUser
            JOIN users n ON d. DiscoveredUser = n. DiscoveredUser
        )

        SELECT Predecessor,  DiscoveredUser, LinkStrength, OrderDiscovered, Path FROM BacktraceCTE
        WHERE  DiscoveredUser = @EndNode OR @EndNode IS NULL -- This kind of where clause can potentially produce
        ORDER BY OrderDiscovered                -- a bad execution plan, but I use it for simplicity here.

        DROP TABLE #Discovered
        COMMIT TRAN
        RETURN 0
    END

График (социальная сеть), который я сейчас анализирую, имеет 28 миллионов соединений, и без игнорирования слабых соединений (установите порог с помощью @LinkStrength) выполнение выполняется очень долго (пока у меня нет результатов и я попытаюсь оставьте его включенным на ночь).

В любом случае следующий шаг - вычислить самые короткие (самые сильные) ссылки между двумя пользователями (их около 3 миллионов). Я думал об использовании алгоритма Джикстры, но не уверен, можно ли проанализировать такую ​​сеть на ПК, который я использую в настоящее время (четырехъядерный процессор 2,66 ГГц, 4 ГБ ОЗУ), и данные хранятся в базе данных MS SQL Server 2008.

Подводя итог, я был бы признателен за ответы / предложения на следующие вопросы:

  1. Можно ли выполнить t получил какие-либо результаты и попытаюсь оставить его включенным на ночь.)

    В любом случае следующим шагом будет вычисление самых коротких (самых сильных) ссылок между двумя пользователями (их около 3 миллионов). Я думал об использовании алгоритма Джикстры, но не уверен, можно ли проанализировать такую ​​сеть на ПК, который я использую в настоящее время (четырехъядерный процессор 2,66 ГГц, 4 ГБ ОЗУ), и данные хранятся в базе данных MS SQL Server 2008.

    Подводя итог, я был бы признателен за ответы / предложения на следующие вопросы:

    1. Можно ли выполнить t получил какие-либо результаты и попытаюсь оставить его включенным на ночь.)

      В любом случае следующим шагом будет вычисление самых коротких (самых сильных) ссылок между двумя пользователями (их около 3 миллионов). Я думал об использовании алгоритма Джикстры, но не уверен, можно ли проанализировать такую ​​сеть на ПК, который я использую в настоящее время (четырехъядерный процессор 2,66 ГГц, 4 ГБ ОЗУ), и данные хранятся в базе данных MS SQL Server 2008.

      Подводя итог, я был бы признателен за ответы / предложения на следующие вопросы:

      1. Можно ли выполнить такие же сложные запросы, как приведенный выше для описанный график (28 млн подключений, 3 млн пользователей) на описанной машине (2,66 ГГц, 4 ГБ ОЗУ)?
      2. Если это невозможно, есть ли какие-нибудь другие возможные подходы, с помощью которых время выполнения может быть сокращено (например, создание таблиц с частичным результатов)?
      3. Вы рекомендуете другие алгоритмы обнаружения кластеров и вычисление кратчайших путей для описанный график?

      Спасибо!

6
задан Niko Gamulin 8 November 2010 в 13:51
поделиться