从PowerShell ISE中的另一个PS1脚本调用powershell脚本PS1

我想要在PowerShell ISE内部的第二个myScript2.ps1脚本中调用myScript1.ps1脚本。

下面的代码MyScript2.ps1,从Powershellpipe理工作正常,但不能在PowerShell ISE内工作:

#Call myScript1 from myScript2 invoke-expression -Command .\myScript1.ps1 

从PowerShell ISE执行MyScript2.ps1时,我得到以下错误:

术语'。\ myScript1.ps1'不被识别为cmdlet,函数,脚本文件或可操作程序的名称。 检查名称的拼写,或者如果包含path,请validationpath是否正确,然后重试。

谁能帮我?

为了find脚本的位置,使用Split-Path $MyInvocation.MyCommand.Path (确保在脚本上下文中使用它)。

这个例子脚本可以说明你应该使用这个而不是其他任何东西的原因。

 ## 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 

MyScript1.ps1的当前path与myScript2.ps1不同。 您可以获取MyScript2.ps1的文件夹path,并将其连接到MyScript1.ps1,然后执行它。 这两个脚本必须在相同的位置。

 ## MyScript2.ps1 ## $ScriptPath = Split-Path $MyInvocation.InvocationName & "$ScriptPath\MyScript1.ps1" 

一行解决scheme:

 & ((Split-Path $MyInvocation.InvocationName) + "\MyScript1.ps1") 

我有这个问题。 我没有使用任何聪明的$MyInvocation东西来解决这个问题。 如果通过右键单击脚本文件并selectedit打开ISE,则可以从ISE中打开第二个脚本,只需使用普通的。\ script.ps1语法就可以调用另一个脚本。 我的猜测是,ISE有一个当前文件夹的概念,并打开它像这样将当前文件夹设置为包含脚本的文件夹。 当我正常使用从另一个脚本调用一个脚本时,我只是使用。\ script.ps1 ,IMO修改脚本以使其在ISE中正常工作是错误的。

这只是为了将parameter passing到另一个文件的附加信息

你期望的论据

PrintName.ps1

 Param( [Parameter( Mandatory = $true)] $printName = "Joe" ) Write-Host $printName 

如何调用该文件

 Param( [Parameter( Mandatory = $false)] $name = "Joe" ) & ((Split-Path $MyInvocation.InvocationName) + "\PrintName.ps1") -printName $name 

如果你不提供任何input,它将默认为“Joe”,这将作为parameter passing到PrintName.ps1文件中的printName参数中,然后打印出“Joe”string

你可能已经find了答案,但这是我做的。

我通常在我的安装脚本的开头放置这一行:

 if(!$PSScriptRoot){ $PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent } #In case if $PSScriptRoot is empty (version of powershell V.2). 

然后,我可以使用$ PSScriptRootvariables作为当前脚本(path)的位置,如下面的示例所示:

 if(!$PSScriptRoot){ $PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent } #In case if $PSScriptRoot is empty (version of powershell V.2). Try { If (Test-Path 'C:\Program Files (x86)') { $ChromeInstallArgs= "/i", "$PSScriptRoot\googlechromestandaloneenterprise64_v.57.0.2987.110.msi", "/q", "/norestart", "/L*v `"C:\Windows\Logs\Google_Chrome_57.0.2987.110_Install_x64.log`"" Start-Process -FilePath msiexec -ArgumentList $ChromeInstallArgs -Wait -ErrorAction Stop $Result= [System.Environment]::ExitCode } Else { $ChromeInstallArgs= "/i", "$PSScriptRoot\googlechromestandaloneenterprise_v.57.0.2987.110.msi", "/q", "/norestart", "/L*v `"C:\Windows\Logs\Google_Chrome_57.0.2987.110_Install_x86.log`"" Start-Process -FilePath msiexec -ArgumentList $ChromeInstallArgs -Wait -ErrorAction Stop $Result= [System.Environment]::ExitCode } } ### End Try block Catch { $Result = [System.Environment]::Exitcode [System.Environment]::Exit($Result) } [System.Environment]::Exit($Result) 

在你的情况下,你可以replace

开始进程…一致

Invoke-Expression $ PSScriptRoot \ ScriptName.ps1

您可以在Microsoft网站上阅读有关$ MYINVOCATION和$ PSScriptRoot自动variables的更多信息: https ://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.core/about/about_automatic_variables

我从myScript2.ps1调用myScript1.ps1。

假设两个脚本都在同一位置,首先使用以下命令获取脚本的位置:

 $PSScriptRoot 

然后,添加您想要调用的脚本名称,如下所示:

 & "$PSScriptRoot\myScript1.ps1". 

这应该工作。

我有类似的问题,并通过这种方式解决。

我的工作目录是一个通用的脚本文件夹和特定的脚本文件夹在同一根,我需要调用特定的脚本文件夹(这与特定问题的参数调用通用脚本)。 所以工作目录就是这样

 \Nico\Scripts\Script1.ps1 \Script2.ps1 \Problem1\Solution1.ps1 \ParameterForSolution1.config \Problem2\Solution2.ps1 \ParameterForSolution2.config 

Solutions1和Solutions2在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"