Comando di Windows con cartella relativa a PATH


3

Dalla riga di comando di Windows, se sono in c: \ foo e c: \ bar è sul mio PERCORSO.
C'è un modo per chiamare '\ bin \ myapp.exe' e farlo cercare nel mio percorso per richiamare c: \ bar \ bin \ myapp.exe?
forse un prefisso / variabile di ambiente o un programma di utilità standard?

Credo che quanto sopra funzionerebbe bene su un sistema Macos / Linux (?) E funziona bene in Windows se non ci fossero informazioni sulla cartella nel comando (ad es. C: \ bar \ bin è sul percorso e chiamo myappe.exe)

Aggiornare - questo è per uno script che non conosce la directory di installazione (di terze parti), ma sa solo che la directory di base si trova sul percorso (e il nome di exe è abbastanza unico da non essere in grado di entrare in collisione con un'app con lo stesso nome). Probabilmente potrei scrivere uno script per trovarlo (grep), speravo che ci fosse un trucco facile (opzione cmd.exe, ecc.) Per consentire il nome della sottocartella nel comando, in modo simile a come consentirebbe unix


L'installazione di terze parti scrive qualcosa nel registro?
DavidPostill

Sfortunatamente no
bitcoder

Risposte:


1

Leggere Argomenti della riga di comando (parametri) o call /?:

…
If Command Extensions are enabled CALL changes as follows:
…
In addition, expansion of batch script argument references (%0, %1,
etc.) have been changed as follows:
…
        %~$PATH:1   -  searches the directories listed in the PATH
                       environment variable and expands %1 to the fully
                       qualified name of the first one found.  If the
                       environment variable name is not defined or the
                       file is not found by the search, then this
                       modifier expands to the empty string
…

Il FOR comando crea variabili parametro che vengono identificate   con una lettera anziché un numero (ad es. %%G ). Il parametro   Le espansioni descritte sopra possono anche essere applicate a queste.

Applica sopra al tuo caso (nota la doppia percentuale di accesso %%g per l'utilizzo in a .bat o .cmd sceneggiatura):

for %%g in ("bin\myapp.exe") do @set "_pathToMyApp=%%~$PATH:g"
rem         ↑↑  NO leading backslash
rem next line calls `myapp.exe` using its fully qualified name
"%_pathToMyApp%"

Un esempio reale: (nota singola percentuale di accesso %g per l'utilizzo dal prompt dei comandi in un aperto cmd finestra). Mio PATH variabile legge come …;C:\Utils\;… senza ulteriore riferimento a C:\Utils cartella ( directory di base ), myapp.exe è una semplice applicazione che mostra tutti i parametri forniti:

d:\bat> myapp.exe
'myapp.exe' is not recognized as an internal or external command,
operable program or batch file.

d:\bat> bin\myapp.exe
The system cannot find the path specified.

d:\bat> set _
Environment variable _ not defined

d:\bat> for %g in ("bin\myapp.exe") do @set "_pathToMyApp=%~$PATH:g"

d:\bat> set _
_pathToMyApp=C:\Utils\bin\myapp.exe

d:\bat> "%_pathToMyApp%" display all parameters
param 0 = C:\Utils\bin\myapp.exe
param 1 = display
param 2 = all
param 3 = parameters

d:\bat>

Questo ha funzionato alla grande, ben pensato. Non al 100% quello che speravo sarebbe stata la risposta, ma mi ha fatto conoscere il mio problema. (sfortunatamente faccio la maggior parte dei post su StackOverflow quindi la mia reputazione qui su superuser non è sufficiente per farti passare correttamente, ho bisogno di almeno 15 rep)
bitcoder

2

In Windows puoi impostare le tue variabili d'ambiente e poi usarle. Quindi potresti andare a:

  • Pannello di controllo
  • Sistema
  • Impostazioni avanzate di sistema
  • Scheda Avanzate
  • variabili ambientali

Quindi fai clic su "nuovo" e aggiungi la tua variabile. È quindi possibile utilizzare quella variabile nei comandi. Quindi puoi semplicemente impostare il tuo percorso e usarlo come vuoi con qualsiasi nome tu gli dai.

Esempio:

Quindi nel tuo caso puoi impostare la seguente variabile: appNameBinPath = "C: \ bar" Potresti quindi usarlo nel seguente esempio:

C:\foo>%appNameBinPath%\bin\myapp.exe 

In alternativa se vuoi impostare una variabile permanente tramite script e / o riga di comando, puoi vedere questo articolo: https://stackoverflow.com/questions/5898131/set-a-persistent-environment-variable-from-cmd-exe


Il mio problema è che il mio script non conosce realmente la directory di base (potrebbe essere installata in posti diversi). La mia domanda iniziale non ha chiarito che, anche se così ho fatto un aggiornamento
bitcoder

Se lo script non conosce la directory di base e non si è certi di poterlo impostare manualmente per tutte le istanze nelle variabili di ambiente, non si avrà la possibilità di avere una funzione ricorsiva che guarderà attraverso directory per trovarlo. Questo potrebbe diventare disordinato anche se non si specifica un numero massimo di ricorsioni.
IronWilliamCash
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.