2015-10-19 5 views
0

Я использую это командные файлы, чтобы создать список файловКак удалить последний символ файла

@echo off 
(for /f "delims=" %%a in ('dir/b/a-d *.tex') do echo %%a,)>liste.dat 

В результате, как это

file1.tex, 
file2.tex, 
file3.tex, 
... 
lastfile.tex, 

Как удалить последнюю запятую?

+0

, почему эхо %% а, используется? есть ли какая-либо необходимость, я считаю, что вы могли бы использовать echo %% a вместо этого, мне бы хотелось узнать, есть ли причина, другой мудрый удаление запятой после того, как echo %% a сделает нужный – prudviraj

+0

@prudviraj: возможно, вставить запятую во всех строках? OP хочет «удалить ** последнюю ** запятую» только! – Aacini

ответ

2
@echo off 
setlocal EnableDelayedExpansion 

set "comma=" 
< NUL (
for %%a in (*.tex) do (
    set /P "=!comma!%%a" 
    set comma=,^ 
%Empty line% 
) 
echo/ 
) > liste.dat 

EDIT: Ответить на комментарий

Ops! Когда я разрабатывал этот код, который я только отображается вывод на экране, где он выглядит правильно:

C:\> test.bat 
One.tex, 
Three.tex, 
Two.tex 

Даже если вывод направляется в файл, а файл отображается на экране, вывод выглядит правильно:

C:\> test.bat > output.txt 

C:\> type output.txt 
One.tex, 
Three.tex, 
Two.tex 

Однако характер вставляется после каждой запятой просто LF, так что если этот файл открыт с помощью блокнота, ЛФ являются не преобразованы в «конец строки»; просто cmd.exe экран выход преобразует LF в CR + LF пару («приготовленный выход» вместо «сырой выход»).

Способ исправить эту деталь вставляет полный CR + LF пары после каждой запятой:

@echo off 
setlocal EnableDelayedExpansion 

for /F %%a in ('copy /Z "%~F0" NUL') do set "CR=%%a" 

set "comma=" 
< NUL (
for %%a in (*.tex) do (
    set /P "=!comma!%%a" 
    set comma=,!CR!^ 
%Empty line% 
) 
echo/ 
) > liste.dat 
+0

'% Пустая строка%' предназначена для добавления символа новой строки. на 'запятую', правильно? – aschipfl

+0

@aschipfl: Да! – Aacini

+0

Я неправильно понял предполагаемый выход? Пример вывода показывает одну запись в каждой строке с запятой. Твой - все на одной линии. – Squashman

0

Проблема в том, что вы не знаете, сколько строк или файлов будет. Таким образом, вам придется использовать две петли, как ваш код написан. Один для подсчета строк и один для выполнения операций. Легче иметь другую обработку для первой строки, а не для последней. Так как об этом:

@echo off 
SETLOCAL EnableDelayedExpansion 
SET /a i=0 
(for /f "delims=" %%a in ('dir /b/a-d *.tex') do (
    IF !i!==1 (
     echo ,%%a 
    ) ELSE (
     ECHO %%a 
     SET /a i=1 
    ) 
) 
)>liste.txt 

Это создаст что-то вроде этого:

file1.tex 
,file2.tex 
,file3.tex 
... 
,lastfile.tex 

Это кажется эквивалентной до нужного выхода. Если вы действительно хотите иметь , в конце строк, а не в начале следующего, скажите мне, и я обновлю код, но он будет довольно уродливым.

3
@echo off 
SETLOCAL EnableDelayedExpansion 
SET "in=" 
(
for %%a in (*.tex) do (
    IF "!in!"=="" (
     set in=%%a 
    ) ELSE (
     echo !in!, 
     set in=%%a 
    ) 
) 
echo !in! 
)>liste.dat 
+2

Не могли бы вы пояснить, почему этот код отвечает на вопрос? Кодовые ответы [обескуражены] (http://meta.stackexchange.com/q/148272/274165), потому что они не учат решению. –