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"