【问题标题】:Scripting out all SQL Linked servers on all servers with PowerShell使用 PowerShell 在所有服务器上编写所有 SQL 链接服务器的脚本
【发布时间】:2021-12-22 07:34:17
【问题描述】:

我需要将我环境中所有链接服务器的脚本导出到每个服务器的文件中。

下面的命令成功地将 ServerName1 上的所有链接服务器脚本化

get-childitem | %{$_.script()} >> C:\Users\someuser\Documents\Powershell\OutputFiles\ServerName1.sql

问题是我有 35 台服务器,为了让这个命令正常工作,我需要更改每台服务器的目录。

换句话说,每个服务器都需要按如下方式运行命令

PS SQLSERVER:\SQL\ServerName1\DEFAULT\LinkedServers> get-childitem | %{$_.Script()} >> C:\Users\someuser\Documents\Powershell\OutputFiles\ServerName1.sql

如何根据服务器名称循环从不同路径运行的命令并将文件命名为与服务器名称相同?

【问题讨论】:

    标签: powershell powershell-5.1


    【解决方案1】:
    Get-ChildItem -Literal SQLSERVER:\SQL | 
      ForEach-Object {
        $serverName = $_.Name
        Get-ChildItem -LiteralPath (Join-Path $_.PSPath DEFAULT\LinkedServers) |
          ForEach-Object Script > "C:\Users\someuser\Documents\Powershell\OutputFiles\$serverName.sql"
      }
    
    • Get-ChildItem -LiteralPath SQLSERVER:\SQL 被假定返回的项目代表一个服务器[这可能不是真的 - 见下文。]

    • 然后在ForEach-Object 脚本块中处理每个结果项:

      • Join-Path 用于构造手头服务器项的DEFAULT\LinkedServers 子文件夹的完整路径,然后枚举其子项Get-ChildItem,并在每个子项上ForEach-Object Script 调用.Script() 方法,使用simplified syntax.

        • 也就是说,ForEach-Object Script (% Script) 相当于您问题中的% { $_.Script() }
    • 注意>足以捕获目标文件中管道的所有输出; >> 仅在您想追加预先存在的目标文件时才需要。


    您声明Get-ChildItem -LiteralPath SQLSERVER:\SQL 确实没有列出所有服务器,并且您希望通过文本文件提供服务器名称列表

    • 将服务器名称列表保存到Servers.txt,每个名称各占一行。

    • 然后尝试以下操作:

      • 注意:假设对于给定的服务器 X,访问路径 SQLSERVER:\SQL\X\DEFAULT\LinkedServers 隐式连接到它。
    Get-Content Servers.txt | 
      ForEach-Object {
        Get-ChildItem "SQLSERVER:\SQL\$_\DEFAULT\LinkedServers" |
          ForEach-Object Script > "C:\Users\someuser\Documents\Powershell\OutputFiles\$_.sql"
      }
    

    【讨论】:

    • 从文件中获取数据工作
    • 很高兴听到这个消息,@LeoTorres。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2014-10-28
    • 2021-07-09
    • 2011-08-12
    相关资源
    最近更新 更多