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

Nic*_*nto 121 powershell

我希望在Powershell ISE内的第二个myScript2.ps1脚本中调用myScript1.ps1脚本.

MyScript2.ps1中的以下代码在Powershell Administration中运行良好,但在PowerShell ISE中不起作用:

#Call myScript1 from myScript2
invoke-expression -Command .\myScript1.ps1
Run Code Online (Sandbox Code Playgroud)

从PowerShell ISE执行MyScript2.ps1时出现以下错误:

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

Jas*_*her 79

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

您可以使用此示例脚本说明您应该使用它而不是其他任何内容的原因.

## ScriptTest.ps1
Write-Host "InvocationName:" $MyInvocation.InvocationName
Write-Host "Path:" $MyInvocation.MyCommand.Path
Run Code Online (Sandbox Code Playgroud)

这是一些结果.

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
Run Code Online (Sandbox Code Playgroud)
PS C:\Users\jarcher> .\ScriptTest.ps1
Script: C:\Users\jarcher\ScriptTest.ps1
Path: C:\Users\jarcher

  • 在答案中看到一个使用Split-Path的示例会很好.您还需要显示在另一个脚本中调用脚本. (12认同)
  • 这绝对不是所问问题的答案。您只是解释如何找到当前正在执行的脚本的路径,而问题是如何在当前正在执行的脚本中执行单独的脚本。令人困惑的是,这个帖子已经被点赞了 100 多次…… (4认同)

Sha*_*evy 33

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

## MyScript2.ps1 ##
$ScriptPath = Split-Path $MyInvocation.InvocationName
& "$ScriptPath\MyScript1.ps1"
Run Code Online (Sandbox Code Playgroud)

  • 你需要使用`$ MyInvocation.MyCommand.Path`. (4认同)

Sri*_*osh 23

我从myScript2.ps1调用myScript1.ps1.

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

$PSScriptRoot
Run Code Online (Sandbox Code Playgroud)

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

& "$PSScriptRoot\myScript1.ps1"
Run Code Online (Sandbox Code Playgroud)

这应该工作.

  • @GregorSimončič 仅当变量不包含空白字符时。如果变量包含空格,则未加引号的命令可能会由于将命令“拆分”为两部分而引入语法错误。保留引号是最安全的方法。 (10认同)
  • `& $PSScriptRoot\myScript1.ps1` 就足够了(不带引号) (3认同)
  • `&“ $ PSScriptRoot \ myScript1.ps1”就足够了 (2认同)

noe*_*cus 17

一线解决方案:

& ((Split-Path $MyInvocation.InvocationName) + "\MyScript1.ps1")
Run Code Online (Sandbox Code Playgroud)

  • 那是使用当前目录而不是脚本目录。当然他们经常是相同的...但并非总是如此! (3认同)

Rrr*_*Rrr 9

要轻松执行与调用者相同的文件夹(或子文件夹)中的脚本文件,您可以使用以下命令:

# Get full path to the script:
$ScriptRoute = [System.IO.Path]::GetFullPath([System.IO.Path]::Combine($PSScriptRoot, "Scriptname.ps1"))

# Execute script at location:
&"$ScriptRoute"
Run Code Online (Sandbox Code Playgroud)


cpo*_*ign 6

这只是答案的附加信息,以便将参数传递到另一个文件中

你在哪里争论

PrintName.ps1

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


Write-Host $printName
Run Code Online (Sandbox Code Playgroud)

如何调用文件

Param(
    [Parameter( Mandatory = $false)]
    $name = "Joe"    
)


& ((Split-Path $MyInvocation.InvocationName) + "\PrintName.ps1") -printName $name
Run Code Online (Sandbox Code Playgroud)

如果不提供任何输入,它将默认为“ Joe”,并将作为参数传递给PrintName.ps1文件中的printName参数,文件将依次打印出“ Joe”字符串


小智 5

您可能已经找到了答案,但这就是我所做的。

我通常将此行放在安装脚本的开头:

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

然后我可以使用 $PSScriptRoot 变量作为当前脚本(路径)的位置,如下例所示:

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)
Run Code Online (Sandbox Code Playgroud)

对于你的情况,你可以替换

启动进程... 符合

调用表达式 $PSScriptRoot\ScriptName.ps1

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