我有一个位于D:\temp
的PowerShell脚本。
当我运行此脚本时,我希望列出该文件的当前位置。我该怎么做?
例如,此代码将在DOS批处理文件中完成;我正在尝试将其转换为PowerShell脚本......
FOR /f "usebackq tokens=*" %%a IN ('%0') DO SET this_cmds_dir=%%~dpa
CD /d "%this_cmds_dir%"
答案 0 :(得分:123)
PowerShell 3 +
正在运行的脚本的路径是:
$PSCommandPath
其目录是:
$PSScriptRoot
PowerShell 2
正在运行的脚本的路径是:
$MyInvocation.MyCommand.Path
其目录是:
$PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent
答案 1 :(得分:10)
Roman Kuzmin回答了这个问题。我只想补充一点,如果你导入一个模块(通过Import-Module
),你可以在模块中访问$PsScriptRoot
自动变量 - 它将告诉你模块的位置。
答案 2 :(得分:0)
对于它的价值,我发现这对我在脚本和PowerShell ISE中的PowerShell V5上都有效:
try {
$scriptPath = $PSScriptRoot
if (!$scriptPath)
{
if ($psISE)
{
$scriptPath = Split-Path -Parent -Path $psISE.CurrentFile.FullPath
} else {
Write-Host -ForegroundColor Red "Cannot resolve script file's path"
exit 1
}
}
} catch {
Write-Host -ForegroundColor Red "Caught Exception: $($Error[0].Exception.Message)"
exit 2
}
Write-Host "Path: $scriptPath"
HTH
P.S。包括完整的错误处理。相应地调整您的需求。
答案 3 :(得分:0)
这里是一个例子:
$ScriptRoot = ($ScriptRoot, "$PSScriptRoot" -ne $null)[0]
import-module $ScriptRoot\modules\sql-provider.psm1
Import-Module $ScriptRoot\modules\AD-lib.psm1 -Force