我想调用myScript1的执行。第二个myScript2中的ps1脚本。Powershell ISE中的ps1脚本。
下面是MyScript2中的代码。ps1,从Powershell管理工作很好,但不工作在Powershell ISE:
#Call myScript1 from myScript2
invoke-expression -Command .\myScript1.ps1
当我执行MyScript2时,我得到了以下错误。ps1来自PowerShell ISE:
术语“。\myScript1.”Ps1’不能识别为cmdlet、函数、脚本文件或可操作程序的名称。检查名称的拼写,或者如果包含了路径,请验证路径是否正确,然后重试。
我也遇到过类似的问题,用这种方法解决了。
我的工作目录是一个通用脚本文件夹和几个特定的脚本文件夹在同一根,我需要调用特定的脚本文件夹(其中调用通用脚本与特定问题的参数)。
工作目录是这样的
\Nico\Scripts\Script1.ps1
\Script2.ps1
\Problem1\Solution1.ps1
\ParameterForSolution1.config
\Problem2\Solution2.ps1
\ParameterForSolution2.config
solution1和solution2调用Scripts文件夹中的PS1,加载存储在ParameterForSolution中的参数。
所以在powershell ISE中我运行这个命令
.\Nico\Problem1\Solution1.PS1
以及Solution1中的代码。PS1是:
# This is the path where my script is running
$path = split-path -parent $MyInvocation.MyCommand.Definition
# Change to root dir
cd "$path\..\.."
$script = ".\Script\Script1.PS1"
$parametro = "Problem1\ParameterForSolution1.config"
# Another set of parameter Script1.PS1 can receive for debuggin porpuose
$parametro +=' -verbose'
Invoke-Expression "$script $parametro"
我提出我的例子供考虑。这就是我如何在我制作的工具中调用控制器脚本中的一些代码。执行此工作的脚本也需要接受参数,因此本示例将展示如何传递参数。它假设被调用的脚本与控制器脚本(进行调用的脚本)在同一个目录中。
[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[string[]]
$Computername,
[Parameter(Mandatory = $true)]
[DateTime]
$StartTime,
[Parameter(Mandatory = $true)]
[DateTime]
$EndTime
)
$ZAEventLogDataSplat = @{
"Computername" = $Computername
"StartTime" = $StartTime
"EndTime" = $EndTime
}
& "$PSScriptRoot\Get-ZAEventLogData.ps1" @ZAEventLogDataSplat
上面是一个接受3个参数的控制器脚本。这些在参数块中定义。然后控制器脚本调用名为Get-ZAEventLogData.ps1的脚本。举例来说,这个脚本也接受相同的3个参数。当控制器脚本调用执行该工作的脚本时,它需要调用该脚本并传递参数。上面展示了我如何通过飞溅来做到这一点。
为了找到脚本的位置,使用Split-Path $MyInvocation.MyCommand。路径(确保在脚本上下文中使用该路径)。
您应该使用它而不是其他任何东西的原因可以通过这个示例脚本来说明。
## ScriptTest.ps1
Write-Host "InvocationName:" $MyInvocation.InvocationName
Write-Host "Path:" $MyInvocation.MyCommand.Path
以下是一些结果。
PS C:\Users\JasonAr> .\ScriptTest.ps1
InvocationName: .\ScriptTest.ps1
Path: C:\Users\JasonAr\ScriptTest.ps1
PS C:\Users\JasonAr> . .\ScriptTest.ps1
InvocationName: .
Path: C:\Users\JasonAr\ScriptTest.ps1
PS C:\Users\JasonAr> & ".\ScriptTest.ps1"
InvocationName: &
Path: C:\Users\JasonAr\ScriptTest.ps1
在PowerShell 3.0及以后版本中,您可以使用自动变量$PSScriptRoot:
## ScriptTest.ps1
Write-Host "Script:" $PSCommandPath
Write-Host "Path:" $PSScriptRoot
PS C:\Users\jarcher> .\ScriptTest.ps1
Script: C:\Users\jarcher\ScriptTest.ps1
Path: C:\Users\jarcher