Invoke-Command ничего не возвращает - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь запустить исполняемый файл на удаленных машинах с переменными, предоставленными через файл 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 голосов
/ 29 января 2020

Вот пример:

$arg1 = 'cmd'
$arg2 = '/c'
$arg3 = 'dir'
$server = 'comp001'
invoke-command -computername $server { param($a,$b,$c) 
  & $a $b $c} -args $arg1,$arg2,$arg3
0 голосов
/ 29 января 2020

Я протестировал этот 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...