2016-03-02 1 views
0

Я хотел взять список файлов для удаления из пользователя в качестве аргумента. Одна строка для каждого аргумента.Пакетный скрипт Чтение нескольких строк Аргумент в переменной

Как сохранить список файлов, разделенных новой строкой в ​​переменной.

Я использую команду ниже.

Тогда я захотел повторить их по петле.

${p:DeleteFiles} будет заменен его значением из внешнего приложения, которое будет содержать список файлов, разделенных новой строкой. Я не могу его изменить.

+0

'$ {p: DeleteFiles} будет заменен ..., который будет содержать список файлов, разделенных новой строкой.' - Тогда он не будет работать в файле bach! Поскольку это не задает многострочную переменную, она просто устанавливает первую строку, а оставшиеся строки приводят к ошибкам. – jeb

ответ

0
@ECHO OFF 
SETLOCAL 
SET "deletionfiles=" 

:dloop 
SET "deleteme=" 
SET /p "deleteme=Which file to delete ? " 
IF DEFINED deleteme SET "deleteme=%deleteme:"=%" 
IF DEFINED deleteme SET "deletionfiles=%deletionfiles%,"%deleteme%""&goto dloop 
ECHO delete %deletionfiles:~1% 

GOTO :EOF 

Нет необходимости использовать новую строку. Ваша команда for (или команда del) будет прекрасно работать в списке, разделенном запятыми (или пробелами).

Обратите внимание, что существуют определенные символы, которые пакет использует для специальных целей, и обработка пакетной строки не может обрабатывать их ожидаемым образом. Эти символы включают %^ и &.

+0

Я получаю имя файла из внешнего приложения. я не могу изменить структуру ввода. Он будет содержать новую строку строки –

+0

Я отредактировал вопрос. посмотрите пожалуйста. –

0

$ {р: DeleteFiles} получит заменено его значение из внешнего приложения, который будет содержать список файлов, разделенных новыми line.I не может изменить его.

После замены пакетный файл выглядит следующим образом:

Set DeletionFiles=file1.jpg 
file2.jpg 
file3.jpg 
" 

Это не действительный пакетный файл больше.
Кроме того, это плохая идея для изменения самого командного файла, поскольку это работает только один раз.

Вы можете поместить ${p:DeleteFiles} в другой файл, например input.txt.

Ваша партия будет выглядеть

echo ${p:DeleteFiles} > input.txt 

<external program for replacing the DeleteFiles> input.txt 

for /F "tokens=*" %%A in (input.txt) do (
    echo File: %%A 
) 
0

Если я вас правильно понял, ваша внешняя программа будет генерировать список файлов. Затем вы хотите сохранить этот многострочный список переменной. Что вы хотите сделать с переменной после ее появления? Я предполагаю, что вы хотите удалить файлы, но ваш вопрос непонятен в этом вопросе, поэтому я постараюсь перекрыть ответ, чтобы его покрыть.

for /f "delims=" %%a in ('{command that generates your list}') do (
    echo Doing stuff to %%a... 
    echo %%a>>listOfFilesToDelete.txt 
    set var=%%a 
    if "%var:~0,7%"="DoNotDelete" copy "%%a" \someArchiveFolder\ 
    del "%%a" 
) 

Это будет читать каждую строку в списке генерируемой в качестве переменной %%a. Затем он будет do любых команд, которые вы указали. Таким образом, вы можете запустить команду для каждого из файлов в списке.В приведенном выше коде это

  1. Печать каждой строки в консоли, встроенной в какой-нибудь текст
  2. выводя его в файл
  3. Проверка первые 7 символов строки с указанной строкой, а затем скопировать его к папку, если она соответствует
  4. А затем удалить его

Если вам все еще нужно ссылаться на каждую строку из вашего сформированного списка, вы даже можете настроить массив типа структуры. (См Create list or arrays in Windows Batch)

setlocal EnableDelayedExpansion 
:: Capture lines in an 'array' 
set /a i=0 
for /f "delims=" %%a in ('dir /b') do (
    set /a i+=1 
    set var!i!=%%a 
) 

:: Loop through the 'array' 
for /L %%a in (1,1,%i%) do (
    echo Do more stuff with !var%%a! 
) 

Так же, как и выше, это будет читать каждую строку в списке генерируемой в качестве переменной %%a. Затем он установит переменную var!i!, равную значению текущей строки. Затем вы можете ссылаться на каждую строку как var1, var2 и т. Д., Или, как показывает вторая секция, вы можете пропустить их все, используя for /L. Однако вам нужно понять, как работать с задержанными переменными расширения.