Skip to content

Cannot get path of running script in $MyInvocation.InvocationName #3959

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
5 of 6 tasks
kakogawa opened this issue May 8, 2022 · 19 comments
Open
5 of 6 tasks

Cannot get path of running script in $MyInvocation.InvocationName #3959

kakogawa opened this issue May 8, 2022 · 19 comments
Labels
Area-Debugging Bug: PowerShell Core Bugs when using PowerShell Core. Bug: PowerShell 5.1 Bugs when using PowerShell 5.1. Issue-Bug A bug to squash.

Comments

@kakogawa
Copy link

kakogawa commented May 8, 2022

Prerequisites

  • I have written a descriptive issue title.
  • I have searched all issues to ensure it has not already been reported.
  • I have read the troubleshooting guide.
  • I am sure this issue is with the extension itself and does not reproduce in a standalone PowerShell instance.
  • I have verified that I am using the latest version of Visual Studio Code and the PowerShell extension.
  • If this is a security issue, I have read the security issue reporting guidance.

Summary

In versions 2022.5.0 and 2022.5.1
To get the path of a running script.
i tried
$MyInvocation.InvocationName
but I could not get the path by this command.

Similarly, to retrieve the path of a script running on
$PSScriptRoot
This also did not retrieve the path.

I downgraded the version to 2021.12.0 and got the path correctly

Thank you

Translated with www.DeepL.com/Translator

PowerShell Version

Name                           Value
----                           -----
PSVersion                      7.2.3
PSEdition                      Core
GitCommitId                    7.2.3
OS                             Microsoft Windows 10.0.19044
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

Visual Studio Code Version

1.67.0
57fd6d0195bb9b9d1b49f6da5db789060795de47
x64

Extension Version

don't work
2022.5.0 and 2022.5.1

work
ms-vscode.powershell@2021.12.0

Steps to Reproduce

$MyInvocation.InvocationName

Visuals

No response

Logs

No response

@kakogawa kakogawa added the Issue-Bug A bug to squash. label May 8, 2022
@ghost ghost added the Needs: Triage Maintainer attention needed! label May 8, 2022
@SydneyhSmith
Copy link
Collaborator

Thanks @vadhbka were you debugging when you hit this?

@SydneyhSmith SydneyhSmith added Needs: Author Feedback Please give us the requested feedback! and removed Needs: Triage Maintainer attention needed! labels May 9, 2022
@kakogawa
Copy link
Author

kakogawa commented May 9, 2022

I have always used $MyInvocation.InvocationName to create the temp folder.
recently the temp folder was something wrong
So I noticed it.

@ghost ghost added Needs: Maintainer Attention Maintainer attention needed! and removed Needs: Author Feedback Please give us the requested feedback! labels May 9, 2022
@JustinGrote
Copy link
Collaborator

JustinGrote commented May 9, 2022

@vadhbka this variable is dynamically populated depending on the context, you can't just run it at the command line, if it's present in a script it will present what you want, and if you are stopped in the debugger it will do that too. This is a PowerShell thing, has nothing to do with the extension, unless I'm missing something. I don't see any issue here, this behavior is the same in the previous versions. Can you provide a specific reproduction?

image

@kakogawa
Copy link
Author

kakogawa commented May 9, 2022

This is what happens when debuging a script.
It is not at command line.
Since the behavior is changed by changing the version of the extension,
I think it is a bug in the extension.

The image has been corrected and re-uploaded.
bbb

@CarlosAndreuLlaneras
Copy link

Hi
I am facing the same problem.
I have a script that uses "$MyInvocation.InvocationName" to retrieve the path of my script and since I updated to the latest version, this script returns "." instead of the full path.

@kakogawa
Copy link
Author

@CarlosAndreuLlaneras
I relieve to know that this was not just my problem.
thank you!

@CarlosAndreuLlaneras
Copy link

@vadhbka
In the meanwhile I am using "$ScriptPath = Split-Path -Parent $PSCommandPath" instead of "$ScriptPath = Split-Path $MyInvocation.InvocationName". It works for me.
Regards

@JustinGrote
Copy link
Collaborator

JustinGrote commented May 11, 2022

@vadhbka thanks for the update! I agree with @CarlosAndreuLlaneras because this makes your script immune to differences in how it is invoked (dotsource vs direct run). This happens in PowerShell itself, not just vscode, we just changed how it gets invoked but this exposes a flaw in your script, not necessarily in vscode.

Test.ps1

$myinvocation.InvocationName

image

@andschwa this looks like a "regression" (more like behavior change) from changing how the debug invokes scripts (since now it dotsources rather than running directly), but I don't know if there's anything we can do other than call it out as a "breaking" change.

@JustinGrote JustinGrote added Area-Debugging Bug: PowerShell Core Bugs when using PowerShell Core. Bug: PowerShell 5.1 Bugs when using PowerShell 5.1. and removed Needs: Maintainer Attention Maintainer attention needed! labels May 11, 2022
@andyleejordan
Copy link
Member

Hm, that's odd. I thought we were always dot-sourcing scripts. In fact, there was a regression where we changed to using the ampersand call-operator and had to change it back to dot-sourcing: PowerShell/PowerShellEditorServices#1652

@kakogawa
Copy link
Author

@JustinGrote
Now I understand why this problem occurred.
Thank you!

@CarlosAndreuLlaneras

In the meanwhile I am using "$ScriptPath = Split-Path -Parent $PSCommandPath" instead of "$ScriptPath = Split-Path $MyInvocation.InvocationName". It works for me.

This is a good method.
I will replace $PSCommandPath too.
Thanks for letting me know!

@SeeminglyScience
Copy link
Collaborator

Hm, that's odd. I thought we were always dot-sourcing scripts. In fact, there was a regression where we changed to using the ampersand call-operator and had to change it back to dot-sourcing: PowerShell/PowerShellEditorServices#1652

We were always dot sourcing, but when this worked previously it was done via AddScript(string, bool) where the bool controls if it's dot sourced. Using an invocation operator like . or & changes the invocation name. Honestly I'd consider it a PowerShell bug, one we should for sure fix either way.

It's like it just looks at the first token rather than the first pipeline element.

That said, I also agree that this is not the right use case for InvocationName. I do not have any strong preferences for how we handle it on the extension side.

@andyleejordan
Copy link
Member

Think we should use AddScript explicitly here? Might make things "just work" a bit better for users.

@SeeminglyScience
Copy link
Collaborator

Sorry I meant AddCommand. But yeah ideally. That said, we were using it and switched a little bit before I joined I think. So I imagine there was a reason, though I don't know what it was.

@andyleejordan
Copy link
Member

I'll check the Git history and find out why.

@NeilBrenMS
Copy link

The change to dot-source when you hit F5 was a breaking change for my workflow.

I routinely have module function implementations in .PS1 files and I dot-source them from .PSM1 files. While I'm developing the functions, I would open the .PS1 file in VS Code and then use F5 and the InvocationName to exercise the new functions under the debugger:

$isDotSourced = $MyInvocation.InvocationName -eq '.'
if (-not $isDotSourced)
{
  // Execute some functions to test them
}

I don't want the test code to execute when I import the module that dot-sources the .PS1 file.

@andyleejordan
Copy link
Member

@NeilBrenMS the extension has always dot-sourced, with the exception of maybe a month during a preview window.

@SeeminglyScience
Copy link
Collaborator

I routinely have module function implementations in .PS1 files and I dot-source them from .PSM1 files. While I'm developing the functions, I would open the .PS1 file in VS Code and then use F5 and the InvocationName to exercise the new functions under the debugger:

You may want to set a variable in your psm1 instead. InvocationName reading as . instead of the actual invocation name is a bug that may be fixed some day.

@tschy2m
Copy link

tschy2m commented Dec 9, 2022

When debugging a script $MyInvocation, $PSScriptRoot and $PSCommandPath are all empty.
VSCode 1.74 and PowerShell extension 2022.11.

@kakogawa
Copy link
Author

kakogawa commented Mar 1, 2023

Currently, I have confirmed that $MyInvocation.InvocationName does not work
but $PSScriptRoot and $PSCommandPath do

Visual Studio Code Version:1.76.0
PowerShell:7.3.3
Extension Version:2023.2.1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Area-Debugging Bug: PowerShell Core Bugs when using PowerShell Core. Bug: PowerShell 5.1 Bugs when using PowerShell 5.1. Issue-Bug A bug to squash.
Projects
None yet
Development

No branches or pull requests

8 participants