Различать код в скрипте в зависимости от вызываемого из другого скрипта или оболочки - PullRequest
1 голос
/ 08 ноября 2019

Я пытаюсь разграничить код в сценарии A, когда сценарий A вызывается из другого сценария B, по сравнению с тем, когда он выполняется самостоятельно.

Script A

$callingScript = $MyInvocation.MyCommand.Source | Split-Path -Leaf
if($callingScript -eq "$($MyInvocation.MyCommand.Name)"){
    # Script is run from Shell
}else{
    # Skript is called from script B.ps1
}

Сценарий B

(...)
& "$($PSScriptRoot)\A.ps1" 

Результат всегда $callingScript равен A.ps1 и Name также равен A. Есть идеи, как этого добиться?

Ответы [ 2 ]

0 голосов
/ 10 ноября 2019

Внутри скрипта, $MyInvocation.PSCommandPath содержит:

  • полный путь вызывающего скрипта - если он есть.

  • в противном случае пустая строка ;то есть, пустая строка возвращается, если сценарий был вызван непосредственно из командной строки PowerShell, f или через CLI - powershell.exe (Windows PowerShell) / pwsh (PowerShell Core).

Поэтому:

if(-not $MyInvocation.PSCommandPath){
  # Script was called from the PowerShell prompt or via the PowerShell CLI.
  'DIRECT invocation'
}
else {
  # Script was called from the script whose path is reflected in
  # $MyInvocation.PSCommandPath
  'Invocation VIA SCRIPT'
}

Примечание :

  • Из того, что я могу сказать, $MyInvocation.ScriptName содержитта же информация, что и $MyInvocation.PSCommandPath;Я выбрал последнее выше для симметрии с $PSCommandPath

  • Функции игнорируются в отношении этих свойств - это только включающий скрипт , что имеет значение.

    • Однако вывод Get-PSCallStack также отражает функции.

    • Если вы dot-source скрипт (. ./script.ps1), который определяет функцию , которая вызывает ваш целевой скрипт, и позже вы вызовете эту функцию, $MyInvocation.PSCommandPath все равно будет отражать скрипт origin - везде, где вы вызываете функцию из (даже если вы вызываете ее непосредственно из приглашения или с помощью еще одного сценария).

0 голосов
/ 08 ноября 2019

Что должно работать:
Script-A.ps1

if ($MyInvocation.InvocationName -eq $MyInvocation.MyCommand.Source)
{
    Out-Host -InputObject ('Script startet with: ' + $MyInvocation.InvocationName)
}
else
{
    Out-Host -InputObject ('Script startet with: ' + $MyInvocation.ScriptName)
}

Script-B.ps1

& C:\Temp\Script-A.ps1

Вывод:

PS C:\> C:\Temp\Script-A.ps1
Script startet with: C:\Temp\Script-A.ps1
PS C:\> C:\Temp\Script-B.ps1
Script startet with: C:\Temp\Script-B.ps1

На самом деле я бы использовал входной параметр (переключатель) для определения случая, потому что описанный выше метод работает только в том случае, если вы выполняете файл с F5 внутри ISE или запускаете непосредственно скрипт внутри powershell.exe.

...