我正在尝试创建一个.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 文件的具体位置?
由于
答案 0 :(得分:3)
您在*.exe
,Ps1 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)