Capisco che in un file batch di Windows, %*
espande a tutti gli argomenti della riga di comando, e che shift
turni gli argomenti della riga di comando numerati %1
, %2
, ecc, ma che non modificare il contenuto di %*
.usando `% *` `dopo shift`
Cosa devo fare se voglio una versione di %*
che fa riflettono l'effetto di shift
? Capisco che potrei semplicemente dire %1 %2 %3 %4 %5 %6 %7 %8 %9
dopo aver cambiato, ma sembra stupido e potenzialmente pericoloso che mi limita ad un numero fisso di argomenti.
Anche se questa non è una domanda specifica per Python, può aiutare a capire che la ragione per cui voglio questo comportamento è che ho dovuto scrivere un file batch SelectPython.bat
che preconfigura determinate variabili d'ambiente, per navigare la babele di diverse distribuzioni Python che ho (devi impostare %PYTHONHOME%
, %PYTHONPATH%
e %PATH%
in determinati modi prima di poter chiamare il binario di Python e avere la certezza che otterrai la giusta distribuzione). Il mio script corrente funziona bene per impostare queste variabili, ma vorrei essere in grado di chiamare e Python in una sola riga - ad esempio:
SelectPython C:\Python35 pythonw.exe myscript.py arg1 arg2 arg3 ...
Idealmente voglio che il mio file batch per usare shift
di "mangiare" il primo argomento, lo elabora di conseguenza e imposta l'ambiente, quindi esegue automaticamente in modo automatico la stringa formata dal resto degli argomenti. Il principio è analogo al modo in cui env
avvolge i comandi nei sistemi POSIX:
env FOO=1 echo $FOO # wrap the `echo` command to be executed in the context of specified environment settings
Finora ho questo - l'ultima riga è dove il problema è:
@echo off
set "LOC=%CD%
if not "%~1" == "" set "LOC=%~1
if exist "%LOC%\python.exe" goto :Success
echo "python.exe not found in %LOC%"
goto :eof
:Success
:: Canonicalize the resulting path:
pushd %LOC%
set "LOC=%CD%
popd
:: Let Python know where its own files are:
set "PYTHONHOME=%LOC%
set "PYTHONPATH=%LOC%;%LOC%\Lib\site-packages
:: Put Python's location at the beginning of the system path if it's not there already:
echo "%PATH%" | findstr /i /b /c:"%PYTHONHOME%" > nul || set "PATH=%PYTHONHOME%;%PYTHONHOME%\Scripts;%PATH%
:: Now execute the rest:
shift
if "%~1" == "" goto :eof
%1 %2 %3 %4 %5 %6 %7 %8 %9
:: This is unsatsifactory - what if there are more than 9 arguments?
UPDATE: Grazie a Stephan la mia soluzione di lavoro ora ha la seguente sezione modificata:
:: Now execute the rest of the arguments, if any:
shift
if @%1 == @ goto :eof
set command=
:BuildCommand
if @%1 == @ goto :CommandFinished
set "command=%command% %1"
shift
goto :BuildCommand
:CommandFinished
%command%
Impossibile assegnare tutti gli argomenti a una variabile, quindi utilizzare la sostituzione di stringhe per rimuovere il primo. – Squashman
Hmm, sembra una potenziale via da seguire. Ma senza il potere delle regex corrette, non sono sicuro che saprei come gestire potenziali citazioni e spazi in modo appropriato con questo approccio. Funzionerebbe per 'SelectPython" C: \ Program Files \ Oh dio perché l'ho installato qui \ Python27 "python -c" print 'hello' "'? – jez