Получить каталог скриптов в PowerShell, когда скрипт вызывается с помощью Invoke-Command - PullRequest
5 голосов
/ 07 марта 2011

У меня есть набор сценариев PowerShell, которые содержат «общий» сценарий, расположенный в той же папке, например:

# some-script.ps1
$scriptDir = Split-Path -Parent $myinvocation.mycommand.path
. "$scriptDir\script-utils.ps1"

Это нормально, если скрипт вызывается напрямую, например,

.\some-script.ps1

Однако, если скрипт вызывается с помощью Invoke-Command, это не работает:

Invoke-Command -ComputerName server01 -FilePath "X:\some-script.ps1"

В этом случае infact, $myinvocation.mycommand содержит содержимое скрипта, а $myinvocation.mycommand.path равно нулю.
Как я могу определить каталог скрипта таким образом, чтобы он также работал, когда скрипт вызывается с помощью Invoke-Command?

Примечание
В конце концов, это решение, которое я на самом деле использовал:

Invoke-Command -ComputerName server01 `
  {param($scriptArg); & X:\some-script.ps1 $scriptArg } `
  -ArgumentList $something

Это также позволяет передавать параметры в скрипт.

Ответы [ 2 ]

6 голосов
/ 07 марта 2011

Я не верю, что вы можете изнутри вызванного скрипта. Из get-help invoke-command:

-FilePath Запускает указанный локальный скрипт на одном или нескольких удаленных компьютерах. Введите путь и имя файла скрипта, или Передайте путь сценария к Invoke-Command. Сценарий должен находиться на локальном компьютере или в каталоге, который локальный компьютер может получить доступ. Используйте параметр ArgumentList, чтобы указать значения параметров в скрипте.

 **When you use this parameter, Windows PowerShell converts the contents of the specified script file to a script
 block, transmits the script block to the remote computer, and runs it on the remote computer.**

Когда вы используете команду invoke с параметром -filepath, сценарий считывается из файла на локальном компьютере, преобразуется в блок сценария, и именно это передается на удаленный компьютер. Удаленный компьютер не может узнать, был ли этот блок сценария прочитан из файла.

Чтобы удаленный компьютер знал, каков был первоначальный путь к файлу, вам нужно будет указать его. Я думаю, что самый простой способ сделать это - написать функцию для вызова и передать ей имя файла в вызываемый скрипт в качестве параметра.

1 голос
/ 07 марта 2011

альтернативно, вместо использования filepath ... вы можете передать скрипт-блок, который получает исходный текст скрипта из UNC-пути, к которому имеют доступ все машины. Однако для каждой машины должен быть установлен соответствующий набор политик выполнения, чтобы они могли запускать этот сценарий по пути UNC

позвольте мне прояснить, что я не говорю о запуске сценария с пути UNC, как если бы он выполнял удаленное взаимодействие, но все же использую команду invoke или start-job для запуска блока сценариев на удаленном компьютере. Просто так получается, что этот скрипт-блок для удобства запускает скрипт из UNC-пути.

...