1

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

下面的命令成功地脚本出 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

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

4

1 回答 1

0
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()方法,使用简化的语法

      • 也就是说,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"
  }
于 2021-11-09T17:21:37.137 回答