2016-11-25 9 views
0

Скажем, у меня есть следующий пакетный скрипт:эхо текст с Unix концами строк из партии окон (.bat) скрипт

For ... DO (
SET VAL=%%B 
IF defined VAL echo %%A=%%B >> %OUTPUT_FILEPATH% 
) 

Как я мог получить echo для вывода с помощью UNIX (только строки) окончаний строк ?

В качестве альтернативы, могу ли я записать файл как есть, а затем преобразовать его из сценария партии? (что-то вроде find/r/n и замените на/n? если да, то как бы я это сделал?)

Редактировать: Я хотел бы иметь автономное решение (то есть такое, которое не связано с загрузкой дополнительных коммунальные услуги, а также может быть сделано из самого пакетного сценария [Windows 7])

+0

Я был удивлен, что я не мог найти это уже задавало где-то на SO – simonalexander2005

+0

Преобразования текстовых файлов в Unix-стиль разрывы строк не является на самом деле ничего, кроме вывода каждой строки без заднего разрыва строки, а затем с явным выходом фид строки; поэтому вы можете найти что-то полезное при поиске чего-то вроде «эха без новой строки» и «символа новой строки» ... – aschipfl

+0

В Интернете есть много статей о преобразовании текстового файла Windows в unix. Если у вас есть [JREPL.BAT приложение для обработки текста регулярного выражения] (http://www.dostips.com/forum/viewtopic.php?f=3&t=6044), вы можете нормально записать файл, а затем использовать ' вызовите jrepl "^" ""/u/f yourFile.txt/o -'. Или вы можете использовать канал для записи файла непосредственно в unix-формате: 'yourCommandThatGeneratesFile | jrepl "^" ""/u/o yourFile.txt'. – dbenham

ответ

1

взяты из Macros with parameters appended

форматирования сложно, но попробовать

set ^"LF=^ 

^" don't remove previous line & rem line feed (newline) 
set ^"\n=^^^%LF%%LF%^%LF%%LF%^^"& rem define newline with line continuation 

For ... DO (
SET VAL=%%B 
IF defined VAL <nul set/P^=%%A=%%B%\n%>> %OUTPUT_FILEPATH% 
) 

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

<nul set/P^=%%A=%%B%\n%^>> %OUTPUT_FILEPATH%

+0

сложно может быть хорошим преуменьшением ....... любой шанс, который вы могли бы расширить, что это делает в вашем ответе? – simonalexander2005

+0

@ simonalexander2005 извините, не мой родной язык. в зависимости от того, что будет в '%% A' или' %% B', может быть много символов, чтобы бежать, как 'set/p^=' – elzooilogico

+0

Нет необходимости скрывать '=' в 'set/P = '. Измените синтаксис на 'set/P =" %% A = %% B% \ n% "', поэтому (окружающие) кавычки больше не теряются. Однако ведущие белые пробелы всегда будут потеряны. Обратите внимание, что ведущие '=' знаки вызывают синтаксическую ошибку. На самом деле нет безопасного способа использования 'set/P', но есть и другие методы - см. [Этот ответ] (http://stackoverflow.com/a/40485255). Или вы переходите на другой язык ... – aschipfl

3

Подходящий способ выполнения этого преобразования не осуществляется через пакетный файл, а с использованием другого языка программирования, такого как JScript; таким образом, процесс преобразования является быстрым и надежным. Тем не менее, вам не нужна программа сотен строк, чтобы добиться такой простой замены. Файл две строки Пакетное ниже сделать это преобразование:

@set @a=0 /* & cscript //nologo //E:JScript "%~F0" <input.txt> output.txt & goto :EOF */ 

WScript.Stdout.Write(WScript.Stdin.ReadAll().replace(/\r\n/g,"\n")); 

EDIT: Я добавил модификации к исходному коду, что позволяет включать несколько команд в пакетном части стандартным способом.

@set @a=0 /* 

@echo off 
set "OUTPUT_FILEPATH=C:\Path\Of\The\File.txt" 
cscript //nologo //E:JScript "%~F0" < "%OUTPUT_FILEPATH%" > output.txt 
move /Y output.txt "%OUTPUT_FILEPATH%" 

goto :EOF */ 

WScript.Stdout.Write(WScript.Stdin.ReadAll().replace(/\r\n/g,"\n")); 

Первая строка является трюком, который скрывает cscript команды из кода JScript, поэтому составление этого гибрида .BAT файла не выдает ошибку.

В коде JScript: WScript.Stdin.ReadAll() читать весь перенаправленный входной файл; это может вызвать проблемы, если файл огромный. Метод replace использует регулярное выражение для идентификации текста для замены и размещения на его место второй строки; вы можете прочитать дополнительное описание этой темы по адресу this link. WScript.Stdout.Write просто возьмите выходной сигнал и замените его на экран. Легко! Не так ли? ;-)

+0

+1, но я не настолько уверен в фразе *** «правильный путь» *** ?! Я бы предпочел увидеть фразу типа «разумный путь». Трудно утверждать, что работающий пакетный метод «неправильный». Но я тоже использовал JScript, скорее всего, через JREPL, учитывая, что он уже находится в моей библиотеке трюков. Я предпочитаю использовать обработку строк, потому что JScript ограничен максимальным размером, который может считывать в одну строку. Чтение одной строки за раз почти устраняет проблему размера. – dbenham

+0

@dbenham: Ну, иногда я не выбираю лучший термин. Я изменил его на ** _ «подходящий путь» _ ** ... – Aacini

+0

вы говорите «отправьте его на экран» - как бы я мог его получить в свой выходной файл (тот же, что и на нем?)? не могли бы вы привести пример, характерный для моего сценария? Итак, у меня есть файл (хранящийся в% OUTPUT_FILEPATH%) - как бы я мог заменить окончание в этом файле вашим методом? – simonalexander2005