Мне нужно изменить командный файл (написанный бывшим сотрудником), который использует цикл for %% f в (% *) do (...) для работы с каждым параметром командной строки. Новое требование заключается в том, что имя каталога будет добавлено к пакетному вызову, и этот каталог должен использоваться для каждого параметра с относительным путем. Например:

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

следует перевести на:

DoJob.bat "E:\Jan 2012\Fin.txt" "D:\Ref Quotes\*. Pdf" "E:\Jan 2012\..\*. Документ»

Когда у меня есть последний параметр командной строки в переменной, я могу добавить его к каждому параметру, который не содержит двоеточия (и, следовательно, является относительным путем). Но моя проблема в том, как мне получить этот последний параметр командной строки и как сделать цикл выше для остановки обработки предпоследнего параметра?

(Пожалуйста, не предлагайте альтернативы пакетным файлам; я уже спросил, и единственный доступный вариант - изменить существующий.)

1 ответ1

0

Вы можете использовать SHIFT и цикл для просмотра всех аргументов командной строки. Поскольку SHIFTing будет использовать каждый аргумент, вы захотите сделать это в подпрограмме. Подпрограмма, которую я здесь представляю, также подсчитывает аргументы, так что вы знаете, сколько из них нужно просмотреть позже.

@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

Поскольку мы используем SHIFT, этот процесс работает с вашей исходной командной строкой ...

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

и список аргументов, число которых превышает 9, что могло бы вызвать проблемы, если бы вы использовали% 1 -% 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .