programing

bash에서 'which'에 해당하는 cmd/powershell은 무엇입니까?

newstyles 2023. 10. 16. 21:38

bash에서 'which'에 해당하는 cmd/powershell은 무엇입니까?

CMD 쉘이 어떤 버전의 실행 파일을 사용하는지 알고 싶습니다.어떤 유닉스 셸이든지, 나는which그걸 찾기 위해서요.

윈도우 셸 중 하나에 동등한 명령이 있습니까?

여러가지.

  1. where는 직접 동치입니다.

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

    PowerShell에서는where그 자체가 에 대한 별칭입니다.Where-Object, 따라서 사용해야 합니다.where.exePowerShell에 있습니다.

  2. cmd사용할 수도 있습니다.for:

    C:\Users\Joey>for %x in (powershell.exe) do @echo %~$PATH:x
    C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
    
  3. PowerShell에는 다음과 같은 기능이 있습니다.Get-Command그리고 그 가명은gcm인수를 통과한 경우에도 마찬가지입니다(PowerShell의 별칭, cmdlet 및 함수에도 적용됨).

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

    첫 번째로 반환된 명령은 실행되는 명령입니다.

WHERE명령어가 unix와 완전히 같지 않습니다.which현재 디렉토리 또는 PATH에 있는 일치하는 모든 파일을 나열하기 때문입니다.조이 말대로, 가장 먼저 나열된 것은 실행하는 것입니다.처음 찾은 스크립트만 반환하는 배치 스크립트를 만드는 것은 간단합니다.

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

그렇지만WHERE상대적으로 느립니다.

아래는 WH입니다.더 빠르고 조금 더 많이 하는 BAT 스크립트.다음과 같은 이유로 광범위한 지연 확장 토글링을 사용합니다. 1) 따옴표로 묶지 않은 특수 문자가 있는 경우 %PATH%를 확장할 수 없습니다. 2) 지연 확장을 사용하는 동안 FOR 변수를 확장하면 다음을 포함하는 값이 손상됩니다.!.

::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

갱신하다

PATH 어딘가에 동일한 root 이름의 exe 파일이 존재하는 경우 내부 명령어를 외부로 잘못 기재하고 있어 위 스크립트를 크게 수정해야 했습니다.

언급URL : https://stackoverflow.com/questions/11009598/whats-the-cmd-powershell-equivalent-of-which-on-bash