使用Invoke-Command调用脚本时,在PowerShell中获取脚本目录

时间:2011-03-07 12:01:32

标签: powershell invoke-command

我有一组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"

在这种情况下,实际上,$myinvocation.mycommand包含脚本的内容,$myinvocation.mycommand.path为空。
如何使用Invoke-Command调用脚本时,如何确定脚本的目录?

注意
最后,这是我实际使用的解决方案:

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

这也允许将参数传递给脚本。

2 个答案:

答案 0 :(得分:6)

我不相信你可以在调用的脚本中。来自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.**

使用-filepath参数使用invoke-command时,将从本地计算机上的文件中读取脚本,转换为脚本块,然后传递给远程计算机。远程计算机无法知道是否从文件中读取了该脚本块。

要使远程计算机知道原始文件路径是什么,您必须告诉它。我认为最简单的方法是编写一个函数来进行调用,并将文件名作为参数传递给调用的脚本。

答案 1 :(得分:1)

或者不是使用filepath ..你可以传入一个scriptblock,它从所有机器都可以访问的UNC路径中对脚本进行dotource。但是,每台机器都需要设置适当的executionpolicy,以便它们可以从UNC路径运行该脚本

让我明确一点,我并不是说从UNC路径运行脚本就好像是远程处理,但仍然使用invoke-command或start-job在远程计算机上运行脚本块。只是为了方便起见,该脚本块将从UNC路径运行脚本。