PowerShell - Восстановление каталога расположения скрипта при запуске от имени администратора. - PullRequest
1 голос
/ 30 января 2020

Моя ситуация: Я должен запустить скрипт PowerShell от имени администратора (из-за доступа к привилегированной папке), и мой скрипт также ссылается на файлы в том же каталоге, что и скрипт. Мне нужно использовать относительный путь к файлу, но я не могу из-за PowerShell переключить каталог на C:\WINDOWS\system32 при запуске от имени администратора.

В PowerShell есть ли способ восстановить каталог в текущий каталог, в котором находится скрипт?

Мой сценарий: (будет работать от имени администратора)

Copy-Item -Path .\file1.txt -Destination 'C:\Users\privileged_folder'

Структура каталогов:

MyDir\
    file1.txt
    myscript.ps1 <- ran as admin

1 Ответ

2 голосов
/ 30 января 2020

Путем изменения местоположения

В своем скрипте вы можете указать местоположение для папки скрипта. Внутри вашего скрипта будет работать любой из следующих методов:

# PowerShell 3+
cd $PSScriptRoot

# PowerShell 2
cd ( Split-Path -Parent $MyInvocation.MyCommand.Definition )

Изменение на $PSScriptRoot работает во всех поддерживаемых в настоящее время версиях PowerShell, но с использованием Split-Path для получения Каталог скриптов полезен, если у вас по какой-то причине все еще есть узлы, на которых работает PowerShell 2.


Если вы хотите вернуться к предыдущему каталогу после того, как ваш скрипт завершил выполнение (вероятно, хороший ход), вы также можете использовать Push-Location и Pop-Location вместо cd или Set-Location:

# Also aliased to pushd
Push-Location $PSScriptRoot

# My script stuff

# Also aliased to popd
Pop-Location

Эти два командлета обрабатывают местоположения как стек - Push-Location изменяет ваше местоположение и добавляет каталог в стек расположений, тогда как Pop-Location удаляет текущий каталог из стека и возвращает вас в предыдущее местоположение. Он работает так же, как pu sh и операции pop с массивами.


Путем добавления префиксов относительных путей

Вы также можете добавить префикс относительных путей в сценарии либо с помощью $PSScriptRoot, либо ( Split-Path -Parent $MyInvocation.MyCommand.Definition ) как показано в предыдущем разделе. Если мы добавим префикс к относительному пути file1.txt:

$filepath1 = "${PSScriptRoot}\file1.txt"

Теперь у вас есть абсолютный путь к file1.txt. Обратите внимание, что этот метод будет работать с любым относительным путем от до $PSScriptRoot, он не обязательно должен находиться в той же папке, что и ваш ps1 скрипт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...