调用命令不返回任何内容

时间:2020-01-29 12:03:30

标签: powershell csv arguments invoke-command

我正在尝试使用通过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目前无济于事。.:(

谢谢

2 个答案:

答案 0 :(得分:0)

我对此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个。
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
}

答案 1 :(得分:0)

这是一个例子:

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