Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 查找从EXE包装启动的powershell脚本的完整路径_Windows_Powershell_Exe_Filepath - Fatal编程技术网

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

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\”

我正在尝试创建一个.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