如何进入名称包含波浪符号的目录?

如何进入名称包含波浪符号的目录?

在我的计算机上,该$env:temp变量包含一个波浪符号:

PS C:\> echo $env:temp
C:\Users\MOON~1.REN\AppData\Local\Temp

当我尝试通过 cd 进入指向的目录时出现$env:temp以下错误:

PS C:\> cd $env:temp
cd : An object at the specified path C:\Users\MOON~1.REN does not exist.

是否有可能强制 PowerShell 将临时目录的短名称扩展为其全名?

有什么可疑的事情发生吗?

有人指出,也许有些事情很可疑。事实似乎确实如此。在 cmd.exe 中:

C:\>echo %username%
Rene.Nyffenegger

C:\>echo %userprofile%
C:\Users\MOON.Rene

C:\>echo %temp%
C:\Users\MOON~1.REN\AppData\Local\Temp

C:\>cd %temp%

C:\Users\MOON~1.REN\AppData\Local\Temp>echo %date% > iWasHere

C:\Users\MOON~1.REN\AppData\Local\Temp>cd Users\MOON.Rene\AppData\Local\Temp

C:\Users\MOON.Rene\AppData\Local\Temp>type iWasHere
Fri 10/25/2019

有趣的是:如果在 cmd.exe 中,我可以 cd 到C:\Users\MOON~1.Ren,但在 PowerShell 中却无法执行此操作:

C:\> cd C:\Users\MOON~1.Ren
C:\Users\MOON~1.Ren

PS C:\> cd C:\Users\MOON~1.Ren
cd : An object at the specified path C:\Users\MOON~1.Ren does not exist.

所以,我真的不知道这里发生了什么。

答案1

严格回答此网页标题中出现的问题:一个人只是这么做。

MicroSoft Windows PowerShell 集成 Shell 脚本环境中的波浪符号

>_ Windows PowerShell
Windows PowerShell
Copyright (C) MicroSoft Corporation. All rights reserved.

Try the new cross-platform PowerShell https://aka.ms/pscore6

PS C:\Users\DOBRE> CD "C:\Users\DOBRE\OneDrive\Documents\MOON~1.REN\"
PS C:\Users\DOBRE\OneDrive\Documents\MOON~1.REN> CD \
PS C:\> CD C:\Users\DOBRE\OneDrive\Documents\MOON~1.REN\
PS C:\Users\DOBRE\OneDrive\Documents\MOON~1.REN>

然而,正如 @LPChip 非常仔细地注意到的那样(谁会想到波浪号前面少了两个字符?),这个用户名有点可疑,即“ MOON~1.REN”。这个“ REN”是否也来自“ René”?

总结一下:微软 视窗 电源外壳集成 Shell 脚本环境。在上面的示例中,它被视为任何其他字符。该示例是手动创建的,并不代表较长名称的缩短版本。

不过,还有两个问题:

  1. 这个“ MOON~1.REN”用户名是怎么来的?

  2. 严格检查此错误消息:“cd:指定路径上的对象 C:\Users\MOON~1.REN 不存在“,C:\Users\MOON~1.REN”路径似乎无法与对象关联。

答案2

总结:获取 8.3 文件名的长版本并cd执行以下代码:

cd (gi $env:temp).FullName

您的环境变量一切正常。它只包含您的用户配置文件文件夹名称8.3 文件名格式。许多年前,这种表示法是必要的,以便使那些尚不支持较长文件名的系统能够访问较长的文件名。顺便说一句,就您而言,您的文件夹名称不会被视为文件夹名称,而是文件名,因为它包含一个点。

您可以使用 PowerShell 中的变通方法来处理此类名称cd。首先,让我们重现您的问题。要在 PowerShell 中查看 8.3 文件名,您可以使用以下函数(取自这里):

function Get-ShortName {

    Begin {
        $fso = New-Object -ComObject Scripting.FileSystemObject
    }

    Process {
        If ($_.psiscontainer) {
            $fso.getfolder($_.fullname).ShortName
        } else {
            $fso.getfile($_.fullname).ShortName
        }
    }
}

让我们创建您的文件夹C:并显示其 8.3 名称:

cd C:\
New-Item -Name 'MOON.Rene' -ItemType Directory | Get-ShortName

输出:

MOON~1.REN

将目录更改为该目录确实会引发异常:

PS C:\> cd MOON~1.REN
cd : An object at the specified path C:\MOON~1.REN does not exist.
At line:1 char:1
+ cd MOON~1.REN
+ ~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Set-Location], PSArgumentException
    + FullyQualifiedErrorId : Argument,Microsoft.PowerShell.Commands.SetLocationCommand

作为一种解决方法,您可以将 8.3 文件名评估为其全名,然后将目录更改为:

cd (gi MOON~1.REN).FullName

哪个可以工作:

PS C:\MOON.Rene>

仅供参考,这是以下行的简短版本:

Set-Location -Path (Get-Item -Path MOON~1.REN).FullName

相关内容