使用 PowerShell 在所有服务器上编写所有 SQL 链接服务器的脚本

Scripting out all SQL Linked servers on all servers with PowerShell

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

下面的命令成功地编写了 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

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

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 假定为 return 个项目,每个项目代表一个服务器 [这可能不正确 - 请参见下文。]

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

    • Join-Path is used to construct the full path to the DEFAULT\LinkedServers subfolder of the server item at hand, whose child items Get-ChildItem then enumerates and on each of which ForEach-Object Script invokes the .Script() method, using simplified syntax.

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


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

  • 将服务器名称列表保存到 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"
  }