PowerShell:从脚本目录运行命令

我有一个使用脚本的当前目录做一些东西的PowerShell脚本。 因此,在该目录内运行.\script.ps1正常工作。

现在我想从另一个目录中调用该脚本,而不更改脚本的引用目录。 所以我想调用..\..\dir\script.ps1并且仍然希望这个脚本的行为和它在目录中被调用一样。

我该怎么做,或者如何修改一个脚本,使其可以从任何目录运行?

你的意思是你想要脚本自己的path,所以你可以引用脚本旁边的文件? 尝试这个:

 $scriptpath = $MyInvocation.MyCommand.Path $dir = Split-Path $scriptpath Write-host "My directory is $dir" 

您可以从$ MyInvocation及其属性中获取大量信息。

如果要在当前工作目录中引用文件,可以使用Resolve-Path或Get-ChildItem:

 $filepath = Resolve-Path "somefile.txt" 

编辑(基于来自OP的评论):

 # temporarily change to the correct folder Push-Location $folder # do stuff, call ant, etc # now back to previous directory Pop-Location 

使用Invoke-Command也可能有其他方法实现类似的function。

如果你调用的是原生应用程序,那么你需要担心[Environment]::CurrentDirectory而不是PowerShell的$PWD当前目录。 出于某种原因,逃脱了我, PowerShell不会设置当前的工作目录,当你设置位置或推送位置 ,所以你需要确保你这样做,如果你正在运行的应用程序(或cmdlet),希望它被设置。

在脚本中,你可以这样做:

 Push-Location $MyInvocation.MyCommand.Path [Environment]::CurrentDirectory = $PWD ## Your Script Code ... Pop-Location [Environment]::CurrentDirectory = $PWD 

有没有这样的万无一失的替代品。 我们中的许多人在我们的提示函数中设置了一行来设置[Environment] :: CurrentDirectory …但是当你改变脚本中的位置时,这并没有帮助你。

最后注意: $PWD并不总是一个合法的CurrentDirectory(例如,你可能把CD放入registry提供程序中),所以如果你想把它放到你的提示符或者* -Location cmdlet的包装函数中,你需要使用:

 [Environment]::CurrentDirectory = Get-Location -PSProvider FileSystem 

有大量的答案,但是当我读你的问题,我想你想知道脚本的目录,而不是脚本的运行。 你可以用powershell的自动variables来获取信息

 $PSScriptRoot - the directory where the script exists, not the target directory the script is running in $PSCommandPath - the full path of the script 

例如,我有$ profile脚本,findvisual studio解决scheme文件并启动它。 一旦解决scheme文件启动,我想存储完整的path。 但是我想保存原始脚本存在的文件。 所以我用$ PsScriptRoot。

我经常使用下面的代码导入与运行脚本位于同一目录下的模块。 它将首先获取从哪个PowerShell运行的目录

$ currentPath =拆分path((Get-Variable MyInvocation -Scope 0).Value).MyCommand.Path

导入模块“$ currentPath \ sqlps.ps1”

那么我一直在寻找这个解决scheme,没有任何脚本只是从CLI。 这是我如何做到这一点xD:

  • 导航到您要运行脚本的文件夹(重要的是您有选项卡完成)

    ..\..\dir

  • 现在用双引号环绕位置,并在里面添加cd ,所以我们可以调用powershell的另一个实例。

    "cd ..\..\dir"

  • 添加另一个命令来运行分隔符的脚本; 与在PowerShell中是一个命令分隔符

    "cd ..\..\dir\; script.ps1"

  • 最后用另一个PowerShell实例运行它

    start powershell "cd..\..\dir\; script.ps1"

这将打开新的PowerShell窗口,转到..\..\dir ,运行script.ps1并closures窗口。


注意 ”;” 只是分开的命令,就像你一个一个地input,如果第一次失败,第二次将运行,下一步之后,接下来…如果你想保持新的PowerShell窗口打开你添加-noexit在传递的命令。 请注意,我首先导航到所需的文件夹,所以我可以使用制表符完成(你不能在双引号)。

start powershell "-noexit cd..\..\dir\; script.ps1"

使用双引号""所以你可以通过名称中的空格目录例如,

start powershell "-noexit cd '..\..\my dir'; script.ps1"