Войти

Показать полную графическую версию : [решено] Проблема с относительным путём при запуске ярлыка на .ps1 от Админа


Carrio
20-03-2025, 19:54
Если нужно запускать файл скрипта PowerShell с помощью ярлыка на него в том же каталоге, то ярлык этот выглядит примерно так:
powershell.exe -ExecutionPolicy Bypass -NoExit -NoLogo -File ".\script.ps1"
где запись .\ говорит о том, что файл скрипта находится в одном каталоге с ярлыком и путь является относительным (т.е. каталог у них может быть какой угодно).

Проблема заключается в том, что всё это работает только при запуске от текущего пользователя. Если попробовать запустить данный ярлык от имени Администратора, то трюк с относительным путём уже не сработает и скрипт просто не запустится, т.к. в качестве пути будет использоваться не каталог запуска, а %SystemRoot%\System32.

Так как же должен выглядеть ярлык, чтобы в качестве текущего (относительного) пути использовался именно каталог запуска, вне зависимости от кого он запускается?

DJ Mogarych
20-03-2025, 22:52
Можно попробовать
$PSScriptRoot\script.ps1
https://learn.microsoft.com/ru-ru/powershell/module/microsoft.powershell.core/about/about_automatic_variables?view=powershell-7.5#psscriptroot

или
$PWD.path\script.ps1
https://learn.microsoft.com/ru-ru/powershell/module/microsoft.powershell.core/about/about_automatic_variables?view=powershell-7.5#pwd

YuS_2
21-03-2025, 10:53
Можно попробовать »
Это внутри скриптов будет работать, а до запуска скрипта, переменной не существует.

или »
а это текущий каталог, аналог в cmd %cd%
тоже не поможет...

Так как же должен выглядеть ярлык, чтобы в качестве текущего (относительного) пути использовался именно каталог запуска, вне зависимости от кого он запускается? »
Если очень требуется именно такой вариант запуска, то использовать лучше не ярлык, а батник...
run.bat:
@echo off
pushd %~dp0
powershell.exe -ExecutionPolicy Bypass -NoExit -NoLogo -File ".\script.ps1"
popd
либо указывать не относительный путь к скрипту, а абсолютный...

DJ Mogarych
21-03-2025, 19:43
Можно попробовать вот так, поиск в профиле пользователя нужного файла и его запуск прямо из ярлыка:


C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -c "powershell (dir "C:\Users\Vasya\*\script.ps1" -recurse).fullname"

Carrio
21-03-2025, 20:23
Если очень требуется именно такой вариант запуска, то использовать лучше не ярлык, а батник... »
Да, я тоже дошёл до этого решения. Пытался сначала запихнуть этот код в ярлык, но потом осознал, что %~dp0 там работать не будет. В общем, через батник тоже нормально, даже более универсально. Всё-равно, чтобы кликом мыши запустить скрипт PowerShell из файла понадобится 2 элемента (хоть с ярлыком, хоть с батником), как ни крути.

Можно попробовать вот так, поиск в профиле пользователя нужного файла и его запуск прямо из ярлыка: »
Так можно и до поиска по всем дискам дойти, скрипт то может быть в любом месте :)

DJ Mogarych
22-03-2025, 09:16
Так можно и до поиска по всем дискам дойти »
Да, но здесь нормального решения и не будет. Самое нормальное решение - это использовать абсолютные пути.
чтобы кликом мыши запустить скрипт PowerShell из файла понадобится 2 элемента »
Можно ПКМ -> Выполнить с помощью Powershell.

YuS_2
22-03-2025, 10:21
Всё-равно, чтобы кликом мыши запустить скрипт PowerShell из файла понадобится 2 элемента (хоть с ярлыком, хоть с батником), как ни крути. »
Необязательно. Можно внести ассоциации файлов и будет запуск скриптов кликом мыши... но это нерекомендуемое действие из соображений безопасности...

Carrio
22-03-2025, 11:53
Можно ПКМ -> Выполнить с помощью Powershell. »
Это всё-равно не удобно.
Тогда как с батником вообще красота: скрипт и батник в одном каком угодно каталоге, а уже ярлык на этот батник можно разместить хоть на панели задач и запускать всего ОДНИМ кликом мыши.

Необязательно. Можно внести ассоциации файлов и будет запуск скриптов кликом мыши... »
Там, вроде, есть проблемы с пробелами в пути до скрипта.
Плюс надо дать постоянное разрешение системе на запуск таких файлов, что небезопасно.

YuS_2
22-03-2025, 13:04
Там, вроде, есть проблемы с пробелами в пути до скрипта. »
Микрософт, такой микрософт :)

что небезопасно. »
естественно, это снижение безопасности о чем и написал... но js и vbs, например, являются исполняемыми скриптами, по умолчанию, батники - тоже сценарии... и ничего, о безопасности никто не парится.

Carrio
22-03-2025, 16:15
естественно, это снижение безопасности о чем и написал... но js и vbs, например, являются исполняемыми скриптами, по умолчанию, батники - тоже сценарии... и ничего, о безопасности никто не парится »
M$, такой M$ :)

Uragan66
23-03-2025, 15:14
Если очень требуется именно такой вариант запуска, то использовать лучше не ярлык, а батник... »
При необходимости запуская таким батником:
@echo off

set "ps=" & for %%X in (powerShell.exe) do set "ps=%%~$PATH:X"
if not defined ps set "ps=%systemRoot%\system32\windowsPowerShell\v1.0\powerShell.exe"

For /F "UseBackQ delims=" %%a in (`"cmd /c "
"%ps%" -ExecutionPolicy ByPass -NoProfile -command .\script.ps1
""`) do (
echo %%a
)
Но, как по мне, то проще скомпилировать исполняемый exe и запускать его с любой папки.

Carrio
25-03-2025, 21:54
Uragan66
Вот, кстати, про возможность создания экзешника совсем забыл. Тоже вариант, спасибо.

Carrio
26-03-2025, 19:37
Вспомнил, почему забыл про EXE. Антивирус может их блокировать. Причем сейчас ему пофиг, а через месяц может уже и нет. Не очень надёжно, в общем.




© OSzone.net 2001-2012