windows - command prompt




Windowsのコマンドラインに「which」と同等のものがありますか? (15)

JPSoftのTCCおよびTCC / LEは、重要な機能を追加するCMD.EXEの置き換えです。 OPの質問に関連しています。 whichは、TCCファミリコマンドプロセッサの組み込みコマンドです。

私は時々パスの問題を抱えています。私自身のcmdスクリプトの1つが別のプログラム(パスの前)に隠されている(影になっている)ので、私はWindowsのコマンドラインでプログラムへのフルパスを見つけることができます。その名前だけ。

UNIXコマンド 'which'に相当するものはありますか?

UNIXでは、これらのシャドウイングの問題を簡単に見つけて修復するために、指定されたコマンドのフルパスを表示します。


PowerShellがインストールされている場合(私はこれをお勧めします)、以下のコマンドをおおまかなものとして使用できます(実行可能ファイル名の代わりにprogramNameを使用してください)。

($Env:Path).Split(";") | Get-ChildItem -filter programName*

その他の情報: http://www.codeassassin.com/blog/PermaLink,guid,fd1967d1-f844-4e29-82e2-f2d6424b4ef9.aspx : http://www.codeassassin.com/blog/PermaLink,guid,fd1967d1-f844-4e29-82e2-f2d6424b4ef9.aspx


PowerShellのget-commandは、 $Env:PATHどこかに実行ファイルがあります。

get-command eventvwr

CommandType   Name          Definition
-----------   ----          ----------
Application   eventvwr.exe  c:\windows\system32\eventvwr.exe
Application   eventvwr.msc  c:\windows\system32\eventvwr.msc

また、PowerShellのコマンドレット、関数、エイリアス、現在のシェル用に定義された$Env:PATHEXTなどのカスタム実行可能ファイル拡張子を持つファイル(bashのtype -a foo似ています)を見つけますwhere.exeこれらのPowerShellコマンドを認識していないwhere.exewhich.exeなどです。

あなたはsal which gcmset-alias which get-command短い形式のset-alias which get-command sal which gcmエイリアスを素早く設定することができます。


PowerShellのプロファイルに 'which'という名前の関数があります

function which {
    get-command $args[0]| format-list
}

出力は次のようになります。

PS C:\Users\fez> which python


Name            : python.exe
CommandType     : Application
Definition      : C:\Python27\python.exe
Extension       : .exe
Path            : C:\Python27\python.exe
FileVersionInfo : File:             C:\Python27\python.exe
                  InternalName:
                  OriginalFilename:
                  FileVersion:
                  FileDescription:
                  Product:
                  ProductVersion:
                  Debug:            False
                  Patched:          False
                  PreRelease:       False
                  PrivateBuild:     False
                  SpecialBuild:     False
                  Language:

Windows Server 2003以降(Windows XP 32ビット以降のものwhichでは、実行可能なコマンドだけでなく、すべての種類のファイルに一致しますが、何whichwhich実行するwhere.exeプログラムが用意されています。 (これはcdような組み込みのシェルコマンドとは一致しません)。ワイルドカードも受け付けます。したがってwhere nt*%PATH%と現在のディレクトリの中でnt始まるすべてのファイルを見つけます。

where /?試してくださいwhere /? 助けを求めて

Windows PowerShellではWhere-ObjectコマンドレットのエイリアスとしてWhere-Object定義されているため where.exeが必要な場合は、 .exe拡張子を省略する代わりにフルネームを入力する必要があります。


Windowsのそれ以降のバージョンにはwhereコマンドがありますが、次のように環境変数修飾子を使用してWindows XPでこれを行うこともできます。

c:\> for %i in (cmd.exe) do @echo.   %~$PATH:i
   C:\WINDOWS\system32\cmd.exe

c:\> for %i in (python.exe) do @echo.   %~$PATH:i
   C:\Python25\python.exe

余分なツールは必要ありませんPATH限らず、使用する環境変数(パス形式)を置き換えることができます。

そして、PATHEXT(Windows自体のように)のすべての拡張機能を処理できるものを望むなら、これはトリックを行います:

@echo off
setlocal enableextensions enabledelayedexpansion

:: Needs an argument.

if "x%1"=="x" (
    echo Usage: which ^<progName^>
    goto :end
)

:: First try the unadorned filenmame.

set fullspec=
call :find_it %1

:: Then try all adorned filenames in order.

set mypathext=!pathext!
:loop1
    :: Stop if found or out of extensions.

    if "x!mypathext!"=="x" goto :loop1end

    :: Get the next extension and try it.

    for /f "delims=;" %%j in ("!mypathext!") do set myext=%%j
    call :find_it %1!myext!

:: Remove the extension (not overly efficient but it works).

:loop2
    if not "x!myext!"=="x" (
        set myext=!myext:~1!
        set mypathext=!mypathext:~1!
        goto :loop2
    )
    if not "x!mypathext!"=="x" set mypathext=!mypathext:~1!

    goto :loop1
:loop1end

:end
endlocal
goto :eof

:: Function to find and print a file in the path.

:find_it
    for %%i in (%1) do set fullspec=%%~$PATH:i
    if not "x!fullspec!"=="x" @echo.   !fullspec!
    goto :eof

それは実際にすべての可能性を返しますが、特定の検索ルールに対しては簡単に調整できます。



cygwinを解決策としてまだ誰も言及していないことに驚いた。 サードパーティのソリューションを使用しても構わない場合は、cygwinを使用してください。

Cygwinは、Windows環境での* nixの快適さを提供します(Windowsのコマンドシェルで使用することも、* nixシェルを使用することもできます)。 これは、Windows用の* nixコマンドのホスト全体を提供し、そのディレクトリをあなたのPATH含めることができます。


ここからunxutilsを入手してください: http://sourceforge.net/projects/unxutils/ ://sourceforge.net/projects/unxutils/

Windowsプラットフォーム上のgoldは、標準のWindows DOS上にすばらしいUnixユーティリティを置いています。 何年も使っています。

それは含まれています。 ただし、大文字と小文字は区別されます。

NB:インストールするにはどこかでzipを展開し、... \ UnxUtils \ usr \ local \ wbin \をシステムパスのenv変数に追加してください。


このバッチファイルは、CMD変数処理を使用して、パスで実行されるコマンドを検索します。 注:現在のディレクトリは常にパスの前に実行されます)、使用されるAPI呼び出しに応じて、パスの前後に他の場所が検索されます。

@echo off
echo. 
echo PathFind - Finds the first file in in a path
echo ======== = ===== === ===== ==== == == = ====
echo. 
echo Searching for %1 in %path%
echo. 
set a=%~$PATH:1
If "%a%"=="" (Echo %1 not found) else (echo %1 found at %a%)

set /?参照してくださいset /? 助けを求めて


呼び出すWindows CMDのwhere

$ where php
C:\Program Files\PHP\php.exe


私がインターネット上で見つけることができるUnixのWin32ポートは、いずれもこれらの欠点を1つ以上持つため、

  • Windows PATHEXT変数はサポートされていません。 (これは、パスをスキャンする前に各コマンドに暗黙的に追加された拡張機能のリストを定義し、どの順番で使用するかを定義します)(私は多くのtclスクリプトを使用しています。
  • cmd.exeコードページはサポートされていないため、ASCII以外の文字でパスを正しく表示できません。 (私はそれに非常に敏感です、私の名前でç:-))
  • cmd.exeとPowerShellコマンドラインの個別の検索ルールはサポートされていません。 (PowerShellウィンドウでは.ps1スクリプトが見つかるが、cmdウィンドウでは公開されていないツールは見つからない)

だから、私は結局私のことを書きました。

そこにある: http://jf.larvoire.free.fr/progs/which.exe : http://jf.larvoire.free.fr/progs/which.exe


私はNed Batchelderに似たツールを作っています:

PATHの.dllと.exeファイルを検索する

私のツールはさまざまなdllバージョンを検索するためのものですが、より多くの情報(日付、サイズ、バージョン)を表示しますが、PATHEXTは使用しません。


私はしばらくの間、 whichモジュールをnpmから使いましたhttps://www.npmjs.com/package/whichそれはとてもうまく動作します: https://www.npmjs.com/package/which : https://www.npmjs.com/package/whichこれは素晴らしいマルチプラットフォームの代替手段です。

今私はGitに付属のwhichに切り替えました。 パスにGitの/usr/binパスを追加するだけです。通常はC:\Program Files\Git\usr\bin\which.exeです。 whichバイナリはC:\Program Files\Git\usr\bin\which.exeます。 それはより速く、期待どおりに動作します。





path-variables