Powershell 使用Invoke命令在远程计算机上保存XML
基本上,我从本地机器加载XML,然后尝试使用Invoke命令将其保存到远程机器上 我知道我可以通过UNC路径使用Copy item,但在某些机器上需要花费太长的时间,而且Invoke命令更快——我已经测试过了 然而,我认为我的论点是错误的 我得到的错误是:Powershell 使用Invoke命令在远程计算机上保存XML,powershell,Powershell,基本上,我从本地机器加载XML,然后尝试使用Invoke命令将其保存到远程机器上 我知道我可以通过UNC路径使用Copy item,但在某些机器上需要花费太长的时间,而且Invoke命令更快——我已经测试过了 然而,我认为我的论点是错误的 我得到的错误是: Method invocation failed because [System.String] does not contain a method named 'Save'. + CategoryInfo : In
Method invocation failed because [System.String] does not contain a method named 'Save'.
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
+ PSComputerName : -
我就是这样通过它的:
foreach ($serverPath in $serverLocations) {
if ($null -ne $serverPath) {
$generatedPath = "$(Get-Location)\Generated.ManageSQLJobs.xml"
[Xml]$generatedFile = Get-Content $generatedPath
Write-Log "INFO" "Checking on $serverPath" $ExecutionLogFullPath
$testPath = Invoke-Command -ComputerName "$serverPath" -ArgumentList [Xml]$generatedFile -ScriptBlock {
param (
$value
)
Test-Path -Path "C:\AppData\MonitoringConfig\"
if (!$testPath) {
$destinationPath = New-Item -Path "C:\AppData\" -Name "MonitoringConfig" -ItemType Directory
}
if ($testPath) {
$destinationPath = "C:\AppData\MonitoringConfig"
#Write-Log "INFO" "Exists on $serverPath." $ExecutionLogFullPath
}
$GetPathToDeleteXML = "C:\AppData\MonitoringConfig\Generated.ManageSQLJobs.xml"
if (Test-Path -Path $GetPathToDeleteXML) {
Remove-Item -Path * #-Filter Generated.ManageSQLJobs.xml
}
$GetPathForXML = "C:\AppData\MonitoringConfig\Generated.ManageSQLJobs.xml"
$value.Save($GetPathForXML.fullname)
}
}
}
-ArgumentList[Xml]$generatedFile
应该是(注意(…)
):
[Xml]$generatedFile
未被识别为表达式,因为当PowerShell解析时(带参数的命令,shell样式),初始的[
并不特殊
实际上,您的参数被解释为一个可扩展字符串,即,就好像您已经通过了“[Xml]$generatedFile”
因此,远程执行的脚本块中的
$value
接收到一个[string]
实例,而不是[xml]
实例,并且字符串没有解释错误消息的.Save()
方法
将参数包含在(…)
中会强制将其解释为表达式
有关PowerShell如何在参数模式下解析无引号标记的全面概述,请参阅
一般警告将复杂对象作为参数重新传递给远程/后台作业中执行的代码: 传递给远程/后台脚本块的参数必须经过基于XML的序列化和反序列化,因为它们通过计算机/进程边界 只有有限的已知类型被忠实地反序列化(反序列化为原始类型),其他类型被模拟 虽然
[xml]
实例、[string]
实例和.NET基元类型(如[int]
等)被忠实地反序列化,但大多数其他类型都不是
有关更多信息,请参阅。我很高兴听到它很有帮助,@GhostyIs1337;感谢您的反馈。
-ArgumentList ([Xml]$generatedFile)