2011-01-18 6 views
102

У меня есть сценарий PowerShell, который делает некоторые вещи, используя текущий каталог скрипта. Поэтому, когда внутри этого каталога работает .\script.ps1, работает правильно.PowerShell: Запустить команду из каталога скрипта

Теперь я хочу называть этот скрипт из другого каталога без изменения справочного каталога сценария. Поэтому я хочу позвонить ..\..\dir\script.ps1 и все еще хочу, чтобы этот скрипт вел себя так, как он был вызван из его каталога.

Как это сделать или как изменить скрипт, чтобы он мог запускаться из любого каталога?

ответ

146

Вы хотите, чтобы вы имели собственный путь к сценарию, чтобы ссылаться на файл рядом со сценарием? Попробуйте следующее:

$scriptpath = $MyInvocation.MyCommand.Path 
$dir = Split-Path $scriptpath 
Write-host "My directory is $dir" 

Вы можете получить много информации из $ MyInvocation и ее свойств.

Если вы хотите сделать ссылку на файл в текущем рабочем каталоге, вы можете использовать Resolve-Path или Get-ChildItem:

$filepath = Resolve-Path "somefile.txt" 

EDIT (на основе комментарий от OP):

# temporarily change to the correct folder 
Push-Location $folder 

# do stuff, call ant, etc 

# now back to previous directory 
Pop-Location 

Есть, вероятно, другие способы достижения чего-то подобного, используя Invoke-Command.

+1

Хм, хорошо, может быть, мне следовало бы более подробно рассказать о моем сценарии. На самом деле это скрипт, который вызывает «ant» с некоторыми параметрами. Поэтому я должен вызвать 'ant' из этой папки, чтобы убедиться, что он правильно находит файл конфигурации. В идеале я ищу что-то временное, чтобы изменить каталог выполнения локально внутри этого скрипта. – poke

+3

А в таком случае вам нужно будет 'Push-Location' и' Pop-Location' – JohnL

+4

осторожно, что $ MyInvocation чувствителен к контексту, я обычно делаю $ ScriptPath = (Get-Variable MyInvocation -Scope Script) .Value.MyCommand ,Путь, который работает из любого вида вложения или функции –

27

Если вы звоните в родные приложения, вам нужно беспокоиться о [Environment]::CurrentDirectory не о текущем каталоге PowerShell's $PWD. По какой-то причине это ускользает от меня, PowerShell does not set the process' current working directory when you Set-Location or Push-Location, поэтому вам нужно убедиться, что это так, если вы используете приложения (или командлеты), которые ожидают его установки.

В сценарии, вы можете сделать это:

Push-Location $MyInvocation.MyCommand.Path 
[Environment]::CurrentDirectory = $PWD 
## Your Script Code ... 
Pop-Location 
[Environment]::CurrentDirectory = $PWD 

Там нет надежной альтернативы этому. Многие из нас поставили строку в нашей оперативной функции, чтобы установить [Environment] :: CurrentDirectory ... но это не поможет вам, когда вы меняете местоположение в скрипте.

Заключительное примечание: $PWD не всегда является законным оператором CurrentDirectory (например, вы можете записывать CD в поставщик реестра), поэтому, если вы хотите поместить его в свою приглашение или в функции обертки для командлетов * -Location, вы необходимо использовать:

[Environment]::CurrentDirectory = Get-Location -PSProvider FileSystem 
+3

Он не меняет рабочий каталог процесса из-за поставщиков путей: вы можете записывать CD в реестр, базу данных SQL или куст IIS и т. Д. – piers7

+1

Да. Я знаю, в этом и заключалась последняя «заключительная записка». Они могли бы (как и в моей быстрой функции) обновить его до текущего местоположения поставщика FileSystem, как и любой другой оболочки в мире. – Jaykul

+0

Священные писатели-боги, я ТАК ДЕЙСТВУЮТ '. \ _ /.' - за эту убитую половину моего дня! Люди, серьезно? Серьезно? .. – ulidtko

11

Я часто использовал следующий код для импорта модуля, который находится в том же каталоге, что и работающий скрипт. Он первым получит каталог, из которого запущен PowerShell

$ currentPath = Split-Path ((Get-Variable MyInvocation -Scope 0) .Value) .MyCommand.Path

импорт-модуль " $ currentPath \ sqlps.ps1"

+0

вы хотите установить -Scope для скрипта –

16

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

$PSScriptRoot - the directory where the script exists, not the target directory the script is running in 
$PSCommandPath - the full path of the script 

К примеру, у меня есть $ скрипт профиля, который находит файл решения Visual Studio и запустить его. Я хотел сохранить полный путь после запуска файла решения. Но я хотел сохранить файл, где существует оригинальный скрипт. Поэтому я использовал $ PsScriptRoot.

1

Ну, я искал решение для этого какое-то время, без каких-либо скриптов только от CLI. Вот как я это делаю XD:

  • Перейдите в папку, из которой вы хотите запустить скрипт (главное, что у вас есть вкладка доработок)

    ..\..\dir

  • Теперь окружать расположение с двойной кавычки и внутри них добавляют cd, поэтому мы можем вызвать еще один экземпляр powershell.

    "cd ..\..\dir"

  • Добавить другую команду, чтобы запустить сценарий, разделенные ;, с представляет собой разделитель команд в PowerShell

    "cd ..\..\dir\; script.ps1"

  • Наконец запустить его с другим экземпляром PowerShell

    start powershell "cd..\..\dir\; script.ps1"

Это откроет новое окно PowerShell, перейдите к ..\..\dir, запустите script.ps1 и закройте окно.


Обратите внимание, что ";" просто отделяет команды, например, вы набирали их один за другим, если первый провал второй будет запущен, а затем следующий и следующий после ... Если вы хотите открыть новое окно powershell, вы добавите -noexit в переданную команду. Обратите внимание, что я сначала перейду к нужной папке, чтобы я мог использовать завершение вкладок (вы не могли бы использовать двойные кавычки).

start powershell "-noexit cd..\..\dir\; script.ps1"

Используйте двойные кавычки "", чтобы вы могли передать каталоги с пробелами в именах например,

start powershell "-noexit cd '..\..\my dir'; script.ps1"

0

Это будет работать нормально.

Push-Location $PSScriptRoot 

Write-Host CurrentDirectory $CurDir 
Смежные вопросы