Extraindo o último parâmetro de linha de comando do arquivo de lote

0

Eu tenho que modificar um arquivo de lote (escrito por um ex-funcionário) que usa um para %% f em (% *) do (...) loop para operar em cada linha de comando parâmetro. O novo requisito é que um nome de diretório seja anexado à chamada em lote e esse diretório deve ser usado para cada parâmetro com um caminho relativo. Por exemplo:

DoJob.bat Fin.txt "D: \ Citações de referência \ *. pdf" .. \ *. doc "E: \ Jan 2012"

deve traduzir para:

DoJob.bat "E: \ Jan 2012 \ Fin.txt" "D: \ Ref Quotes \ * .pdf" "E: \ Jan 2012 \ .. \ *. doc"

Uma vez que eu tenha o parâmetro final de linha de comando em uma variável, eu posso colocar o prefixo em cada parâmetro que não contém dois pontos (e, portanto, é um caminho relativo). Mas meu problema é, como faço para obter este parâmetro de linha de comando final e como faço o loop parar o processamento no penúltimo parâmetro?

(Por favor, não sugira alternativas aos arquivos em lote; eu já indaguei e a única opção disponível é modificar o existente).

    
por Karan 04.08.2012 / 22:05

1 resposta

0

Você pode usar SHIFT e um loop para percorrer todos os argumentos da linha de comando. Como o SHIFTing consumirá cada argumento, você deverá fazê-lo em uma sub-rotina. A sub-rotina que eu apresento aqui também conta os argumentos, então você sabe quantos passarão depois.

@echo off

set argCount=0

call :GetLastArg %*

REM subtract 1 from arg count, so we know how many to process.
set /a argCount-=1

echo.
echo Arguments to Process: %argCount%
echo Last Argument: %lastArg%


echo.
echo Here are the other arguments:
echo.
:BeginArgProcessingLoop
if %argCount% == 0 goto EndArgProcessingLoop
set /a argCount-=1
echo %1
shift
goto BeginArgProcessingLoop
:EndArgProcessingLoop

goto :eof


REM This subroutine gets the last command-line argument by
REM using SHIFT. It also counts the number of arguments.
:GetLastArg
set /a argCount+=1
set "lastArg=%~1"
shift
if not "%~1"=="" goto GetLastArg
goto :eof

Como usamos SHIFT, esse processo funciona com sua linha de comando original ...

batch.cmd fin.txt "D:\Ref Quotes\*.pdf" ..\*.doc "E:\Jan 2012"

Arguments to Process: 3
Last Argument: E:\Jan 2012

Here are the other arguments:

fin.txt
"D:\Ref Quotes\*.pdf"
..\*.doc

e uma lista de argumentos maior que 9 em número, o que causaria problemas se você usasse% 1 a% 9 ...

batch.cmd fin.txt "D:\Ref Quotes\*.pdf" ..\*.doc manifesto.txt
87.docx "C:\Plans to Rule Earth\*.ppt" "Compromising Photos\*.jpg" "What's Up.do
c" "Gimme All Your Lovin'.mp3" out-of-funny-ideas.xls "E:\Jan 2012"

Arguments to Process: 10
Last Argument: E:\Jan 2012

Here are the other arguments:

fin.txt
"D:\Ref Quotes\*.pdf"
..\*.doc
manifesto.txt
87.docx
"C:\Plans to Rule Earth\*.ppt"
"Compromising Photos\*.jpg"
"What's Up.doc"
"Gimme All Your Lovin'.mp3"
out-of-funny-ideas.xls
    
por 04.08.2012 / 23:06