Invoke-Command不返回任何内容

问题描述 投票:0回答:2

我正在尝试使用通过csv文件提供的变量在远程计算机上运行可执行文件。csv文件如下所示:(由查询远程计算机的变量组成-没问题)。

"Server","Command",                  "Arg1","Arg2","Arg3","FName"
Server1,C:\path\to\exe with spaces, /arg1, "arg2", arg3, filename

问题是我想以某种方式保留“ Arg2”周围的“”,但是我相信import-csv会删除它们。

导入代码是:

Import-Csv $LogFolder\Machines.csv | ForEach-Object { 
  Invoke-Command ComputerName $_.Server  { 
    param($Command, $Arg1, $Arg2, $Arg3, $FName)
    $Command
  } -Args $_.Arg1, $_.Arg2, $_.Arg3, $_.FName
}

我尝试用&代替$ Command放置可执行文件的路径>

Import-Csv $LogFolder\Machines.csv | ForEach-Object { 
  Invoke-Command ComputerName $_.Server  { 
    param($Command, $Arg1, $Arg2, $Arg3, $FName)
    & "C:\path\to\exe with spaces"
  } -Args $_.Arg1, $_.Arg2, $_.Arg3, $_.FName
}

该命令似乎正在运行,并且我什么也没回来,但是我希望在远程服务器上看到一个没有出现的文件...

上面的代码中我盲目缺少什么吗?

抱歉,我仍在学习powershell,而我的google-fu目前无济于事。.:(

谢谢

我正在尝试使用通过csv文件提供的变量在远程计算机上运行可执行文件。 csv文件如下所示:((由查询远程计算机的变量组成-否...

这里是一个例子:

$arg1 = 'cmd'
$arg2 = '/c'
$arg3 = 'dir'
$server = 'comp001'
invoke-command -computername $server { param($a,$b,$c) 
  & $a $b $c} -args $arg1,$arg2,$arg3

我使用此csv文件进行了测试,

"Server","Command",                  "Arg1","Arg2","Arg3","FName"
server,cmd, /c echo, test, this, <fullpath>\fname.txt

并使用此脚本执行。

Import-Csv $LogFolder | ForEach-Object { 
  Invoke-Command -ComputerName $_.Server -ScriptBlock {
    param($arg1, $arg2, $arg3, $arg4, $arg5)
    .  $arg1 $ExecutionContext.InvokeCommand.ExpandString("$arg2 $arg3 $arg4 > $arg5")
  } -args $_.Command, $_.Arg1, $_.Arg2, $_.Arg3, $_.FName
}

脚本有问题

  1. [我看到的第一个明显的东西是失踪-在ComputerName之前。
  2. 第二件事是,您正在运行一个可执行文件,但没有为其提供任何参数。更新命令并向其中添加变量。
  3. 您需要了解传递给Invoke-Command的参数具有一对一的映射。您正在函数中定义5个参数,但只能传递4。
  4. Import-Csv $LogFolder\Machines.csv | ForEach-Object { 
      Invoke-Command ComputerName $_.Server  { 
        param($Command, $Arg1, $Arg2, $Arg3, $FName)
        $Command
      } -Args $_.Arg1, $_.Arg2, $_.Arg3, $_.FName
           # $_.Arg1 -> Command
           # $_.Arg2 -> $Arg1
           # $_.Arg3 -> $Arg2 .. and so on.
    }
    

    我正在使用$ExecutionContext.InvokeCommand.ExpandString将所有参数组合在一起。由于此操作的目的是将多个字符串组合为一个字符串以创建单个字符串(每个元素外都没有引号),因此可以解决此问题。

    您可以使用.&调用命令。

更新

Import-Csv $LogFolder| ForEach-Object { 

# Limit the number of arguments sent via -args.
$Exe = $_.Command

# Use "" to parse it as " within your script.
$arguments = "$($_.arg1) $($_.arg2) ""$($_.arg3)"" > $($_.fname)"

  Invoke-Command -ComputerName $_.Server -ScriptBlock {
    param($command, $arguments)
    . $command $arguments
  } -args $exe, $arguments
}
powershell csv arguments invoke-command
2个回答
0
投票

这里是一个例子:


0
投票

我使用此csv文件进行了测试,

"Server","Command",                  "Arg1","Arg2","Arg3","FName"
server,cmd, /c echo, test, this, <fullpath>\fname.txt
© www.soinside.com 2019 - 2024. All rights reserved.