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

时间:2016-11-08 21:44:05

标签: windows powershell exe filepath

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

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

因此,当我运行File.exe或双击File.exe:

如果文件的位置是 C:\ Hello \ File.exe ,则应打印&#34; C:\ Hello \&#34; < / p>

如果该位置移至 D:\ Goodbye \ File.exe ,则应打印&#34; D:\ Goodbye \&#34;

如果该文件已复制到 D:\ HELLO \ File.exe ,则只能打印&#34; D:\ HELLO \&#34;

我尝试了$PSScriptRoot,但只链接到临时文件夹

在将其打包为.exe之前,我可以将哪些代码添加到script.ps1中,以使其查找 .exe 文件的具体位置?

由于

2 个答案:

答案 0 :(得分:3)

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

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

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

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

"powershell" -ExecutionPolicy Bypass -File C:\Users\jdoe\AppData\Local\Temp\2409.tmp\240A.ps1

因此,您需要检查运行脚本的PowerShell实例的进程,以获取有关包装器*.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

答案 1 :(得分:1)

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

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

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