Пакетный скрипт для копирования имен файлов? - PullRequest
1 голос
/ 26 мая 2011

Я пытаюсь создать пакетный скрипт, который:

  • Копирует имена файлов новых файлов
  • Вставляет каждое имя файла в новую строку в текстовом файле перед последней строкой

Например: У меня есть файлы с именем Picture.JPG и Picture2.JPG в папке. Пакет должен скопировать имена файлов «Picture» и «Picture2» и вставить его в textfile.txt, в котором уже есть последняя строка, которую я не хочу перезаписывать, поэтому он будет выглядеть так:

Picture
Picture2
This is the last line

Обратите внимание, что я не хочу копировать расширение .JPG.

Есть идеи?

Ответы [ 4 ]

4 голосов
/ 27 мая 2011

Это должно работать, вам нужно поместить его в cmd.file

for %%a in (*.jpg) do echo %%~na >> Tem.txt
type textfile.txt >> tem.txt
copy tem.txt textfile.txt
del tem.txt
1 голос
/ 27 мая 2011

Этот скрипт принимает два параметра:

  • %1 - имя текстового файла;

  • %2 - рабочийдиректория (где хранятся файлы *.jpg).

@ECHO OFF

:: set working names
SET "fname=%~1"
SET "dname=%~2"

:: get the text file's line count
SET cnt=0
FOR /F "usebackq" %%C IN ("%fname%") DO SET /A cnt+=1

:: split the text file, storing the last line separately from the other lines
IF EXIST "%fname%.tmp" DEL "%fname%.tmp"
(FOR /L %%L IN (1,1,%cnt%) DO (
  SET /P line=
  IF %%L==%cnt% (
    CALL ECHO %%line%%>"%fname%.tmplast"
  ) ELSE (
    CALL ECHO %%line%%>>"%fname%.tmp"
  )
)) <"%fname%"

:: append file names to 'the other lines'
FOR %%F IN ("%dname%\*.jpg") DO ECHO %%~nF>>"%fname%.tmp"

:: concatenate the two parts under the original name
COPY /B /Y "%fname%.tmp" + "%fname%.tmplast" "%fname%"

:: remove the temporary files
DEL "%fname%.tmp*"

Часть get the text file's line count просто перебирает все строки, увеличивая счетчик.Вы можете использовать другой подход, если вы точно знаете, на что похожа последняя строка, или если вы знаете, что она должна содержать определенную подстроку (даже если это всего один символ).В этом случае вы можете заменить цикл FOR, использованный выше, на этот цикл FOR:

FOR /F "delims=[] tokens=1" %%C IN ('FIND /N "<i>search term</i>" ^<"%fname%"') DO SET cnt=%%C

, где search term - термин, которому может соответствовать последняя строка.

1 голос
/ 26 мая 2011

Чтение этот вопрос для извлечения имени файла, поскольку в качестве входных данных получают выходные данные команды ls или dir в конвейере, а затем присоединяют его к вашему textfiloe.txt с помощью оператора ">>". *

Чтобы добавить в начало файла отметку this

0 голосов
/ 27 мая 2011

Вставьте нижеприведенное ниже в файл bat в папке jpegs с текстовым файлом mylistofjpegfiles.txt:

::Build new list of files
del newlistandtail.txt 2>nul
for /f %%A in ('dir *jpg /b') Do (echo %%~nA >> newlistandtail.txt)


:: Add last line to this new list
tail -1 mylistofjpegfiles.txt >> newlistandtail.txt


:: Build current list of files without last line
del listnotail.txt 2>nul
for /f %%A in ('tail -1 mylistofjpegfiles.txt') Do (findstr /l /V "%%A" mylistofjpegfiles.txt >> listnotail.txt)

:: Compare old list with new list and add unmatched ie new entries
findstr /i /l /V /g:mylistofjpegfiles.txt newlistandtail.txt >> listnotail.txt  

:: add last line
tail -1 mylistofjpegfiles.txt >> listnotail.txt

:: update to current list
type listnotail.txt > mylistofjpegfiles.txt

:: cleanup
del newlistandtail.txt 
del listnotail.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...