Windows komut isteminden başlatıldığında hangi uygulamanın çalıştığını öğrenin


0

% PATH% ortam değişkeninize ekleyebileceğiniz dizin sayısı nedeniyle, uygulama adları arasında kasıtsız çakışmaların olması çok kolaydır. Yemin ettim daha önce bu ipucuyla karşılaştım, ama hiçbir yerde bulamıyorum. Uygulamanın bulunduğu dizini görmenin komut isteminde bir yolu var mı? Örneğin, aşağıdakine benzer bir şey arıyorum:

C:\> xcopy
Invalid number of parameters
0 File(s) copied

C:\> **SOME_COMMAND** xcopy
C:\Windows\System32\xcopy.exe

Doğru anlarsam, GNU "hangi" komutuna benzer bir şey arıyorsun.
Moshe

Yanıtlar:


1

Eğer pencerelerde komut satırını isterseniz biraz ağır ama denemek için kendine borçlusun Cygwin . PATH'nize \ bin klasörünü yerleştirin ve en azından whichtam olarak hangi dosyayı çalıştıracağınızı söyleyen çok sayıda harika araç sahibi olacaksınız :)

(Ve evet, orada çok fazla olmanıza yardım etmek için PATH'inize eklemenin ironisini anlıyorum)

düzenleme: Bu da uygun olabilir.


which! Düşündüğüm buydu. Cygwin, aradığım şey için tamamen üstesinden gelecektir. Windows için tam Unix Araçları bile ihtiyacım olandan fazla olurdu. whichYine de Windows için belirli bir eşdeğer komutun olduğuna yemin edebilirdim .
Ajan_9191

4

Where.exe, unices üzerindeki Windows eşittir. Windows Server 2003+ veya Vista + kullanıyorsanız, bu araç% windir% / System32 konumuna yüklenir. Komut kabuğundaki (cmd.exe) "where" kullanarak yol arama sırasındaki sonuçları gösterir:

C:\> where where
C:\Windows\System32\where.exe

PowerShell’in tipik olarak as where ’nesnesini Where-Object olarak adlandırdığından, PowerShell’den nereyi çağırırken '.exe’yi eklemeniz gerekir:

C:\> where.exe where
C:\Windows\System32\where.exe

Ayrıca bkz. Windows whereis eşdeğeri?


2

İşte istediğinizi yapacak basit bir banyo dosyası.

@for %%e in (%PATHEXT%) do @for %%i in (%1%%e) do @if NOT "%%~$PATH:i"=="" echo %%~$PATH:i

whereis xcopy - çalışır whereis xcopy.exe - işe yaramazsa

Umarım yardımcı olur (biraz)

Saygılarımızla


Neredeyse PATHEXT değişkeninde faktörü unuttum, teşekkürler. Ancak, aradığı dosya konumunda ve uzantısında sınırlıdır. Yani aradığım şeye tam olarak uymuyor, ama kesinlikle bana harika bir başlangıç ​​noktası verdi.
Ajan_9191

1

Mick'in cevabına ve Phoshi'nin cevabına dayanarak aradığım çözümü buldum. Passed parametresinin bulunduğu ilk yeri bulmak için tüm PATHEXT'ler ve PATH'ler arasında dolaşan bir AutoIt betiği yarattım. Hem uzantı-az hem de uzatma-tam parametrelerini işler. Önce yerel çalışma dizinini, sonra çevre değişkenlerini arar. Her şeyi okuduğum kadarıyla, Windows bu komutu da aradı. İşte senaryo:

If $CmdLine[0] > 0 Then
    $commandToFind = $CmdLine[1]
    $matchFound = false
    $foundPath = ""
    $pathEnvironmentVariable = EnvGet("PATH")
    $pathDirectories = StringSplit($pathEnvironmentVariable, ";", 2)
    $pathExtensionsEnvironmentVariable = EnvGet("PATHEXT")
    $pathExtensions = StringSplit($pathExtensionsEnvironmentVariable, ";", 2)

    ; Search the local directory first for the file
    If FileExists($commandToFind) Then
        $matchFound = true
        $foundPath = @WorkingDir & "\" & $commandToFind
    EndIf

    For $pathExtension In $pathExtensions
        $fullPath = @WorkingDir & "\" & $commandToFind & StringLower($pathExtension)
        If FileExists($fullPath) Then
            $matchFound = true
            $foundPath = $fullPath
            ExitLoop
        EndIF
    Next

    If Not $matchFound == true Then
        ; Loop through all the individual directories located in the PATH environment variable
        For $pathDirectory In $pathDirectories
            If FileExists($pathDirectory) Then
                $pathWithoutExtension = $pathDirectory & "\" & $commandToFind

                ; Check if the command exists in the current path. Most likely the parameter had the extension passed in
                If FileExists($pathWithoutExtension) Then
                    $matchFound = true
                    $foundPath = $pathWithoutExtension
                    ExitLoop
                EndIf

                If Not $matchFound == true Then
                    ; Loop through all possible system extensions to see if the file exists.
                    For $pathExtension In $pathExtensions
                        $fullPath = $pathWithoutExtension & StringLower($pathExtension)
                        If FileExists($fullPath) Then
                            $matchFound = true
                            $foundPath = $fullPath
                            ExitLoop
                        EndIf
                    Next
                EndIf

                If $matchFound == true Then
                    ExitLoop
                EndIf
            EndIf
        Next
    EndIf
    If $matchFound == true Then
        ConsoleWrite("Located at " & $foundPath & @CRLF)
    Else
        ConsoleWriteError("Unable to locate the command" & @CRLF)
    EndIf
EndIf

Çalışması için, AutoIt (kısayol başlıklı Compile Script to .exe) ile birlikte gelen Aut2exe.exe programını çalıştırmanız ve "Konsol?" Seçeneğini işaretlemeniz gerekir. derlerken onay kutusu. Ben sadece varolan bir yol dizininde (benzeri C:\Windows\System32) attığım "which.exe" adlı bir dosyaya derlemek .


1

UNIX GNU araçları, Windows bağlantı noktalarında bulunur; yukarıdaki gibi komut dosyası çalıştırmanın acısını kullanmanıza gerek yoktur. Hangi komut xcopy veya xcopy.exe veya BAT dosyaları dahil diğer yürütülebilir dosyalar verildiğinde çalışır. Bunlar indirilebilir:

http://gnuwin32.sourceforge.net/packages.html

Çok kullanışlılar.


Ne bulduğumdan memnun olmama rağmen, bu diğer araçlar için de iyi bir kaynak.
Ajan_9191,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.