我有一个位于D:\temp
的PowerShell脚本。
当我运行这个脚本时,我想要列出该文件的当前位置。我该怎么做?
例如,下面的代码可以在DOS批处理文件中完成此操作; 我正在尝试将其转换为PowerShell脚本...
FOR /f "usebackq tokens=*" %%a IN ('%0') DO SET this_cmds_dir=%%~dpa
CD /d "%this_cmds_dir%"
我有一个位于D:\temp
的PowerShell脚本。
当我运行这个脚本时,我想要列出该文件的当前位置。我该怎么做?
例如,下面的代码可以在DOS批处理文件中完成此操作; 我正在尝试将其转换为PowerShell脚本...
FOR /f "usebackq tokens=*" %%a IN ('%0') DO SET this_cmds_dir=%%~dpa
CD /d "%this_cmds_dir%"
PowerShell 3+
正在运行脚本的路径为:
$PSCommandPath
它的目录是:
$PSScriptRoot
PowerShell 2
正在运行脚本的路径为:
$MyInvocation.MyCommand.Path
它的目录是:
$PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent
$PSScriptRoot
。它是模块内的预定义变量。 - Keith Hillif(!$PSScriptRoot){ $PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent }
,这样它才能在 PowerShell 3 中“正常工作”。 - JaykulRoman Kuzmin给出了他的看法。我想补充一下,如果你通过Import-Module
导入一个模块,那么你可以在模块内访问$PsScriptRoot
自动变量--它会告诉你模块所在的位置。
就我个人而言,我发现这在PowerShell V5中对于脚本和PowerShell ISE都适用:
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"
希望有所帮助
附带完整的错误处理。根据您的需求进行调整。
这里有一个例子:
$ScriptRoot = ($ScriptRoot, "$PSScriptRoot" -ne $null)[0]
import-module $ScriptRoot\modules\sql-provider.psm1
Import-Module $ScriptRoot\modules\AD-lib.psm1 -Force
CD /D“%〜dp0”
来完成。 - lit