我正在尝试创建一个 .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
但它只链接到一个临时文件夹
在将 script.ps1 打包为 .exe 之前,我可以添加什么代码以使其查找 .exe 文件的特定位置?
谢谢
最佳答案
用于将 PowerShell 脚本包装在 *.exe
中的工具, Ps1 to Exe , 当 *.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
.
关于windows - 查找从 EXE 包装器启动的 powershell 脚本的完整路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40496958/