我想调用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。来自myScript2的ps1。ps1。

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

$PSScriptRoot

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

& "$PSScriptRoot\myScript1.ps1"

这应该有用。

其他回答

I had a problem with this. I didn't use any clever $MyInvocation stuff to fix it though. If you open the ISE by right clicking a script file and selecting edit then open the second script from within the ISE you can invoke one from the other by just using the normal .\script.ps1 syntax. My guess is that the ISE has the notion of a current folder and opening it like this sets the current folder to the folder containing the scripts. When I invoke one script from another in normal use I just use .\script.ps1, IMO it's wrong to modify the script just to make it work in the ISE properly...

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

如何在脚本中运行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扩展名来调用它们,直到我们为它们创建别名。如果我们想变得更花哨。

这只是对答案的补充信息 为了将参数传递给另一个文件

哪里会有争论

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

如果你不提供任何输入,它将默认为“Joe”,这将作为参数传递到printName中的printName参数。ps1文件 它会反过来打印出“Joe”字符串

如果上面的变量为空,您可能正在使用PowerShell ISE。在这种情况下尝试:

如果(psISE美元) { Split-Path -Path $ ppse . currentfile . fullpath } 其他的 { 全球美元:PSScriptRoot }

看看这个讨论。