在 PowerShell 中,为什么“转换”到 FileInfo 设置错误的 FullName、Directory 和 DirectoryName

Tof*_*Bug 5 powershell powershell-4.0

当我FileInfo通过调用获取对象时,我注意到 PS ISE 和 PS 中的行为非常奇怪

$FileInfo = [System.IO.FileInfo](".\SomeFile.ext")
Run Code Online (Sandbox Code Playgroud)

当我查看它的属性DirectoryName及其相关属性时,它们都默认为 PS 打开的原始路径。

这是我的 ISE 的副本,它以管理员身份启动,并c:\Windows\System32作为默认路径

如果我运行以下代码:

$Fileinfo = [System.IO.FileInfo](".\@OpenWithToastLogo.png")  
cd c:\temp  
$Fileinfo2 = [System.IO.FileInfo](".\activation.txt")  
z:  
$Fileinfo3 = [System.IO.FileInfo](".\7za.exe")  
$Fileinfo | fl *
$Fileinfo2 | fl *
$Fileinfo3 | fl *
Run Code Online (Sandbox Code Playgroud)

我明白了

版本信息 :
文件 : C:\WINDOWS\system32\@OpenWithToastLogo.png
内部名称 :
OriginalFilename :
FileVersion :
FileDescription :
产品 :
ProductVersion :
调试 : False
修补 : False
PreRelease : False
PrivateBuild : False
SpecialBuild : False
语言 :
BaseName : @OpenWithToastLogo
目标 : {C:\Windows\WinSxS\wow64_microsoft-windows-openwith_31bf3856ad364e35_10.0.10240.16384_none_7f75eaad41c1f239\@OpenWithToastLogo.png,C:\Windows\SysWOW64\@OpenWithToastLogo.png}
链接类型:硬链接
模式:-a---l
名称:@OpenWithToastLogo .png
长度:160
目录名称:C:\WINDOWS\system32
目录:C:\WINDOWS\system32
IsReadOnly:False
存在:True
全名:C:\WINDOWS\system32\@OpenWithToastLogo.png
扩展名:.png 创建时间:7/10/ 2015 7:00:32 上午
CreationTimeUtc : 7/10/2015 11:00:32 上午
LastAccessTime : 7/10/2015 7:00:32 上午
LastAccessTimeUtc : 7/10/2015 11:00:32 上午
LastWriteTime : 7/ 10/2015 7:00:32 AM
LastWriteTimeUtc:7/10/2015 11:00:32 AM
属性:存档

版本信息:
基本名称:激活目标:
链接类型:
模式:darhsl
名称:activation.txt
长度:目录
名称:C:\WINDOWS\system32
目录:C:\WINDOWS\system32
IsReadOnly:True
存在:False
全名:C:\WINDOWS\system32\激活.txt
扩展名:.txt
创建时间:12/31/1600 7:00:00 PM
CreationTimeUtc:1/1/1601 12:00:00 AM
LastAccessTime:12/31/1600 7:00:00 PM
LastAccessTimeUtc:1/ 1/1601 12:00:00 AM
LastWriteTime:12/31/1600 7:00:00 PM
LastWriteTimeUtc:1/1/1601 12:00:00 AM
属性:-1

版本信息:
基本名称:
7za 目标:
链接类型:
模式:darhsl
名称:7za.exe
长度:目录
名称:C:\WINDOWS\system32
目录:C:\WINDOWS\system32
IsReadOnly:True
存在:False
全名:C:\WINDOWS\system32\ 7za.exe
扩展名:.exe
创建时间:12/31/1600 7:00:00 PM
CreationTimeUtc:1/1/1601 12:00:00 AM LastAccessTime:12/31/1600 7:00:00 PM
LastAccessTimeUtc:1/ 1/1601 12:00:00 AM
LastWriteTime:12/31/1600 7:00:00 PM
LastWriteTimeUtc:1/1/1601 12:00:00 AM
属性:-1

对于我的常规帐户,它默认为我的H:\路径,因此H:\DirectoryName.

是的,这些文件中的每一个都只存在于它相对的目录中。

有人以前见过这个吗?他们知道一个好的解决办法吗?使用完全限定当然可行,但这适用于其他技术人员可能运行的脚本,而且我们都非常习惯使用 PS 相对路径的想法。

Tes*_*ler 5

\n

PowerShell 具有您当前位置的概念。$pwd您可以使用自动变量或Get-Locationcmdlet [..]来查看\n

\n\n

PowerShell 使用此路径来解析 PowerShell API 级别的相对路径。

\n\n

[..]

\n\n

应用程序有当前目录的概念。这是用于解析 Windows API 级别的相对路径的目录。

\n\n

你是如何被烧伤的

\n\n

您当前的位置可能与当前目录相同,也可能不同。

\n
\n\n\n\n

\n\n
\n

经常出现的一个问题是,\xe2\x80\x9c为什么[System.Environment]::CurrentDirectory当我在 shell 中导航时,PowerShell 不\n 更改它?\xe2\x80\x9d

\n\n

其中困难的方面之一来自于 PowerShell 支持多个执行管道这一事实。虽然它\xe2\x80\x99s\n 尚未直接公开,但用户很快就能够暂停后台作业和其他并发任务。

\n\n

当前目录会影响整个进程,因此,如果我们在 shell 中导航时更改\n 目录,则可能会损坏\n 在后台运行的作业的环境。

\n\n

在 .Net 方法中使用文件名时,最佳做法是使用完全限定路径名。cmdletResolve-Path使这一切变得简单:

\n\n

$reader = new-object System.Xml.XmlTextReader (Resolve-Path baseline.xml)

\n
\n\n\n