yet vboxmanage reconoce recognized not medium iniciar implemented found for error desde powershell cmd which

powershell - recognized - vboxmanage.exe no se reconoce



¿Cuál es el equivalente cmd/powershell de `which` en bash? (2)

Me gustaría saber qué versión de un ejecutable utiliza el shell CMD. En cualquier shell de Unix, usaría which para encontrarlo.

¿Hay un comando equivalente en uno de los shells de Windows?


El comando WHERE no es lo mismo que unix, ya que enumera todos los archivos coincidentes encontrados en el directorio actual o PATH. Como dice Joey, el primero que aparece es el que ejecuta. Es simple crear un script por lotes que solo devolverá el primero encontrado.

@echo off for /f "delims=" %%F in (''where %1'') do ( echo %%F exit /b )

Pero WHERE es relativamente lento.

A continuación se muestra un script WHICH.BAT que es más rápido y lo hace un poco más. Utiliza una amplia y diferida alternancia de expansión porque: 1) El porcentaje de% de RUTA en expansión no es confiable si hay caracteres especiales sin comillas. 2) La expansión de las variables FOR mientras la expansión retardada está habilitada corrompe los valores que contienen ! .

::WHICH.BAT CommandName [ReturnVar] :: :: Determines the full path of the file that would execute if :: CommandName were executed. :: :: The result is stored in variable ReturnVar, or else it is :: echoed to stdout if ReturnVar is not specified. :: :: If no file is found, then an error message is echoed to stderr. :: :: The ERRORLEVEL is set to one of the following values :: 0 - Success: A matching file was found :: 1 - CommandName is an internal command :: 2 - No file was found and CommandName is not an internal command :: 3 - Improper syntax - no CommandName specified :: @echo off setlocal disableDelayedExpansion set "file=%~1" setlocal enableDelayedExpansion if not defined file ( >&2 echo Syntax error: No CommandName specified exit /b 3 ) :: test for internal command echo(!file!|findstr /i "[^abcdefghijklmnopqrstuvwxyz]" >nul || ( set "empty=!temp!/emptyFolder" md "!empty!" 2>nul del /q "!empty!/*" 2>nul >nul setlocal pushd "!empty!" set path= (call ) !file! /? >nul 2>nul if not errorlevel 9009 ( >&2 echo "!file!" is an internal command popd exit /b 1 ) popd endlocal ) :: test for external command set "noExt=" if "%~x1" neq "" if "!PATHEXT:%~x1=!" neq "!PATHEXT!" set noExt=""; set "modpath=./;!PATH!" @for %%E in (%noExt%%PATHEXT%) do @for %%F in ("!file!%%~E") do ( setlocal disableDelayedExpansion if not "%%~$modpath:F"=="" if not exist "%%~$modpath:F/" ( endlocal & endlocal & endlocal if "%~2"=="" (echo %%~$modpath:F) else set "%~2=%%~$modpath:F" exit /b 0 ) endlocal ) endlocal >&2 echo "%~1" is not a valid command exit /b 2

ACTUALIZAR

Tuve que modificar significativamente el script anterior porque estaba enumerando incorrectamente un comando interno como externo si existía un archivo exe con el mismo nombre de raíz en algún lugar de la RUTA.


Varios.

  1. where es un equivalente directo:

    C:/Users/Joey>where cmd C:/Windows/System32/cmd.exe

    Tenga en cuenta que en PowerShell, que es un alias para Where-Object , necesita usar where.exe en PowerShell.

  2. En cmd también puedes usar for :

    C:/Users/Joey>for %x in (powershell.exe) do @echo %~$PATH:x C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe

  3. En PowerShell tiene Get-Command y su alias gcm que hace lo mismo si pasa un argumento (pero también funciona para alias, cmdlets y funciones en PowerShell):

    PS C:/Users/Joey> Get-Command where CommandType Name Definition ----------- ---- ---------- Alias where Where-Object Application where.exe C:/Windows/system32/where.exe

    El primer comando devuelto es el que se ejecutará.