Title: Modules containing colliding names causes side-effects that are visible in other modules · Issue #12036 · PowerShell/PowerShell · GitHub
Open Graph Title: Modules containing colliding names causes side-effects that are visible in other modules · Issue #12036 · PowerShell/PowerShell
X Title: Modules containing colliding names causes side-effects that are visible in other modules · Issue #12036 · PowerShell/PowerShell
Description: The way that PowerShell resolves commands with colliding names seems to have changed sometime between PowerShell 5.1 and 7. The new behavior is problematic because it introduces the possibility of the following happening: Invoking a comm...
Open Graph Description: The way that PowerShell resolves commands with colliding names seems to have changed sometime between PowerShell 5.1 and 7. The new behavior is problematic because it introduces the possibility of ...
X Description: The way that PowerShell resolves commands with colliding names seems to have changed sometime between PowerShell 5.1 and 7. The new behavior is problematic because it introduces the possibility of ...
Opengraph URL: https://github.com/PowerShell/PowerShell/issues/12036
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Modules containing colliding names causes side-effects that are visible in other modules","articleBody":"The way that PowerShell resolves commands with colliding names seems to have changed sometime between PowerShell 5.1 and 7. The new behavior is problematic because it introduces the possibility of the following happening:\r\n\r\nInvoking a command in one module can have the side effect that changes the command to which a different name in an unrelated module resolves.\r\n\r\nIn other words, (at least by default in PowerShell 7, it seems) one can never be sure that code invoked in a different module will not inadvertently change the command to which a name in your module will resolve.\r\n\r\nThis seems like something I need to take into careful account when designing modules. Accordingly, I'm hoping to find answers to the following questions:\r\n\r\n1. Is this the design intent of PowerShell? If so, how should modules be designed to prevent other modules from inadvertently changing the commands to which names resolve?\r\n2. Is there some way to override this behavior so that a module imported in one module doesn't appear in another?\r\n\r\n---\r\n\r\nOther notes:\r\n\r\n* this emerged from #12014 \r\n\r\n# Steps to reproduce\r\n\r\nCreate the following well-defined module `q` in `$Env:PSModulePath`:\r\n```PowerShell\r\n# q.psd1\r\n@{\r\n ModuleVersion = '0.1.0'\r\n RootModule = 'q.psm1'\r\n FunctionsToExport = 'Get-FileHash','q1'\r\n}\r\n```\r\n```PowerShell\r\n# q.psm1\r\nfunction Get-FileHash {}\r\nfunction q1 {}\r\n```\r\n\r\nInvoke the following:\r\n\r\n```powershell\r\nNew-Module m {\r\n function m1 {\r\n [pscustomobject]@{\r\n Call = $MyInvocation.MyCommand.Name\r\n CommandType = Get-Command Get-FileHash | % CommandType\r\n Module = Get-Command Get-FileHash | % Module | % {[System.IO.FileInfo]::new($_.Path).Name}\r\n }\r\n }\r\n function m2 {q1} # this call should not alter the Get-FileHash that is visible in module p\r\n} | Import-Module\r\nNew-Module p {\r\n function p1 {\r\n [pscustomobject]@{\r\n Call = $MyInvocation.MyCommand.Name\r\n CommandType = Get-Command Get-FileHash | % CommandType\r\n Module = Get-Command Get-FileHash | % Module | % {[System.IO.FileInfo]::new($_.Path).Name}\r\n }\r\n }\r\n} | Import-Module\r\n\r\nm1\r\np1\r\nm2\r\nm1\r\np1\r\n```\r\n\r\n# Expected behavior\r\n\r\nEither this behavior (which is how PowerShell 5.1 behaves)\r\n\r\n```none\r\nCall CommandType Module\r\n---- ----------- ------\r\nm1 Function q.psm1\r\np1 Function q.psm1\r\nm1 Function q.psm1\r\np1 Function q.psm1\r\n```\r\n\r\nor this behavior\r\n\r\n```none\r\nCall CommandType Module\r\n---- ----------- ------\r\nm1 Cmdlet Microsoft.PowerShell.Utility.psd1\r\np1 Cmdlet Microsoft.PowerShell.Utility.psd1\r\nm1 Function q.psm1\r\np1 Cmdlet Microsoft.PowerShell.Utility.psd1\r\n```\r\n\r\n# Actual behavior\r\n\r\n```none\r\nCall CommandType Module\r\n---- ----------- ------\r\nm1 Cmdlet Microsoft.PowerShell.Utility.psd1\r\np1 Cmdlet Microsoft.PowerShell.Utility.psd1\r\nm1 Function q.psm1\r\np1 Function q.psm1\r\n```\r\n\r\n# Environment data\r\n\r\n\u003c!-- provide the output of $PSVersionTable --\u003e\r\n\r\n```none\r\n\r\nName Value\r\n---- -----\r\nPSVersion 7.0.0\r\nPSEdition Core\r\nGitCommitId 7.0.0\r\nOS Microsoft Windows 6.3.9600\r\nPlatform Win32NT\r\nPSCompatibleVersions {1.0, 2.0, 3.0, 4.0…}\r\nPSRemotingProtocolVersion 2.3\r\nSerializationVersion 1.1.0.1\r\nWSManStackVersion 3.0\r\n```\r\n","author":{"url":"https://github.com/alx9r","@type":"Person","name":"alx9r"},"datePublished":"2020-03-05T17:53:11.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":7},"url":"https://github.com/12036/PowerShell/issues/12036"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:43a19df1-236f-7dec-1ffe-e9128805f80a |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | DB0C:1FB764:ED3C95:140EA57:6A570855 |
| html-safe-nonce | 91884474d94a7f85ebc33f8a4cbc9d8d7ff03e3e7b1d07292b5a63abd0fb6e26 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJEQjBDOjFGQjc2NDpFRDNDOTU6MTQwRUE1Nzo2QTU3MDg1NSIsInZpc2l0b3JfaWQiOiI4Nzg4NTc0MTU5NzU0NDMwNTQ5IiwicmVnaW9uX2VkZ2UiOiJpYWQiLCJyZWdpb25fcmVuZGVyIjoiaWFkIn0= |
| visitor-hmac | 53eb8fbaf6ec2380825a9cde08c153a44260302a4798159659ba1cb45be988e0 |
| hovercard-subject-tag | issue:576430137 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/PowerShell/PowerShell/12036/issue_layout |
| twitter:image | https://opengraph.githubassets.com/236d8375953a31246095adc5b8c9a813bedb31d95c70159bb325c0d3b176ad75/PowerShell/PowerShell/issues/12036 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/236d8375953a31246095adc5b8c9a813bedb31d95c70159bb325c0d3b176ad75/PowerShell/PowerShell/issues/12036 |
| og:image:alt | The way that PowerShell resolves commands with colliding names seems to have changed sometime between PowerShell 5.1 and 7. The new behavior is problematic because it introduces the possibility of ... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | alx9r |
| hostname | github.com |
| expected-hostname | github.com |
| None | 4eb29e5f807bd95e41196adfbc6d28f9af12d89830d8b684f3e871774ddff2fc |
| turbo-cache-control | no-preview |
| go-import | github.com/PowerShell/PowerShell git https://github.com/PowerShell/PowerShell.git |
| octolytics-dimension-user_id | 11524380 |
| octolytics-dimension-user_login | PowerShell |
| octolytics-dimension-repository_id | 49609581 |
| octolytics-dimension-repository_nwo | PowerShell/PowerShell |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 49609581 |
| octolytics-dimension-repository_network_root_nwo | PowerShell/PowerShell |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | b056788a129fb0194b61f2ebb4c43f6a9f4dfd27 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width