如何获取PowerShell脚本的文件系统位置?

San*_*osh 61 powershell batch-file

我有一个PowerShell脚本D:\temp.

当我运行此脚本时,我希望列出该文件的当前位置.我该怎么做呢?

例如,此代码将在DOS批处理文件中完成; 我想将其转换为PowerShell脚本...

FOR /f "usebackq tokens=*" %%a IN ('%0') DO SET this_cmds_dir=%%~dpa
CD /d "%this_cmds_dir%"
Run Code Online (Sandbox Code Playgroud)

Rom*_*min 131

PowerShell 3+

正在运行的脚本的路径是:

$PSCommandPath
Run Code Online (Sandbox Code Playgroud)

它的目录是:

$PSScriptRoot
Run Code Online (Sandbox Code Playgroud)

PowerShell 2

正在运行的脚本的路径是:

$MyInvocation.MyCommand.Path
Run Code Online (Sandbox Code Playgroud)

它的目录是:

$PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent
Run Code Online (Sandbox Code Playgroud)

  • 那事发生了.如果您使用PowerShell 2并使用此技巧,请确保编写:`if(!$ PSScriptRoot){$ PSScriptRoot = Split-Path $ MyInvocation.MyCommand.Path -Parent}`以便它在PowerShell中"正常工作" 3 (18认同)
  • 值得注意的是:如果在PowerShell ISE中输入脚本控制台,或者仅执行脚本文件的选定部分,则$ PSScriptRoot和$ PSCommandPath将为空白.它在整个脚本运行时有效. (11认同)
  • 我相信Split-Path $脚本:MyInvocation.MyCommand.Path通常比Split-Path $ MyInvocation.MyCommand.Path -Parent更受欢迎.有关详细信息,请参阅此帖子:http://stackoverflow.com/questions/801967/how-can-i-find-the-source-path-of-an-executing-script (4认同)
  • 小心使用`$ PSSriptRoot`.它是模块中的预定义变量. (2认同)

ste*_*tej 10

Roman Kuzmin回答了这个问题.我只想补充说,如果你导入一个模块(via Import-Module),你可以访问$PsScriptRoot模块里面的自动变量 - 它会告诉你模块的位置.