查找从 EXE 包装器启动的 powershell 脚本的完整路径

Find full path of a powershell script launched from an EXE wrapper

我正在尝试创建一个 .exe 文件,它是一个打包的 powershell 脚本 (script.ps1),其中脚本的一部分是打印 .exe 的当前位置文件 不是脚本。

部分要求是 .exe 需要可移植:

所以当我 运行 File.exe 或双击 File.exe:

如果文件的位置是 C:\Hello\File.exe ,它应该打印 "C:\Hello\"

如果位置移动到 D:\Goodbye\File.exe ,它应该打印 "D:\Goodbye\"

如果文件被复制到 D:\HELLO\File.exe ,它应该只打印 "D:\HELLO\"


我试过 $PSScriptRoot 但它只链接到一个临时文件夹


我可以在脚本中添加什么代码。ps1 在将其打包为 .exe 之前使其查找 .exe 文件的具体位置?

谢谢

您用来将 PowerShell 脚本包装在 *.exePs1 to Exe 中的工具在调用 *.exe 时执行以下操作:

  • 它将嵌入的脚本提取到子树 $env:TEMP 中的临时文件。

  • 它调用 PowerShell 可执行文件,并通过 -File 将临时脚本文件的路径与 -ExecutionPolicy Bypass 一起传递给它.

包装器调用的示例命令行 *.exe:

"powershell" -ExecutionPolicy Bypass -File C:\Users\jdoe\AppData\Local\Temp09.tmp0A.ps1

您因此需要检查 PowerShell 实例的 parent 进程 运行 您的脚本以获得有关 wrapper 的信息 *.exe.

# Get the parent process.
# (`gps` is a built-in alias of `Get-Process`)
$pp = gps -Id (Get-CimInstance win32_process -Filter "ProcessId = $PID").ParentProcessId

# Output the parent process executable's directory path:
Split-Path $pp.Path

注意:如果您仍在使用 PSv2,请使用 Get-WmiObject 而不是 Get-CimInstance

我从未使用过打包的 PowerShell 脚本,但如果 PowerShell 引擎由打包脚本的 EXE 托管,那么像这样的东西应该可以解决问题:

$FullPathToEXE = [System.Diagnostics.Process]::GetCurrentProcess().MainModule.FileName

$DirectoryContainingEXE = [System.IO.Path]::GetDirectoryName($FullPathToEXE)