PowerShell路径的解析方式取决于它何时使用

时间:2017-09-21 09:00:04

标签: powershell path filepath pester

我正在开发一个PowerShell模块,我的一个测试中的路径解析非常奇怪。

当前文件夹结构如下所示:

ISPS/
├── ISPS/
│   ├── Private/
│   ├── Public/
│   │   ├── Add-ICDCrawler.ps1
│   │   ├── Get-ICDCrawler.ps1
│   │   ├── New-ICDCrawler.ps1
│   │   └── Remove-ICDCrawler.ps1
│   ├── ISPSCrawler.psd1
│   └── ISPSCrawler.psm1
├── tests/
│   ├── Add-ICDCrawler.tests.ps1
│   ├── Get-ICDCrawler.tests.ps1
│   ├── New-ICDCrawler.tests.ps1
│   └── Remove-ICDCrawler.tests.ps1

表现奇怪的测试是Remove-ICDCrawler.tests.ps1。文件的开头和相关部分如下所示:

$ModuleRoot = Split-Path $PSScriptRoot -Parent

. $ModuleRoot\ISPS\Public\Get-ICDCrawler.ps1
. $ModuleRoot\ISPS\Public\Remove-ICDCrawler.ps1

当它运行时,点源可以正常用于Get-ICDCrawler行,但不能用于Remove-ICDCrawler。这是出现的错误消息:

. : The term 'D:\Projects\ISPS\ISPS\ISPS\Public\Remove-ICDCrawler.ps1' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At D:\Projects\ISPS\tests\Remove-ICDCrawler.tests.ps1:4 char:3
+ . $ModuleRoot\ISPS\Public\Remove-ICDCrawler.ps1
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

这很直接。路径中有一个ISPS个文件夹太多。如果我从测试的第4行中删除其中一个ISPS文件夹,然后再试一次它完美无缺。问题是Get-ICDCrawler.ps1Remove-ICDCrawler.ps1文件都存储在同一目录中,据我所知,路径应该解析到正确的目录。正如我所提到的,从第4行的路径中删除ISPS可以正常工作,但它违背了我对PowerShell的所有了解。有谁知道为什么会这样?

Name                           Value                  
----                           -----                  
PSVersion                      5.1.15063.608          
PSEdition                      Desktop                
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.15063.608         
CLRVersion                     4.0.30319.42000        
WSManStackVersion              3.0                    
PSRemotingProtocolVersion      2.3                    
SerializationVersion           1.1.0.1                

1 个答案:

答案 0 :(得分:2)

我明白了,所以我离开了这个,所以人们可以在将来嘲笑它。

Get-ICDCrawler文件的开头如下所示:

$ModuleRoot = Split-Path $PSScriptRoot -Parent

. $ModuleRoot\Private\Find-XmlNode.ps1
. $PSScriptRoot\New-ICDCrawler.ps1

所以我会导入该文件并将$ModuleRoot变量更改为相对于Get-ICDCrawler.ps1文件。我必须确保变量的名称不同,以便名称空间不会发生冲突。