无法使用另一个 powershell 文件中的函数
Not able to use a function from another powershell file
我在 main.ps1 file
中导入另一个文件 $dirpath\new.ps1
,如下所示:
Import-module $dirpath\new.ps1 -force -ErrorAction SilentlyContinue -WarningAction SilentlyContinue
try {
$getval = invoke-command -cn $host -Credential $cred -ScriptBlock {
param($name)
get-myfunc $name
} -ArgumentList $name
} catch {
...
}
main.ps1 file
和 new.ps1
都存在于同一目录下 - $dirpath.
new.ps1
如下所示:
Function global:get-myfunc{
PARAM(
[Parameter(Mandatory=$true,Position=0)][STRING]$name
)
write-host "$name"
}
现在,main.ps1 file
抛出以下错误:
+ $getval = invoke-command -cn $host -Credential $cred -S ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (get-myfunc:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
我尝试将 new.ps1
重命名为 new.psm1
,然后将模块导入为 Import-module $dirpath\new.psm1
,但它仍然失败并出现相同的错误。
我正在使用 poweshell 5
第一期
new.ps1
文件不是模块,只是一个常规脚本,因此您不能t/shouldn不能为此使用 Import-Module
。
模块不仅仅是具有不同扩展名的脚本。有关详细信息,请参阅:
如果您想保留当前设置,dot source 脚本,方法是将 Import-Module
行替换为:
. $dirpath\new.ps1
这将执行脚本并在当前范围内定义函数。
如果脚本与调用脚本位于同一文件夹中,您可以使用 $PSScriptRoot
:
进一步简化语句
. $PSScriptRoot\new.ps1
第二期
Invoke-Command
表示您是 运行 不同主机上的脚本块,这意味着它使用不同的范围。这就是它找不到 get-myfunc
函数的原因。
将您的声明修改为:
Invoke-Command
-ComputerName $host `
-Credential $cred `
-ScriptBlock ${Function:get-myfunc} `
-ArgumentList $name
那行不通,因为您正在将该模块导入本地计算机。但是,下面的命令正在远程机器上执行。这意味着您需要在远程机器上安装该模块,然后您可以在远程机器上使用该模块。
$getval = invoke-command -cn $host -Credential $cred -ScriptBlock {
参数($名称)
get-myfunc $名字
请按照下面link解决
我在 main.ps1 file
中导入另一个文件 $dirpath\new.ps1
,如下所示:
Import-module $dirpath\new.ps1 -force -ErrorAction SilentlyContinue -WarningAction SilentlyContinue
try {
$getval = invoke-command -cn $host -Credential $cred -ScriptBlock {
param($name)
get-myfunc $name
} -ArgumentList $name
} catch {
...
}
main.ps1 file
和 new.ps1
都存在于同一目录下 - $dirpath.
new.ps1
如下所示:
Function global:get-myfunc{
PARAM(
[Parameter(Mandatory=$true,Position=0)][STRING]$name
)
write-host "$name"
}
现在,main.ps1 file
抛出以下错误:
+ $getval = invoke-command -cn $host -Credential $cred -S ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (get-myfunc:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
我尝试将 new.ps1
重命名为 new.psm1
,然后将模块导入为 Import-module $dirpath\new.psm1
,但它仍然失败并出现相同的错误。
我正在使用 poweshell 5
第一期
new.ps1
文件不是模块,只是一个常规脚本,因此您不能t/shouldn不能为此使用 Import-Module
。
模块不仅仅是具有不同扩展名的脚本。有关详细信息,请参阅:
如果您想保留当前设置,dot source 脚本,方法是将 Import-Module
行替换为:
. $dirpath\new.ps1
这将执行脚本并在当前范围内定义函数。
如果脚本与调用脚本位于同一文件夹中,您可以使用 $PSScriptRoot
:
. $PSScriptRoot\new.ps1
第二期
Invoke-Command
表示您是 运行 不同主机上的脚本块,这意味着它使用不同的范围。这就是它找不到 get-myfunc
函数的原因。
将您的声明修改为:
Invoke-Command
-ComputerName $host `
-Credential $cred `
-ScriptBlock ${Function:get-myfunc} `
-ArgumentList $name
那行不通,因为您正在将该模块导入本地计算机。但是,下面的命令正在远程机器上执行。这意味着您需要在远程机器上安装该模块,然后您可以在远程机器上使用该模块。
$getval = invoke-command -cn $host -Credential $cred -ScriptBlock {
参数($名称)
get-myfunc $名字
请按照下面link解决