Windows 查找从EXE包装启动的powershell脚本的完整路径
我正在尝试创建一个.exe文件,该文件是打包的powershell脚本(script.ps1),其中脚本的一部分是打印.exe文件的当前位置,而不是打印脚本 部分要求是.exe需要可移植: 因此,当我运行File.exe或双击File.exe时: 如果文件的位置是C:\Hello\file.exe,它应该打印“C:\Hello\” 如果该位置移动到D:\bye\File.exe,则应打印“D:\bye\” 如果文件被复制到D:\HELLO\file.exe,它应该只打印“D:\HELLO\”Windows 查找从EXE包装启动的powershell脚本的完整路径,windows,powershell,exe,filepath,Windows,Powershell,Exe,Filepath,我正在尝试创建一个.exe文件,该文件是打包的powershell脚本(script.ps1),其中脚本的一部分是打印.exe文件的当前位置,而不是打印脚本 部分要求是.exe需要可移植: 因此,当我运行File.exe或双击File.exe时: 如果文件的位置是C:\Hello\file.exe,它应该打印“C:\Hello\” 如果该位置移动到D:\bye\File.exe,则应打印“D:\bye\” 如果文件被复制到D:\HELLO\file.exe,它应该只打印“D:\HELLO\”
我尝试了
$PSScriptRoot
,但只链接到临时文件夹
在将script.ps1打包为.exe以使其查找.exe文件的特定位置之前,我可以向其添加哪些代码
感谢您用来将PowerShell脚本包装在
*.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
的信息
注意:如果您仍在PSv2上,请使用
获取WmiObject
而不是获取CimInstance
将PowerShell脚本包装在*.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
的信息
注意:如果您仍在PSv2上,请使用
获取WmiObject
而不是获取CimInstance
我从未使用过打包的PowerShell脚本,但是如果PowerShell引擎由打包脚本的EXE托管,那么类似这样的操作应该可以实现以下目的:
$FullPathToEXE = [System.Diagnostics.Process]::GetCurrentProcess().MainModule.FileName
$DirectoryContainingEXE = [System.IO.Path]::GetDirectoryName($FullPathToEXE)
我从未使用过打包的PowerShell脚本,但如果PowerShell引擎由打包脚本的EXE托管,那么类似这样的操作应该可以实现以下目的:
$FullPathToEXE = [System.Diagnostics.Process]::GetCurrentProcess().MainModule.FileName
$DirectoryContainingEXE = [System.IO.Path]::GetDirectoryName($FullPathToEXE)
您如何创建可执行文件以及它如何运行PowerShell脚本?这可能是个坏主意。您说它必须是可移植的,但PowerShell是在.Net framework上运行的。如果您的目标计算机没有.Net,它将无法工作。如果它有.Net,则不需要.exe包装。默认情况下,Win 7/2008R2之后的每个Windows版本都至少附带PowerShell 2.0。通过将脚本打包到.exe中,您试图解决的问题是什么?@briantist:好的观点,但我认为OP在本例中所指的“可移植”仅仅是将可执行文件放在任何目录中并使其正常工作的能力。此工具生成的
*.exe
包装器允许调用嵌入式PowerShell脚本,而不考虑有效的PS安全策略,因此提供一种更简单的方法来运行脚本可能是动机所在。@mklement0是的,但是,调用powershell.exe-ExecutionPolicy
@AdilZia的单行批处理文件也可以实现同样的效果。实际上,您可以查看中发布的示例包装器命令。这是包装器正在做什么的推测(调用powershell.exe
)。相反,如果您在批处理文件中放了一行类似的代码来调用.ps1
,那么您可以在脚本中使用$PSScriptRoot
。在批处理文件中,您可以使用%~f0\myScript.ps1
引用与批处理文件路径相同的文件。您如何创建可执行文件以及它如何运行PowerShell脚本?这可能是个坏主意。您说它必须是可移植的,但PowerShell是在.Net framework上运行的。如果您的目标计算机没有.Net,它将无法工作。如果它有.Net,则不需要.exe包装。默认情况下,Win 7/2008R2之后的每个Windows版本都至少附带PowerShell 2.0。通过将脚本打包到.exe中,您试图解决的问题是什么?@briantist:好的观点,但我认为OP在本例中所指的“可移植”仅仅是将可执行文件放在任何目录中并使其正常工作的能力。此工具生成的*.exe
包装器允许调用嵌入式PowerShell脚本,而不考虑有效的PS安全策略,因此提供一种更简单的方法来运行脚本可能是动机所在。@mklement0是的,但是,调用powershell.exe-ExecutionPolicy
@AdilZia的单行批处理文件也可以实现同样的效果。实际上,您可以查看中发布的示例包装器命令。这是包装器正在做什么的推测(调用powershell.exe
)。相反,如果您在批处理文件中放了一行类似的代码来调用.ps1
,那么您可以在脚本中使用$PSScriptRoot
。在批处理文件中,可以使用%~f0\myScript.ps1
引用与批处理文件路径相同的文件。啊,见鬼了。:-)在缺乏具体信息的情况下,值得一试:)请注意,纯PowerShell translatio