【问题标题】:Why does [IO.DirectoryInfo]".\" not return the current directory?为什么 [IO.DirectoryInfo]".\" 不返回当前目录?
【发布时间】:2014-07-31 14:19:15
【问题描述】:

我在参数验证中广泛使用 [IO.DirectoryInfo],结果证明这是一件非常非常糟糕的事情。

看这里:

PS C:\pathsuppressed>> echo ([IO.DirectoryInfo]".\")

Mode                LastWriteTime     Length Name                                                                                                                                                                      
----                -------------     ------ ----                                                                                                                                                                      
d-r--         29.7.2014     17:06            Desktop             

无论我当前的目录是什么,它都表明我在桌面。真的吗?

做同样事情的正确方法是什么?我可以使用什么“类型”来标记参数是 PowerShell 脚本中的路径?

附录:

似乎 PowerShell 关系 '.'到某个目录,在 shell 启动时,而不是我目前所在的目录。这种想法的背后可能是什么? (微软擅长为 PowerShell 异常找借口)

【问题讨论】:

  • [Environment]::CurrentDirectory的值是多少?
  • 这里好像是C:\Windows\system32
  • 好的,zdan 有它的症结所在。 Powershell 正在对一个字符串进行默认转换,该字符串调用DirectoryInfo 的构造函数,该构造函数接受一个字符串,并将路径传递给Path.GetFullPath,它使用Environment.CurrentDirectory 表示'。'因为它对powershell一无所知。

标签: .net powershell powershell-2.0


【解决方案1】:

这是因为 .NET 运行时使用的是 powershell 进程的当前工作目录,而不是 powershell shell 中的当前位置。

演示:

# C:\temp> [System.IO.Directory]::SetCurrentDirectory("c:\windows")

# C:\temp> [IO.DirectoryInfo]".\"

Mode                LastWriteTime     Length Name                                                                                  
----                -------------     ------ ----                                                                                  
d----         7/29/2014  10:44 AM            windows                                                                               

# C:\temp> [IO.DirectoryInfo]"$pwd"

Mode                LastWriteTime     Length Name                                                                                  
----                -------------     ------ ----                                                                                  
d----         7/23/2014   3:16 PM            temp 

要获取当前powershell位置的DirectoryInfo,只需使用get-item

# C:\temp> get-item ".\"

    Directory: C:\

Mode                LastWriteTime     Length Name                                                                                  
----                -------------     ------ ----                                                                                  
d----         7/23/2014   3:16 PM            temp

【讨论】:

  • 谢谢,这个解释听起来很合理。我的实际用例是试图声明一个脚本参数应该是一个目录,我为此使用了 [IO.DirectoryInfo]。我是否应该简单地避免这样做并做一些愚蠢的事情? [String] 代替?
  • @akauppi 嗯,这是一个更有趣的问题。相反,您可能应该问这个问题,有人可能会有答案。
  • 如果有微软人正在阅读这篇文章,您可以让 Powershell 进程的当前目录镜像提示符的作用。您将 PS 宣传为一种简单的 .NET 兼容工具,但例如这里有两个世界之间的差距。我掉进去了。
  • 我查看了Test-Path的官方原型,它使用String作为参数。因此,我也应该这样做。感谢您的帮助。
  • @akauppi 问题在于,Powershell 支持比 .NET 框架 API 更广泛的“路径”定义。例如,shell 中的当前路径可以是注册表项(例如尝试cd HKLM:\Software)。我同意,但是,这是人们一直陷入的一个巨大的陷阱,应该采取一些措施。
【解决方案2】:

看看这是否有助于解决您的问题

[IO.DirectoryInfo](Resolve-Path ".\").Path

【讨论】:

  • 在这个问题的情况下会。但是,它不能解决将函数参数声明为路径的根本问题。用户将能够提供相对字符串,并且我不能要求他们在调用 cmdlet 时执行上述转换。有价值的评论,尽管如此 +1。
猜你喜欢
  • 1970-01-01
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-05
  • 1970-01-01
  • 1970-01-01
  • 2017-05-05
相关资源
最近更新 更多