我正在开发一个概念验证 Powershell 脚本,该脚本将安排在源主机上,并在远程 SQL 服务器&SOURCEHOST01
上调用命令。计划的操作顺序如下:SQLSERV01
SQLSERV02
从存储在源主机上的文本文件中获取 SQL Server 主机名列表
\\SOURCEHOST01\PATH\SQLSERVERHOSTNAME.LIST
对于每个 SQL 服务器,调用命令以将 SQL 脚本复制
\\SOURCEHOST01\PATH\simple_sp_who.sql
到%TEMP%
每个 SQL 服务器上。Invoke-Sqlcmd
在每个 SQL 服务器上使用指定的 SQL 脚本。
这是我到目前为止的代码:
Get-Content \\SOURCEHOST01\PATH\SQLSERVERHOSTNAME.LIST | Foreach-Object {
Invoke-Command -ComputerName $_ -ScriptBlock {
$FileSource = "\\SOURCEHOST01\PATH\"
$FileDest = "$Env:TEMP\SQL\"
$Database = "Master"
$InputFile = "$FileDest\simple_sp_who.sql"
Copy-Item $FileSource -Destination $FileDest -Recurse
Invoke-Sqlcmd -ServerInstance $_ -Database $Database -InputFile $InputFile
}
}
结果错误:
Access is denied
+ CategoryInfo : PermissionDenied: (\\SOURCEHOST01\PATH\:String) [Copy-Item], UnauthorizedAccessException
+ FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.CopyItemCommand
+ PSComputerName : SQLSERV01
由于文件权限问题,该脚本似乎在 Copy-Item 失败。我正在运行的测试环境以域管理员身份运行所有内容。我确定这是一个我忽略的简单问题,但我已经开始重复步骤,所以我需要一双新的眼睛。
编辑:
这就是我最终得到的结果:
Get-Content \\SOURCEHOST01\PATH\SQLSERVERHOSTNAME.LIST | Foreach-Object {
$SQLSource = Test-Path "\\$($_)\C$\Windows\Temp\SQL\"
$FileSource = "\\SOURCEHOST01\PATH\"
$FileDest = "\\$($_)\C$\Windows\Temp\SQL\"
IF ($SQLSource -eq $True) {
Remove-Item -Recurse -Force $FileDest
Copy-Item -Recurse $FileSource $FileDest
} ELSE {
Copy-Item -Recurse $FileSource $FileDest
}
$date = Get-Date -UFormat "%Y%m%d-%H%M"
$ScriptBlockContent = {
$Database = "Master"
$InputFile = "C:\Windows\Temp\SQL\simple_sp_who.sql"
Invoke-Sqlcmd -ServerInstance $_ -Database $Database -InputFile $InputFile
}
Invoke-Command -ComputerName $_ -ScriptBlock $ScriptBlockContent | Out-File -filePath "\\SOURCEHOST01\PATH\Logs\$date-$_.rpt" -NoClobber
}
似乎产生了预期的结果。