在我的计算机上,该$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 脚本环境。在上面的示例中,它被视为任何其他字符。该示例是手动创建的,并不代表较长名称的缩短版本。
不过,还有两个问题:
这个“
MOON~1.REN
”用户名是怎么来的?严格检查此错误消息:“
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