使用 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"
}
我需要将我环境中所有链接服务器的脚本导出到每个服务器的文件中。
下面的命令成功地编写了 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 theDEFAULT\LinkedServers
subfolder of the server item at hand, whose child itemsGet-ChildItem
then enumerates and on each of whichForEach-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
隐式连接到它。
- 注意:假设对于给定的服务器 X,访问路径
Get-Content Servers.txt |
ForEach-Object {
Get-ChildItem "SQLSERVER:\SQL$_\DEFAULT\LinkedServers" |
ForEach-Object Script > "C:\Users\someuser\Documents\Powershell\OutputFiles$_.sql"
}