2013-07-10 6 views
50

Есть ли команда Windows для преобразования окончаний строк файла?Команда Windows для преобразования окончаний линии Unix?

У нас есть test.bat, который нам нужно запустить, чтобы запустить наш сервер. Мы используем Perforce, и нам нужно иметь окончание строк unix в нашей рабочей области. По какой-то причине нам не разрешено изменять окончания строк для Windows в наших рабочих пространствах. Однако сервер работает в Windows.

Каждый раз, когда мне нужно запустить файл bat, я открываю его в Notepad ++ и выбираю Edit → EOL conversion → Windows. Есть ли способ автоматизировать это, так что нам не нужно вручную менять окончание строк каждый раз, когда мы синхронизируемся с Perforce?

Заранее спасибо.

ответ

23

Использование unix2dos Утилита. Вы можете скачать бинарные файлы here.

+1

Опять его просто альтернатива блокноту ++. Не получится автоматизировать. Мне нужно будет запустить этот инструмент. В настоящее время я изменяю окончание строк в блокноте ++. –

+7

Это инструмент командной строки. И это больше подходит для автоматизации, а затем для графических инструментов. Вы можете написать периодическое задание 'at', которое фильтрует все файлы в какой-либо папке, в которую вы помещаете свои командные файлы. Все зависит от того, что вы подразумеваете под автоматизацией. –

-2

Inserting Carriage Returns to a Text File

@echo off 
set SourceFile=%1 rem c:\test\test.txt 
set TargetFile=%2 rem c:\test\out.txt 

if exist "%TargetFile%" del "%TargetFile%" 
for /F "delims=" %%a in ('type "%SourceFile%"') do call :Sub %%a 
rem notepad "%TargetFile%" 
goto :eof 


:Sub 
echo %1 >> "%TargetFile%" 
if "%2"=="" goto :eof 
shift 
goto sub 
+0

Как это работает, что вы думаете? – Endoro

+2

На самом деле, это сработает, если он просто будет использовать что-то вроде '(for/f" tokens = * "%% a in (% ~ 1) do @echo. %% a)>"% ~ 2 "'. –

+0

@AnsgarWiechers Да, этот 'set TargetFile =% 2 rem c: \ test \ out.txt' также нуждается в улучшении. И, кстати, ваши «токены = *» также. – Endoro

14

Вы можете сделать это без дополнительных инструментов в VBScript:

Do Until WScript.StdIn.AtEndOfStream 
    WScript.StdOut.WriteLine WScript.StdIn.ReadLine 
Loop 

Поместите эти строки в файле unix2dos.vbs и запустить его так:

cscript //NoLogo unix2dos.vbs <C:\path\to\input.txt >C:\path\to\output.txt 

или вот так:

type C:\path\to\input.txt | cscript //NoLogo unix2dos.vbs >C:\path\to\output.txt 

Вы также можете сделать это в PowerShell:

(Get-Content "C:\path\to\input.txt") -replace "`n", "`r`n" | 
    Set-Content "C:\path\to\output.txt" 

, которые могли бы быть еще более упрощен к этому:

(Get-Content "C:\path\to\input.txt") | Set-Content "C:\path\to\output.txt" 

Данное заявление работает без явной замены, потому что Get-Content неявно разбивает входные файлы на любой тип linebreak (CR, LF и CR-LF), а Set-Content объединяет входной массив с Win dows linebreaks (CR-LF) перед записью в файл.

5

попробовать это:

(for /f "delims=" %i in (file.unix) do @echo %i)>file.dos 

протокол Session:

 
C:\TEST>xxd -g1 file.unix 
0000000: 36 31 36 38 39 36 32 39 33 30 38 31 30 38 36 35 6168962930810865 
0000010: 0a 34 38 36 38 39 37 34 36 33 32 36 31 38 31 39 .486897463261819 
0000020: 37 0a 37 32 30 30 31 33 37 33 39 31 39 32 38 35 7.72001373919285 
0000030: 34 37 0a 35 30 32 32 38 31 35 37 33 32 30 32 30 47.5022815732020 
0000040: 35 32 34 0a          524. 

C:\TEST>(for /f "delims=" %i in (file.unix) do @echo %i)>file.dos 

C:\TEST>xxd -g1 file.dos 
0000000: 36 31 36 38 39 36 32 39 33 30 38 31 30 38 36 35 6168962930810865 
0000010: 0d 0a 34 38 36 38 39 37 34 36 33 32 36 31 38 31 ..48689746326181 
0000020: 39 37 0d 0a 37 32 30 30 31 33 37 33 39 31 39 32 97..720013739192 
0000030: 38 35 34 37 0d 0a 35 30 32 32 38 31 35 37 33 32 8547..5022815732 
0000040: 30 32 30 35 32 34 0d 0a       020524.. 
+1

Он работает, но он также, кажется, удаляет все пустые строки из файла. :( – MarioVilas

+2

@MarioVilas да, вы правы. Для этого вы можете использовать [flip] (http://sourceforge.net/projects/ezwinports/files/). – Endoro

3

Мой вклад в это, преобразование нескольких файлов в папке: for %%z in (*.txt) do (for /f "delims=" %%i in (%%z) do @echo %%i)>%%z.tmp

1

На основании ответа Endoro, но держать пробелы, попробуйте следующее:

@echo off 
setlocal enabledelayedexpansion 
(for /f "tokens=* delims=:" %%i in ('findstr /n "^" file.unix') do (
     set line=%%i 
     set line=!line:*:=! 
     echo(!line! 
     ))>file.dos 
+0

Решение Ir Relevant отлично работает, за исключением того, что оно не выдает восклицательный знак (!) – mgcoder

49

Это можно сделать очень легко с помощью команды more, которая входит в состав Windows NT и более поздних версий.Для преобразования input_filename, содержащий UNIX EOL (End Of Line) \n в output_filename, который содержит Windows, EOL \r\n, просто сделать это:

TYPE input_filename | MORE /P > output_filename 

Команда more имеет дополнительные параметры форматирования, которые вы не можете быть в курсе. Запустите more/?, чтобы узнать, что еще more может сделать.

+0

все еще отлично работает в Windows 9, спасибо! Возможно, стоит упомянуть, что файл output_filename должен существовать до запуска этой команды, и его содержимое будет перезаписано. – Sebastian

+2

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

+0

К сожалению, это также приводит к потере всех вкладок в пробелы. – Colin

6

Windows 'MORE не является надежным, он неизбежно разрушает TAB и добавляет линии.

unix2dos также является частью MinGW/MSYS, Cygutils, GnuWin32 и других коллекций двоичных портов unix - и может быть уже установлен.

Когда python есть, это один вкладыш преобразует любые строки окончаний к текущей платформе - на любой платформе:

TYPE UNIXFILE.EXT | python -c "import sys; sys.stdout.write(sys.stdin.read())" > MYPLATFILE.EXT 

или

python -c "import sys; sys.stdout.write(open(sys.argv[1]).read())" UNIXFILE.EXT > MYPLATFILE.EXT 

Или поставить один вкладыш в .bat/shell и на PATH в соответствии с вашей платформой:

@REM This is any2here.bat 
python -c "import sys; sys.stdout.write(open(sys.argv[1]).read())" %1 

и использовать этот инструмент lik е

any2here UNIXFILE.EXT > MYPLATFILE.EXT 
1

Вы можете создать простой скрипт, чтобы сделать это для вас:

TYPE %1 | MORE /P >%1.1 
MOVE %1.1 %1 

Затем запустите <batch script name> <FILE> и <FILE> будут немедленно преобразованы в окончаниях строк DOS.

2

я имел дело с CRLF вопросов, поэтому я решил построить очень простой инструмент для преобразования (в NodeJS):

Это NodeJS EOL converter CLI

Так что если у вас есть NodeJS с НПМ установлен, вы можете попробовать это:

npm i -g eol-converter-cli 
eolConverter crlf "**/*.{txt,js,java,etc}" 

Путь может быть настроен динамически с использованием регулярного выражения Glob (такое же регулярное выражение, что и в оболочке).

Итак, если вы можете использовать NodeJS, это очень просто, и вы можете интегрировать эту команду, чтобы преобразовать всю рабочую область в нужный конец строки.

+0

Похоже, ваше решение попало в https://www.reddit.com/r/programmingcirclejerk/comments/6t3kel/need_to_convert_unix_line_endings_in_windows_use/?ref=share&ref_source=link – Mikhail

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