【问题标题】:Invoke-Command Powershell - error: Cannot process argument because the value of argument "path" is null and expression after character in pipelineInvoke-Command Powershell - 错误:无法处理参数,因为参数“路径”的值为 null 并且管道中字符后的表达式
【发布时间】:2023-04-02 12:36:01
【问题描述】:

我正在尝试使用 Invoke-Command 登录到远程服务器并设置一个位置路径并执行一些命令。我正在从 powershell 中的配置 xml 中读取数据。 我的 xml 属于以下类型

<?xml version="1.0"?>
<Config>   
  <Action Name="Deploy">
            <CommandPath>C:\Program Files\Microsoft Sql server\110\</CommandPath>            
            <DeploymentServer>
                <Server Name = 'Server1'></Server>
                <Server Name = 'Server2'></Server>  
            </DeploymentServer>
            <Deployscript1 Name = 'listservices' > </Deployscript1>
            <Deployscript2 Name = 'script2' > </Deployscript2>
  </Action>
  <Action Name="Update">
    //few more nodes
  </Action>     
</Config>

我已经尝试过下面的 powershell。

Set-ExecutionPolicy RemoteSigned

function RunConfiguration()
{

# get an array of 'Action' XmlElements
$actionNodes = (Select-Xml -Path $configFile -XPath '//Action').Node

do {
    $Answer = Read-Host -Prompt "Select required action '$($actionNodes.Name -join "', '")'"
} Until ($Answer -in ($actionNodes.Name))

$selectedNode = $actionNodes | Where-Object {$_.Name -eq $Answer}
Write-Host $selectedNode.Name

$selectedNode.DeploymentServer.Server | ForEach-Object {
    $ServerName = $_.Name
    Write-Host $ServerName
    
if($selectedNode.Name -ieq "deploy")
{
$ScriptCode  = $selectedNode.Deployscript1.Name
$ScriptCode2  = $selectedNode.Deployscript2.Name
}
Write-Host $ScriptCode
Write-Host $selectedNode.CommandPath

Invoke-Command -ComputerName $ServerName -ScriptBlock {
 $Configuration = $args[0]
 Set-Location $selectedNode.CommandPath

#Execute first command       
        & $ScriptCode

#Execute second command
        $ScriptCode2
    } -ArgumentList $SelectedAnswer
  }
}


$spAdminServiceName = "SPAdminV4"
$currentDir=(split-path $myinvocation.mycommand.path -parent)
$configFile = $currentDir
$configFile += "\DeployConfig.xml"
Execute-Commands $configFile

RunConfiguration

Write-Host -f White "Press Enter key to exit..."
Read-Host

我收到以下 2 个错误: 错误 1:无法处理参数,因为参数“路径”的值为空。将参数“path”的值更改为非空值。

错误 2:管道元素中“&”之后的表达式生成的对象无效。它必须产生一个命令名称、一个脚本块或一个 CommandInfo 对象。

我能够在写入主机的 xml 中获得正确的路径。如何解决这两个错误? 谢谢

更新的代码 1:我可以毫无问题地从 XML 中获取值。

Invoke-Command -ComputerName $ServerName -ScriptBlock {
        $Configuration = $args[0]
  
#Navigate to location
        Set-Location $scriptPath.ToString()

#Execute first command

        & $ScriptCode

#Execute second command

        $ScriptCode1    
    } -ArgumentList $SelectedAnswer

【问题讨论】:

    标签: powershell


    【解决方案1】:

    #1 - 你似乎没有定义$configFile

    $actionNodes = (Select-Xml -Path $configFile -XPath '//Action').Node
    

    尝试在RunConfiguration() 函数的开头添加Write-Host "Config file is: $($configFile)"; - 它的值是否正确? $configFile 应该作为参数传递还是全局声明 - 您的函数目前不接受任何参数?

    #2 - $ScriptCode 变量将是一个对象,它必须是一个字符串。像这样检查变量的类型:

    $ScriptCode.GetType()
    

    当您调用Write-Host $ScriptCode 时,powershell 实际运行的可能是Write-Host $ScriptCode.ToString() - 它只返回正确的文本。当您使用调用运算符&amp; 传递该变量时,您传递的是整个对象而不仅仅是文件名。您需要先将$ScriptCode 转换为字符串:

    尝试任一(抱歉,未经测试的代码):

    & ([string] $ScriptCode)
    

    & $ScriptCode.ToString()
    

    【讨论】:

    • 谢谢。我已经用 ToString() 更新了脚本代码。我现在收到以下错误。错误 1:您不能在空值表达式上调用方法错误 2:管道元素中“&”之后的表达式生成了一个无效的对象。它必须产生一个命令名称、一个脚本块或一个 CommandInfo 对象。注意:在第一篇文章中更新了我的最新代码
    • 变量$ScriptCode$ScriptCode1$scriptPath 存在相同的问题——它们都是对象而不是字符串(因为这是Select-Xml 在您读取文件时返回的内容)。
    • 我已将 ToString 添加到所有这些中。我仍然遇到同样的错误 - 您不能在空值表达式上调用方法。我为 Invoke-Command 做的方式是否正确
    • 错误告诉你 $ScriptCode 为空 - 没有值 - 所以你不能用空变量 Invoke-Command (你也不能调用 .ToString() ,因为 null 不是对象,它是powershell用来描述没有价值的东西的东西)。您需要像我在答案中描述的那样在不同的地方使用Write-Host $ScriptCodeWrite-Host $ScriptCode.GetType() 之类的行来处理您的代码,以查看脚本中每个阶段发生的情况。您可能还想阅读使用调试器和带有 powershell 的断点在执行期间检查您的代码
    猜你喜欢
    • 2018-04-06
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 2021-03-14
    • 2015-03-29
    • 1970-01-01
    相关资源
    最近更新 更多