Powershell 使用Invoke命令在远程计算机上保存XML

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

基本上,我从本地机器加载XML,然后尝试使用Invoke命令将其保存到远程机器上

我知道我可以通过UNC路径使用Copy item,但在某些机器上需要花费太长的时间,而且Invoke命令更快——我已经测试过了

然而,我认为我的论点是错误的

我得到的错误是:

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)