PowerShell Invoke-Command с FilePath на локальном компьютере - ошибка неопределенных параметров? - PullRequest
1 голос
/ 01 апреля 2020

Я хочу запустить скрипт в файле на локальном компьютере, используя Invoke-Command, чтобы я мог передать параметры с -ArgumentList. Я получил ошибку, которую не понимаю, поэтому упростил команду. Когда я делаю это:

Invoke-Command -FilePath 'getprocess.ps1'

Содержимое файла getprocess.ps1:

Get-Process

Получаемое сообщение об ошибке:

Invoke-Command : Набор параметров не может быть разрешен с использованием указанных именованных параметров.

В строке: 1 символ: 1

+ Invoke-Command -FilePath 'getprocess.ps1'

+ ~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo: InvalidArgument: (:) [Invoke -Command], ParameterBindingException

+ FullyQualifiedErrorId: AmbiguousParameterSet, Microsoft.PowerShell.Commands.InvokeCommandCommand

Я озадачен этим сообщением об ошибке. Что это значит? Как мне заставить это работать?

Ответы [ 5 ]

1 голос
/ 02 апреля 2020

tl; др :

  • Не использовать Invoke-Command для локальных вызовов - хотя технически это возможно в ограниченном сценарии ios, для этого нет веских оснований.

  • Вместо этого вызывайте сценарии напрямую :

.\getprocess.ps1

Примечание. В отличие от cmd.exe, PowerShell по своему дизайну требует .\ для выполнения исполняемого файла, расположенного в текущем каталоге . То есть, чтобы избежать случайного выполнения исполняемых файлов в текущем каталоге, а не из каталога, указанного в $env:Path, PowerShell в качестве функции безопасности требует явного указания на намерение выполнить что-либо в текущем каталоге (.). .

Для блоков сценариев ({ ... }) используйте &, оператор вызова (например, & { Get-Date }).

По причинам, связанным с синтаксисом c, вам также необходимо & для сценариев, если они указаны либо как заключенный в кавычки путь (например, & '.\getprocess.ps1'), и / или если путь включает в себя ссылки на переменные (например,
& $HOME\getprocess.ps1).


Действительно, как вы указали в своем собственном ответе , -FilePath необходимо сочетать с параметром
-ComputerName (что сообщение об ошибке является настолько обобщенным c неудачно).

Цель параметра -FilePath - скопировать содержимое локального сценария (*.ps1 файл) на удаленный компьютер для выполнения там . То есть это удобный механизм выполнения кода скрипта, который (только) доступен локально на удаленной машине.

В то время как вы можете технически ориентироваться на локальный компьютер через -ComputerName localhost (или, более кратко, через -ComputerName . / -cn .), это делает не равным местному звонку :

Всякий раз, когда указано -ComputerName - даже с -ComputerName localhost - используется инфраструктура удаленного взаимодействия PowerShell , которая имеет основные последствия :

  • Целевой компьютер - даже если он локальный - должен быть настроен для удаленного взаимодействия PowerShell - см. about_Remote_Requirements .

  • Если вы настроены на локальный локальный компьютер В частности, на компьютере должна быть запущена сессия с повышенными правами (с правами администратора).

  • Выполнение будет намного медленнее, чем direct (локально ) вызов.

  • Верность типа может быть потеряна как для входных, так и для выходных данных, г Даже при использовании межпроцессного маршалинга через инфраструктуру сериализации на основе PowerShell XML - см. этот ответ .

0 голосов
/ 02 апреля 2020

Вы можете запустить его локально, как это, но вы должны быть в приглашении администратора (с повышенными правами). Приятно иметь возможность запустить его в качестве теста.

invoke-command localhost getprocess.ps1

Вы также можете сделать странную форму параллелизма:

invoke-command localhost,localhost,localhost getprocess.ps1
0 голосов
/ 01 апреля 2020

Хотя сообщение об ошибке не дает понять, что параметр -FilePath делает обязательным параметр -ComputerName . Чтобы явно указать локальный компьютер, используйте -ComputerName localhost .

Invoke-Command -FilePath 'getprocess.ps1' -ComputerName localhost
0 голосов
/ 01 апреля 2020

У вас должно быть имя компьютера.

$parameters = @{
    ComputerName = '255.255.255.255'
    FilePath = 'getprocess.ps1'
    Credential = 'Domain01\User01'
}

invoke-command @parameters

Используйте свой IP :) Чтобы разрешить это, вы также должны включить -credential

Если этого не сделать ... invoke-expression может быть подходящей заменой для тестирования, пока вы не будете готовы вызывать команду на удаленной машине.

0 голосов
/ 01 апреля 2020

Я не могу использовать invoke-command локально. Вы используете это, когда пытаетесь запустить команду на удаленном сервере P C.

Например, вы хотите выполнить что-то вроде:

invoke-Command -ComputerName REMOTE-PC -Credentials $credential -Scriptblock {Get-Process}

Эта ошибка в основном говорит вам, что вам нужно заполнить больше параметров, связанных с этой командой.

попробуйте запустить Get-Help Invoke-Command, чтобы увидеть некоторую информацию о команде и о том, как ее запустить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...