Answers:
您的意思是您想要脚本自己的路径,以便可以引用脚本旁边的文件吗?试试这个:
$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实现类似的目的。
Push-Location
和Pop-Location
如果要调用本机应用程序,则无需担心[Environment]::CurrentDirectory
PowerShell的$PWD
当前目录。由于各种原因,PowerShell不会在设置位置或推送位置时设置进程的当前工作目录,因此,如果您正在运行希望对其进行设置的应用程序(或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
没有万无一失的选择。我们很多人把线在我们的提示功能设定[环境] :: currentDirectory所...但是,这并不能帮助你,当你改变位置中的脚本。
关于PowerShell无法自动设置的原因的两点说明:
$PWD
当前工作目录,但是只有一个进程,只有一个环境。$PWD
也不总是合法的CurrentDirectory(例如,您可以CD到注册表提供程序中)。如果要将其放入提示符(仅在主运行空间中运行,单线程),则需要使用:
[Environment]::CurrentDirectory = Get-Location -PSProvider FileSystem
.\_/.
-因为我半天丧命!人,认真吗?认真吗?..
[Environment]::CurrentDirectory
时不同于$PWD
。正确的做法是将其存储到变量中$origEnvDir = [Environment]::CurrentDirectory
,然后再将其还原[Environment]::CurrentDirectory = $origEnvDir
。
有很多票的答案,但是当我阅读您的问题时,我想您想知道脚本所在的目录,而不是脚本运行的目录。您可以使用powershell的自动变量获取信息
$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。
我经常使用以下代码导入与运行脚本位于同一目录下的模块。首先将获取运行powershell的目录
$ currentPath =分割路径((Get-Variable MyInvocation -Scope 0).Value).MyCommand.Path
导入模块“ $ currentPath \ sqlps.ps1”
好吧,一段时间以来,我一直在寻找解决方案,而没有来自CLI的任何脚本。这就是我做xD的方法:
导航到要从中运行脚本的文件夹(重要的是您具有制表符补全)
..\..\dir
现在将位置用双引号引起来,并在其中加上add cd
,以便我们可以调用另一个powershell实例。
"cd ..\..\dir"
添加另一个命令以运行脚本(由;
分隔),在Powershell中使用命令分隔符
"cd ..\..\dir\; script.ps1"
最后,使用另一个powershell实例运行它
start powershell "cd..\..\dir\; script.ps1"
这将打开新的powershell窗口,转到..\..\dir
,运行script.ps1
并关闭窗口。
注意 ”;” 只是将命令分开,就像您一个个地键入命令一样,如果第一个失败,第二个命令将运行,然后第二个命令运行,如果要保持打开新的Powershell窗口,则在传递的命令中添加-noexit。请注意,我首先导航到所需的文件夹,以便可以使用制表符补全(不能用双引号引起来)。
start powershell "-noexit cd..\..\dir\; script.ps1"
使用双引号,""
以便您可以传递名称中带有空格的目录,例如,
start powershell "-noexit cd '..\..\my dir'; script.ps1"
ant
使用一些参数调用的脚本。因此,我必须ant
从该文件夹中调用以确保它正确找到了配置文件。理想情况下,我正在寻找可以在该脚本中临时更改执行目录的内容。