2013-11-14 2 views
2

У меня есть массив в пакетном файле, который содержит несколько файловых каталогов. Я хотел бы удалить первые три элемента массива и все сдвинуть (т. Е. Четвертый элемент заменяет первое, пятый элемент занимает второе место, шестое занимает место третьего и т. Д.). Это что-то, что можно сделать в Batch-скрипте?Удаление элементов из массива в пакетном файле

Пример:

[directoryA, directoryB, directoryC, directoryD, directoryE, directoryF] 

изменяется на:

[directoryD, directoryE, directoryF] 

Вот код, у меня есть для "массив":

set paramCount=0 
for %%x in (%*) do (
    set /A paramCount+=1 
    set "dirs[!paramCount!]=%%x" 
) 
+0

, который представляет собой пакетный скрипт? DOS/WINDOWS? –

+0

К сожалению, забыл упомянуть об этом. Я пишу базовый файл Windows .bat. Я только начинаю с пакетных скриптов, поэтому я не уверен, что это тот ответ, который вы ищете. – DerStrom8

+0

Какую версию Windows вы используете? Windows 7? 8? МЕНЯ? –

ответ

2

Лучшее был я могу думать для этого нужно иметь два «массива», один для данных, другой для того, действительно ли данные действительны. Пример кода ниже создает один массив «dirs», содержащий любые параметры командной строки, а другой «valid», а затем печатает только «действительные» данные от dirs.

valid[i] будет равен 1, если и только если данные в dirs[i] действительны. Любое другое значение в valid[i] будет указывать на то, что данные в dirs[i] следует игнорировать.

@echo off 
setlocal enabledelayedexpansion 

set paramCount=0 
for %%x in (%*) do (
    echo %%x 
    set /A paramCount+=1 

    REM Add data to dirs array 
    set "dirs[!paramCount!]=%%x" 

    REM Add valid flag to valid array 
    set "valid[!paramCount!]=1" 
) 

echo Printing... 

REM Delete element at index 2 
set valid[2]=0 

REM Print the modified array 
for /L %%a in (1 1 %paramCount%) do (
    IF !valid[%%a]!==1 (echo !dirs[%%a]!) 
) 

Результат:

$>deletetest.bat 1 2 3 4 
1 
2 
3 
4 
Printing... 
1 
3 
4 
+0

Очень интересная идея. Я так и не подумал сделать это. То, что я закончил, это установить первые три элемента равными нулю, а затем создать другой «массив», используя цикл for. Цикл for будет проходить через dirs, проверьте, является ли их значение нулевым, и если это не так, он добавит его в новый «массив». Затем я использовал новый массив для справки. Спасибо всем за помощь! – DerStrom8

+0

Этот же метод возник из-за меня, но он немного более подробный, чем метод выше (требуется полная перестройка массива после любой модификации), в то время как вышеприведенное решение позволяет в любой момент перестроить. –

+0

У вас там очень хорошая точка. Сейчас я просто пытаюсь заставить его работать, и в конце концов я буду делать тонкую настройку и очистку. Я могу отключить более подробные сегменты кода, когда придет время, и вы очень помогли. Я буду использовать это как принятый ответ и, вероятно, воспользуюсь им позже. – DerStrom8

2

Простите. Я хотел бы сказать несколько акров по этой теме.

У вас есть не указано , где ваш «массив». Вы можете хранить его в переменной, например:

set dirs=directoryA directoryB directoryC directoryD directoryE directoryF 

Однако это не массив, но список. Вы можете создать этот список из параметров подпрограммы так:

set dirs=%* 

Если вы хотите, чтобы удалить первые три элемента из этого списка, вы можете сделать это следующим образом:

for /F "tokens=3*" %%a in ("%dirs%") do set dirs=%%b 

Другая возможность состоит в том, что каталоги были переданы в подпрограмму в виде списка в параметров:

call :subroutine directoryA directoryB directoryC directoryD directoryE directoryF 

Я думаю, что это случай, основанный на вашем примере.В этом случае очень легко «удалить» первые три параметра с помощью трех shift команд:

:subroutine 
rem Remove first three parameters: 
shift 
shift 
shift 
rem Process the rest of parameters: 
:nextParam 
    if "%1" equ "" goto endParams 
    echo Next param is: %1 
    shift 
goto nextParam 
:endParams 

Однако, если у вас есть «реальный» массив (с числовыми индексами, которые начинаются с 1), что также может быть создан из списка параметров для подпрограммы таким образом (как в вашем примере):

set paramCount=0 
for %%x in (%*) do (
    set /A paramCount+=1 
    set "dirs[!paramCount!]=%%x" 
) 

Затем вы можете удалить первые три элемента таким образом:

for /L %%i in (4,1,%paramCount%) do (
    set /A j=%%i-3 
    set dirs[!j!]=!dirs[%%i]! 
) 
set /A paramCount-=3 
+0

Этот пост был очень информативным, спасибо. Я должен был немного отступить. Я называю этот пакетный файл из моей java-программы. Я передаю несколько строк в качестве параметров, используя массив «commands []», предлагаемый Java API для метода Runtime.getRuntime(). Exec(). Каждый каталог передается как параметр. Затем я обращаюсь к этим параметрам и использую их для установки локальных переменных, которые я могу использовать позже в скрипте. Надеюсь, это прояснит некоторые вещи. – DerStrom8

Смежные вопросы