我有一个正在运行的主脚本。它的作用是通过一个填充了其他PowerShell脚本的目录读取,dot包含所有这些脚本并运行预定义的方法,每个方法由点分隔文件名的第一部分组成。例如:
在sub.ps1中也定义了函数'sayomething'。实现in'dosub'是对'sayomething'的调用。
我的问题是我一直收到错误:
术语“sayomething”未被识别为cmdlet的名称, 功能,脚本文件或可操作程序。检查拼写 名称,或者如果包含路径,请验证路径是否正确 再试一次。
为什么'dosub'方法找不到同一文件中定义的'sayomething'方法?
master.ps1:
$handlersDir = "handlers"
$handlers = @(Get-ChildItem $handlersDir)
foreach ( $handler in $handlers ) {
. .\$handlersDir\$handler
$fnParts = $handler.Name.split(".")
$exp = "do" + $fnParts[0]
Invoke-Expression $exp
}
sub.ps1:
function saysomething() {
Write-Host "I'm here to say something!"
}
function dosub() {
saysomething
Write-Host "In dosub!"
}
答案 0 :(得分:0)
您的代码适用于我的系统。但是你可以稍微简化一下:
$handlersDir = "handlers"
$handlers = @(Get-ChildItem $handlersDir)
foreach ( $handler in $handlers )
{
. .\$handlersDir\$handler
$exp = "do" + $handler.BaseName
Write-Host "Calling $exp"
& $exp
}
请注意BaseName
属性的可用性。您也不需要使用Invoke-Expression
。您可以通过调用(&
)运算符来调用命名命令。
答案 1 :(得分:0)
您提供的内容可根据需要进行操作。您可能没有在您的计算机上正确的目录等。或者您正在运行其他内容并在此处发布不同的(工作!)代码。
您还可以进行以下更正:
. .\$handlersDir\$handler
而不是上面你可以这样做:
. $handler.fullname
而是可以分割文件名:
$exp = "do" + $handler.basename