检查命令是否在CMD内部

我有一个命令的名字,我需要检查这个命令是否是内部的。 我怎样才能在批处理脚本?

Solutions Collecting From Web of "检查命令是否在CMD内部"

所以经过很多调整之后,感谢@Andriy M的帮助,终于有效了。

@ECHO off CALL :isInternalCommand dir dirInternal ECHO is dir internal: %dirInternal% CALL :isInternalCommand find findInternal ECHO is find internal: %findInternal% exit /b 0 :isInternalCommand SETLOCAL MKDIR %TEMP%\EMPTY_DIR_FOR_TEST > NUL 2>& 1 CD /D %TEMP%\EMPTY_DIR_FOR_TEST SET PATH= %~1 /? > NUL 2>&1 IF ERRORLEVEL 9009 (ENDLOCAL SET "%~2=no" ) ELSE (ENDLOCAL SET "%~2=yes" ) GOTO :EOF 

老解决方案

你可以用where 。 如果失败,该命令可能是内部的。 如果成功,你会得到可执行的路径,证明它不是内部的。

 C:\Users\user>where path INFO: Could not find files for the given pattern(s). C:\Users\user>where find C:\Windows\System32\find.exe 

编辑:如评论所示,这可能不是最好的解决方案,如果你正在寻找便携性,而不仅仅是研究。 所以这是另一个可能的解决方案

%PATH%设置为空, HELP无法找到任何内容,然后在您尝试检查的命令上运行HELP

 C:\Users\user>set PATH= C:\Users\user>path PATH=(null) C:\Users\user>%WINDIR%\System32\help del Deletes one or more files. DEL [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names [...] C:\Users\user>%WINDIR%\System32\help find 'find' is not recognized as an internal or external command, operable program or batch file. 

如果命令没有帮助,这可能仍然失败。

编辑2:没关系,这也不会工作。 这两种情况都会返回%ERRORLEVEL%=1

kichik有一个很好的答案。 但是,如果在当前目录中遇到与所提供的命令名称匹配的可执行文件或批处理脚本,则可能会产生误报。

我能想到的避免这个问题的唯一方法是在%TEMP%目录中创建一个已知为空的文件夹,然后从该文件夹运行测试。

这是kichik的解决方案的修改版本应该工作。

 @echo off setlocal ::Print the result to the screen call :isInternal find call :isInternal dir ::Save the result to a variable call :isInternal find resultFind call :isInternal dir resultDir set result exit /b :isInternal command [rtnVar] setlocal set "empty=%temp%\empty%random%" md "%empty%" pushd "%empty%" set path= >nul 2>nul %1 /? if errorlevel 9009 (set rtn=not internal) else (set rtn=internal) popd rd "%empty%" ( endlocal if "%~2" neq "" (set %~2=%rtn%) else echo %1 is %rtn% ) exit /b 0 

这里是一个简单列出所有内部命令的脚本,假设HELP包含一个完整的内部命令列表。

更新: FOR和IF都有特殊的分析规则,如果通过FOR变量或延迟扩展执行,则这些规则会阻止这些命令的工作。 我不得不重写这个脚本来使用CALL,而是通过CALL参数来执行命令。

 @echo off setlocal enableDelayedExpansion set "empty=%temp%\empty%random%" md "%empty%" pushd "%empty%" for /f "delims= " %%A in ('help^|findstr /rc:"^[^ ][^ ]* "') do call :test %%A popd rd "%empty%" exit /b :test setlocal set path= %1 /? >nul 2>nul if not errorlevel 9009 echo %1 exit /b 0