我有一组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
这也允许将参数传递给脚本。
答案 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路径运行脚本。