我想调用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、函数、脚本文件或可操作程序的名称。检查名称的拼写,或者如果包含了路径,请验证路径是否正确,然后重试。


当前回答

MyScript1的当前路径。ps1和myScript2.ps1不一样。可以得到MyScript2的文件夹路径。并将其连接到MyScript1。然后执行它。两个脚本必须位于相同的位置。

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

其他回答

为了找到脚本的位置,使用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

一句话解决方案:

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

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

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

# Execute script at location:
&"$ScriptRoute"

如何在脚本中运行PowerShell内置脚本?

如何使用内置脚本

Get-Location
pwd
ls
dir
split-path
::etc...

它们由您的计算机运行,自动检查脚本的路径。

类似地,我可以通过在脚本块中放入脚本名来运行自定义脚本

::sid.ps1 is a PS script I made to find the SID of any user
::it takes one argument, that argument would be the username
echo $(sid.ps1 jowers)


(returns something like)> S-X-X-XXXXXXXX-XXXXXXXXXX-XXX-XXXX


$(sid.ps1 jowers).Replace("S","X")

(returns same as above but with X instead of S)

继续到powershell命令行并键入

> $profile

这将返回每次打开应用程序时PowerShell命令行将执行的文件的路径。

就像这样

C:\Users\jowers\OneDrive\Documents\WindowsPowerShell\Microsoft.PowerShellISE_profile.ps1

转到Documents,查看是否已经有WindowsPowerShell目录。我没有,所以

> cd \Users\jowers\Documents
> mkdir WindowsPowerShell
> cd WindowsPowerShell
> type file > Microsoft.PowerShellISE_profile.ps1

现在,我们已经创建了每次打开PowerShell应用程序时都会启动的脚本。

这样做的原因是,我们可以添加自己的文件夹,其中包含所有自定义脚本。让我们创建这个文件夹,我将其命名为“Bin”,以Mac/Linux保存脚本的目录命名。

> mkdir \Users\jowers\Bin

现在我们想要在每次打开应用程序时将该目录添加到$env:path变量中,因此返回到WindowsPowerShell目录并

> start Microsoft.PowerShellISE_profile.ps1

然后加上这个

$env:path += ";\Users\jowers\Bin"

现在,只要您将脚本保存在“Bin”目录中,shell就会自动找到您的命令。

重新启动powershell,它应该是第一个执行的脚本之一。

重新加载后在命令行上运行这个命令,在你的path变量中看到你的新目录:

> $env:Path

现在我们可以从命令行或从另一个脚本中调用脚本,简单如下:

$(customScript.ps1 arg1 arg2 ...)

如您所见,我们必须使用.ps1扩展名来调用它们,直到我们为它们创建别名。如果我们想变得更花哨。

我调用myScript1。来自myScript2的ps1。ps1。

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

$PSScriptRoot

然后,像这样追加你想调用的脚本名称:

& "$PSScriptRoot\myScript1.ps1"

这应该有用。