.\script.ps1
可以正常工作。现在我想从不同的目录调用该脚本,而不改变脚本的引用目录。所以我想调用
..\..\dir\script.ps1
,并且仍然希望该脚本像在其目录中调用时一样工作。我应该如何实现这一点?或者我应该如何修改脚本才能在任何目录中运行?
.\script.ps1
可以正常工作。..\..\dir\script.ps1
,并且仍然希望该脚本像在其目录中调用时一样工作。您的意思是您希望获得脚本自身的路径,以便您可以引用脚本旁边的文件吗?请尝试这个:
$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 $dir
# do stuff, call ant, etc
# now back to previous directory
Pop-Location
也许还有其他使用Invoke-Command实现类似功能的方法。
$PSScriptRoot # the directory where the script exists, not the
# target directory the script is running in
$PSCommandPath # the full path of the script
$profile
的脚本,它会找到一个Visual Studio解决方案文件并启动它。我想要在启动解决方案文件后保存完整路径。但是我想要将文件保存在原始脚本所在的位置。所以我使用了$PsScriptRoot
。[Environment]::CurrentDirectory
而不是PowerShell中的$PWD
当前目录。由于各种原因,PowerShell在Set-Location或Push-Location时不会设置进程的当前工作目录,因此,如果您运行期望其设置为当前目录的应用程序(或cmdlet),则需要确保您进行设置。$CWD = [Environment]::CurrentDirectory
Push-Location $MyInvocation.MyCommand.Path
[Environment]::CurrentDirectory = $PWD
## Your script code calling a native executable
Pop-Location
# Consider whether you really want to set it back:
# What if another runspace has set it in-between calls?
[Environment]::CurrentDirectory = $CWD
没有绝对可靠的替代方法。我们中的许多人在提示函数中放置一条线来设置 [Environment]::CurrentDirectory ... 但是当您在脚本内更改位置时,这并不能帮助您。
关于 PowerShell 自动不设置它的原因,有两点需要注意:
如果您想将它放到提示符中(仅在主运行空间,单线程中运行),则需要使用:
[Environment]::CurrentDirectory = Get-Location -PSProvider FileSystem
.\_/.
—— 因为这浪费了我半天的时间!人们,认真点?真的?.. - ulidtko[Environment]::CurrentDirectory
,当它与 $PWD
不同时。正确的做法是将其存储到变量 $origEnvDir = [Environment]::CurrentDirectory
中,然后稍后恢复 [Environment]::CurrentDirectory = $origEnvDir
。 - Strom这将很好地发挥作用。
Push-Location $PSScriptRoot
Write-Host CurrentDirectory $CurDir
Pop-Location
,以将路径恢复到其原始状态。 - Lam Le我经常使用以下代码来导入与运行脚本相同目录下的模块。它将首先获取 PowerShell 正在运行的目录:
$currentPath=Split-Path ((Get-Variable MyInvocation -Scope 0).Value).MyCommand.Path
import-module "$currentPath\sqlps.ps1"
我将@ JohnL的解决方案压缩成了一行代码:
$MyInvocation.MyCommand.Path | Split-Path | Push-Location
我曾经寻找了一段时间的解决方案,想要在CLI中实现而不需要任何脚本。这是我的做法 xD:
导航到你想要运行脚本的文件夹(重要的是你可以使用制表符补全)
..\..\dir
现在将位置用双引号括起来,在引号内添加cd
,这样我们就可以调用另一个powershell实例。
"cd ..\..\dir"
添加另一个命令来运行脚本,用;
分隔,它是powershell中的命令分隔符
"cd ..\..\dir\; script.ps1"
最后用另一个powershell实例运行它
start powershell "cd..\..\dir\; script.ps1"
这将打开一个新的powershell窗口,进入..\..\dir
,运行script.ps1
并关闭窗口。
start powershell "-noexit cd '..\..\my dir'; script.ps1"
ant
的脚本。所以我必须从那个文件夹中调用ant
,以确保它能正确找到配置文件。理想情况下,我正在寻找临时更改脚本内部执行目录的方法。 - pokePush-Location
和Pop-Location
。 - JohnL$MyInvocation.MyCommand.Path | Split-Path | Push-Location
- sashoalm