Linux中的type
命令返回给定文件在文件系统上的位置(如果它位于当前文件夹或$PATH
中)。使用Git Bash
命令行程序在Windows上也可以使用此功能。但是,我遇到了一个奇怪的角落情况,$PATH
上的文件存在,但是没有使用该命令返回。
我正在考虑尽快购买一台新电脑,所以我查找了将许可证密钥从一台计算机转移到另一台计算机的方法,为实际做这件事做准备。 The method I found提到了文件slmgr.vbs
和slui.exe
,这两个文件都位于我C:/Windows\System32
的{{1}}文件夹中,与Windows计算机一样。但是,当我使用$PATH
命令时,这两个文件不会显示出来。此外,type
在我slmgr.vbs
中调用Git Bash
时执行,而不是slui.exe
。 (slmgr.vbs
无法使用Git Bash
正确执行 ,但我可以使用cmd
中的Git Bash
CLI来调用它。)最后,在slmgr.vbs
中列出文件夹内容时会显示Git Bash
,但slui.exe
不是。
我认为这可能与权限有关,事实上,两个文件都具有非常严格的权限,如下图所示,但它们都具有相同的权限,这无法解释为什么在直接调用时执行并且另一个没有执行,也不是为什么一个文件在命令行中列出但另一个文件没有列出。
C:\Windows\System32
文件夹,证明文件存在:
两个文件的Users
和Administrators
组的文件权限(它们完全相同):
文件夹:
type
命令及其在Git Bash
中输出的2个文件,并列出文件夹中的文件(使用grep
过滤,因为文件夹很大),以及列出$PATH
的一部分(请记住,在阅读时,Git Bash
会更改显示的路径):
Sean@MYPC ~
$ type -a slmgr.vbs
sh.exe": type: slmgr.vbs: not found
Sean@MYPC ~
$ type -a slui.exe
sh.exe": type: slui.exe: not found
Sean@MYPC ~
$ slmgr.vbs
/c/WINDOWS/system32/slmgr.vbs: line 2: syntax error near unexpected token `('
/c/WINDOWS/system32/slmgr.vbs: line 2: `' Copyright (c) Microsoft Corporation. A
ll rights reserved.'
Sean@MYPC ~
$ slui.exe
sh.exe": slui.exe: command not found
Sean@MYPC ~
$ ls /c/Windows/System32/slui.exe /c/Windows/System32/slmgr.vbs
ls: /c/Windows/System32/slui.exe: No such file or directory
/c/Windows/System32/slmgr.vbs
Sean@MYPC ~
$ echo $PATH
/c/Users/Sean/bin:.:/usr/local/bin:/mingw/bin:/bin:/cmd:/c/Python33/:/c/Program
Files (x86)/Intel/iCLS Client/:/c/Program Files/Intel/iCLS Client/:/c/WINDOWS/sy
stem32:/c/WINDOWS:/c/WINDOWS/System32/Wbem:/c/WINDOWS/System32/WindowsPowerShell
/v1.0/:/c/Program Files/Intel/Intel(R) Management Engine Components/DAL:/c/Progr
am Files/Intel/Intel(R) Management Engine Components/IPT:/c/Program Files (x86)/
Intel/Intel(R) Management Engine Components/DAL:/c/Program Files (x86)/Intel/Int
el(R) Management Engine Components/IPT:/c/Program Files/Intel/WiFi/bin/:/c/Progr
am Files/Common Files/Intel/WirelessCommon/:/c/strawberry/c/bin:/c/strawberry/pe
rl/site/bin:/c/strawberry/perl/bin:/c/Program Files (x86)/Microsoft ASP.NET/ASP.
NET Web Pages/v1.0/:/c/Program Files/Microsoft SQL Server/110/Tools/Binn/:/c/Pro
gram Files (x86)/Microsoft SQL Server/90/Tools/binn/:/c/Program Files (x86)/Open
AFS/Common:/c/HashiCorp/Vagrant/bin:/c/Program Files (x86)/Windows Kits/8.1/Wind
ows Performance Toolkit/:/c/Program Files/nodejs/:/c/Program Files (x86)/Git/cmd
:/c/Program Files (x86)/Git/bin:/c/Program Files/Microsoft/Web Platform Installe
r/:/c/Ruby200-x64/bin:/c/Users/Sean/AppData/Local/Box/Box Edit/:/c/Program Files
(x86)/SSH Communications Security/SSH Secure Shell:/c/Users/Sean/Documents/Lisp
:/c/Program Files/GCL-2.6.1/lib/gcl-2.6.1/unixport:/c/Chocolatey/bin:/c/Users/Se
an/AppData/Roaming/npm:/c/wamp/bin/mysql/mysql5.6.12/bin:/c/Program Files/Oracle
/VirtualBox:/c/Program Files/Java/jdk1.7.0_51/bin:/c/Program Files/Node-Growl:/c
/chocolatey/bin:/c/Program Files/eclipse:/c/MongoDB/bin:/c/Program Files/7-Zip:/
c/Program Files (x86)/Google/Chrome/Application:/c/Program Files (x86)/LibreOffi
ce 4/program:/c/Program Files (x86)/OpenOffice 4/program
发生了什么?为什么这些文件不是用type
命令列出的?这个问题是因为奇怪的Windows权限,还是更奇怪的东西?如果是权限,为什么它们似乎具有相同的权限,但两者都没有以相同的方式处理?
编辑我尝试了@ RossRidge的答案,将隐形的虚拟C:\Windows\Sysnative
文件夹放在我的$PATH
中。我的结果如下:
Sean@MYPC ~
$ type -a slmgr.vbs
sh.exe": type: slmgr.vbs: not found
Sean@MYPC ~
$ type -a slui.exe
slui.exe is /c/WINDOWS/Sysnative/slui.exe
Sean@MYPC ~
$ slmgr.vbs
/c/WINDOWS/system32/slmgr.vbs: line 2: syntax error near unexpected token `('
/c/WINDOWS/system32/slmgr.vbs: line 2: `' Copyright (c) Microsoft Corporation. A
ll rights reserved.'
Sean@MYPC ~
$ slui.exe
Sean@MYPC ~
$ ls /c/Windows | grep sysnative
Sean@MYPC ~
$ ls /c/Windows/sysnative | grep pla
AutoWorkplace.exe*
AutoWorkplace.exe.config
AutoWorkplaceN.dll*
DeviceDisplayStatusManager.dll*
Display.dll*
DisplaySwitch.exe*
正如您所看到的,列出Sysnative
的内容时未列出/c/Windows
(为了简洁而再次进行过滤),但列出/c/Windows/Sysnative
的内容有效。执行slmgr.vbs
和slui.exe
而不指定它们的路径也有效(slmgr
仍然需要我故意不提供的参数)。然而,真正奇怪的部分是type
命令现在将slui.exe
列为/c/Windows/Sysnative
文件夹,但slmgr.vbs
仍未显示。为什么我能够执行它,但仍然没有显示type
命令?
答案 0 :(得分:3)
看起来你已经遇到了WOW64重定向器。您想要的文件位于c:\windows\system32
,但由于shell和其他实用程序是32位程序,因此它们会重定向到c:\windows\syswow64
。解决问题的简单方法是从普通(64位)Windows命令行运行所需的命令。
如果您确实想从MSYS环境运行这些命令,可以运行命令/c/windows/sysnative/slui
或将/c/windows/sysnative
添加到路径中。您可能需要使用cscript
命令来运行VBScript文件。