2016-11-08 7 views
0

Я пытаюсь создать файл .exe, который представляет собой упакованный скрипт powershell (script.ps1), в котором часть скрипта должна печатать текущее местоположение .exe file НЕ Сценарий.Найти полный путь сценария powershell, запущенного из EXE-обертки

Часть требование заключается в том, что .exe должен быть портативным:

Так что, когда я бегу file.exe или дважды щелкните file.exe:

Если расположение файла является C : \ Hello \ file.exe, он должен напечатать "C: \ Hello \"

Если место перемещается в D: \ Прощайте \ file.exe, он должен напечатать «D: \ До свидания \ "

Если файл копируется на D: \ ПРИВЕТ \ file.exe, он должен печатать только "D: \ ПРИВЕТ \"


Я попытался $PSScriptRoot но это только ссылки в папке временных


Какой код я могу добавить к script.ps1 перед упаковкой его как EXE-файл, чтобы сделать его для конкретного расположения .exe файл?

Благодаря

+2

Как вы создаете исполняемый и как он запускает скрипт PowerShell? – CodeCaster

+0

Я на самом деле использую инструмент, который компилирует его под названием PS1ToExe ... heres ссылка http://www.f2ko.de/en/p2e.php ... предоставлено Мне хотелось бы понять, как это сделать иначе ... но Я застрял на чем-то базовом, как это lol – AdilZ

+1

Это, наверное, плохая идея. Вы говорите, что он должен быть портативным, но PowerShell работает в среде .NET. Если на вашей целевой машине нет .Net, это не сработает. Если он имеет .Net, вам не нужна обертка .exe. Каждая версия Windows с Win 7/2008R2 поставляется с PowerShell 2.0 по умолчанию. В чем проблема, которую вы пытаетесь решить, упаковав скрипт в .exe? – briantist

ответ

3

инструмент вы используете, чтобы обернуть сценарий 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.

+0

Эй, так мой сценарий ВНУТРИ пакета exe, Я делаю ТОЛЬКО вторую половину, или верхнюю ПЛЮС вторую половину? – AdilZ

+1

Это либо один, либо другой; основанный на вашем комментарии к ответу Джонатана, это похоже на то, что вам нужен фрагмент _first_. – mklement0

+0

Спасибо, thats также дает мне временную папку, когда exe запускается lol – AdilZ

1

Я никогда не работал с упакованными сценариев PowerShell, но если двигатель PowerShell в настоящее время размещается в EXE упаковки сценарий, то что-то вроде этого следует сделать трюк:

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

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

Спасибо, но, к сожалению, точно так же, как $ PSScriptRoot, он все еще указывает на временную папку – AdilZ

+1

Ах, shacks. :-) –

+1

В отсутствие конкретной информации это стоило выстрела :) Обратите внимание, что чистый перевод PowerShell вашей команды намного более краток (хотя, вероятно, медленнее): '$ DirectoryContainingExe = Split-Path (Get-Process -ID $ PID) .Path'. – mklement0