同一系统下cmd.exe可找到文件但PowerShell.exe无法找到,求排查原因
这种情况我之前碰到过好几次,大概率是下面几个常见原因导致的,你可以照着逐一验证:
32位/64位进程的文件系统重定向
这是最常见的原因!在64位Windows系统中,32位进程会被系统自动重定向到C:\Windows\SysWOW64目录,而不是C:\Windows\System32。如果你打开的是32位PowerShell,但文件实际在64位的System32(或其他受重定向的目录)里,就会出现CMD(64位)能看到,但PowerShell看不到的情况。
快速验证方法:- 在CMD中执行
echo %PROCESSOR_ARCHITECTURE%,输出AMD64就是64位CMD,x86是32位; - 在PowerShell中执行
[Environment]::Is64BitProcess,返回True是64位进程,False是32位。
如果两者位数不一致,直接打开对应位数的PowerShell就能解决问题(比如C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe是64位,C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe是32位)。
- 在CMD中执行
文件名特殊字符或路径解析差异
Windows文件系统不区分大小写,但PowerShell对路径中的特殊字符(比如末尾的空格/点、Unicode字符)处理比CMD更严格。有时候资源管理器显示的路径和实际路径会有细微差别,比如文件名末尾的空格会被资源管理器自动隐藏,但PowerShell默认解析时会忽略这些,导致找不到文件。
你可以试试在PowerShell中用字面量路径访问:Get-ChildItem -LiteralPath "你的文件绝对路径",-LiteralPath参数会完全按照你输入的路径解析,避免特殊字符被转义。PowerShell默认过滤规则限制
虽然你说文件没设置隐藏属性,但有些系统文件会带有“系统”属性,PowerShell的Get-ChildItem默认不会显示这类文件。你可以试试加上-Force参数:Get-ChildItem "目标路径" -Force,这个参数会强制显示所有文件(包括系统属性、隐藏属性的文件)。权限或运行级别差异
极少数情况下,CMD和PowerShell可能以不同的权限级别运行(比如一个是普通用户,一个是管理员),或者文件的NTFS权限设置限制了PowerShell进程的访问。你可以右键点击PowerShell,选择“以管理员身份运行”,再尝试访问目标路径,看是否能看到文件。
内容的提问来源于stack exchange,提问作者phg

