Finne den fullstendige banen til en kommando på Windows-kommandolinjen

Finne den fullstendige banen til en kommando på Windows-kommandolinjen
Finne den fullstendige banen til en kommando på Windows-kommandolinjen

Introduksjon: Avdekke skjulte kommandobaner på Windows

Banekonflikter kan være et hyppig problem for utviklere som arbeider med skript og kommandoer på Windows-kommandolinjen. Når et av skriptene dine blir overskygget av et annet program på grunn av dets plassering i banen, blir det avgjørende å identifisere hele banen til en gitt kommando. Dette scenariet fører ofte til at brukere søker etter en ekvivalent av UNIX 'which'-kommandoen, som forenkler å finne den nøyaktige banen til en kommando.

På UNIX-systemer brukes 'which'-kommandoen til å vise hele banen til en spesifisert kommando, og hjelper til med å løse slike skyggeproblemer. Imidlertid kan Windows-brukere lure på om det er et lignende verktøy tilgjengelig på plattformen deres. I den følgende diskusjonen vil vi utforske alternativene som er tilgjengelige på Windows for å oppnå samme funksjonalitet og hjelpe deg med å håndtere sti-relaterte problemer effektivt.

Kommando Beskrivelse
setlocal Begynner lokalisering av miljøvariabler i en batch-fil, og sikrer at endringer ikke påvirker det globale miljøet.
for %%i in ("%command%") do Itererer gjennom det angitte settet med elementer, slik at operasjoner kan utføres på hvert element.
if exist "%%j\%%~i.exe" Sjekker om det finnes en spesifikk fil på den angitte banen.
param Definerer og henter parametrene som sendes til et PowerShell-skript.
Join-Path Kombinerer to eller flere strenger til en bane, og håndterer skilletegn på riktig måte i PowerShell.
Test-Path Verifiserer eksistensen av en spesifisert bane eller fil i PowerShell.
os.pathsep Henter baneseparatoren som brukes av operativsystemet, vanligvis et semikolon (;) på Windows.
os.access(exe, os.X_OK) Sjekker om en fil er kjørbar i Python.

Forstå Windows kommandolinjeskript

I skriptene som følger med, er hvert utformet for å etterligne funksjonaliteten til UNIX which kommando, som brukes til å finne hele banen til en kommando. Det første skriptet bruker en batchfil for Windows-ledeteksten. Det begynner med setlocal for å lokalisere endringer i miljøvariabler. Skriptet setter deretter kommandonavnet til variabelen %command% og sjekker om den er tom. De for %%i in ("%command%") do loop itererer gjennom katalogene som er oppført i PATH miljøvariabel. Innenfor denne sløyfen er if exist "%%j\%%~i.exe" sjekker om den kjørbare filen finnes i gjeldende katalog i løkken. Hvis den blir funnet, sender den ut banen og avslutter.

Det andre skriptet, skrevet i PowerShell, begynner med å definere parametere med param. Skriptet henter kommandonavnet og deler opp PATH miljøvariabel inn i individuelle kataloger ved hjelp av $env:PATH -split ';'. De Join-Path kommando kombinerer hver katalog med kommandonavnet for å danne potensielle kjørbare stier. Den bruker da Test-Path for å sjekke om disse banene finnes. Hvis den kjørbare filen blir funnet, sender den ut banen og avsluttes. Det tredje skriptet, skrevet i Python, definerer en funksjon which for å søke etter kommandoen i kataloger oppført i PATH miljøvariabel. Det bruker 1. 3 for å få systemets baneskiller og os.access for å sjekke for kjørbarhet. Dette skriptet kjøres med et kommandolinjeargument som spesifiserer kommandonavnet, og det skriver ut hele banen hvis kommandoen blir funnet.

Bestemme den fullstendige banen til en kommando i Windows

Bruke Windows Ledetekst

@echo off
setlocal
set "command=%1"
if "%command%"=="" (
  echo Usage: %~n0 command_name
  exit /b 1
)
for %%i in ("%command%") do (
  for %%j in (".;%PATH:;=;.;%;") do (
    if exist "%%j\%%~i.exe" (
      echo %%j\%%~i.exe
      exit /b 0
    )
  )
)
echo %command% not found
endlocal

Finne kommandobaner i PowerShell

Bruker PowerShell-skript

param (
  [string]$command
)
if (-not $command) {
  Write-Output "Usage: .\script.ps1 command_name"
  exit 1
}
$path = $env:PATH -split ';'
foreach ($dir in $path) {
  $exe = Join-Path $dir $command.exe
  if (Test-Path $exe) {
    Write-Output $exe
    exit 0
  }
}
Write-Output "$command not found"

Finne kommandoplasseringer med Python

Bruker Python Script

import os
import sys
def which(command):
    path = os.getenv('PATH')
    for dir in path.split(os.pathsep):
        exe = os.path.join(dir, command)
        if os.path.isfile(exe) and os.access(exe, os.X_OK):
            return exe
    return None
if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Usage: python script.py command_name")
        sys.exit(1)
    command = sys.argv[1]
    path = which(command)
    if path:
        print(path)
    else:
        print(f"{command} not found")

Avanserte banebehandlingsteknikker i Windows

Utover å bare finne hele banen til en kommando, administrere PATH miljøvariabelen er avgjørende for å unngå konflikter og sikre jevn utførelse av skript. I Windows kan man bruke System Properties-grensesnittet til å redigere PATH variabel, men dette kan være tungvint for hyppige endringer. I stedet bruker du setx kommandoen i ledeteksten eller PowerShell kan gi en mer effektiv måte å administrere disse variablene på. De setx kommandoen lar brukere angi miljøvariabler vedvarende, noe som er nyttig for skript som krever at spesifikke verktøy eller applikasjoner prioriteres i PATH.

Et annet nyttig verktøy er where kommando, som er et innebygd Windows-verktøy som oppfører seg på samme måte som UNIX which kommando. De where kommandoen kan finne og vise banene til kjørbare filer som samsvarer med søkekriteriene. For eksempel løping where python i ledeteksten vil liste alle plasseringer av Python kjørbare som finnes i PATH. Dette kan være spesielt nyttig for å identifisere og løse konflikter når flere versjoner av et verktøy er installert. Ved å kombinere bruken av setx og where, kan brukere bedre administrere miljøet sitt og sikre at de riktige versjonene av kommandoer blir utført.

Ofte stilte spørsmål om kommandobaneproblemer

  1. Hva er where kommando i Windows?
  2. De where kommandoen i Windows finner og viser banene til kjørbare filer som samsvarer med søkekriteriene.
  3. Hvordan redigerer jeg PATH miljøvariabel?
  4. Du kan redigere PATH variabel gjennom systemegenskaper-grensesnittet eller ved å bruke setx kommando i ledetekst eller PowerShell.
  5. Kan jeg bruke PowerShell til å finne banen til en kommando?
  6. Ja, PowerShell kan brukes til å finne banen til en kommando ved å bruke et skript som itererer gjennom katalogene som er oppført i PATH miljøvariabel.
  7. Hva er forskjellen mellom setx og set i ledeteksten?
  8. De set kommandoen setter miljøvariabler kun for gjeldende økt, while setx setter dem vedvarende på tvers av økter.
  9. Hvordan kan jeg sjekke om en fil er kjørbar i Python?
  10. Du kan sjekke om en fil er kjørbar i Python ved å bruke os.access(file, os.X_OK).
  11. Hva gjør 1. 3 gjøre i Python?
  12. De 1. 3 attributt gir baneseparatoren som brukes av operativsystemet, som er et semikolon (;) på Windows.

Siste tanker:

Effektiv administrasjon og lokalisering av kommandostier på Windows-kommandolinjen er avgjørende for å unngå konflikter og sikre korrekt skriptutførelse. Ved å bruke batchfiler, PowerShell-skript og Python, kan brukere replikere funksjonaliteten til UNIX-kommandoen 'hvilken'. I tillegg kan utnyttelse av verktøy som where-kommandoen og administrasjon av PATH-variabelen strømlinjeforme denne prosessen ytterligere. Disse teknikkene gir robuste løsninger for å opprettholde et rent og effektivt utviklingsmiljø, og hjelper brukere raskt å identifisere og løse sti-relaterte problemer.