команда windows для преобразования концов строки unix?

<p>есть ли команда windows для преобразования концов строк файла?</p><p>у нас есть <code>test.bat</code>, который нам нужно запустить, чтобы запустить наш сервер. мы используем perforce, и у нас должно быть окончание строки unix в нашей рабочей области. по какой-то причине нам не разрешено изменять окончания строк на windows в наших рабочих пространствах. тем не менее, сервер работает на windows.</p><p>каждый раз, когда мне нужно запустить файл bat, я открываю его в notepad ++ и выбираю «правка» → «преобразование eol» → «windows». есть ли способ автоматизировать это, чтобы нам не нужно было вручную изменять окончания строк при каждой синхронизации с perforce?</p><p>заранее спасибо.</p>

<p>на самом деле это можно сделать очень легко с помощью команды <code>more</code>, которая включена в windows nt и более поздние версии. чтобы преобразовать <code>input\_filename</code>, который содержит unix eol (конец строки) <code>\n</code>, в <code>output\_filename</code>, который содержит windows eol <code>\r\n</code>, просто сделайте следующее:</p><pre><code>type input\_filename | more /p > output\_filename </code></pre><p>команда <code>more</code> имеет дополнительные параметры форматирования, о которых вы можете не знать. запустите <code>more/?</code>, чтобы узнать, что еще может делать <code>more</code>. </p>

<p>используйте <a href="https://en.wikipedia.org/wiki/unix2dos">unix2dos</a> утилиту. вы можете скачать двоичные файлы <a href="http://waterlan.home.xs4all.nl/dos2unix.html">здесь</a> .</p>

<p>вы можете сделать это без дополнительных инструментов в vbscript:</p><pre><code>do until wscript.stdin.atendofstream wscript.stdout.writeline wscript.stdin.readline loop </code></pre><p>поместите вышеприведенные строки в файл <code>unix2dos.vbs</code> и запустите его так:</p><pre><code>cscript //nologo unix2dos.vbs <c:\path\to\input.txt >c:\path\to\output.txt </code></pre><p>или вот так:</p><pre><code>type c:\path\to\input.txt | cscript //nologo unix2dos.vbs >c:\path\to\output.txt </code></pre><hr><p>вы также можете сделать это в powershell:</p><pre><code>(get-content "c:\path\to\input.txt") -replace "`n", "`r`n" | set-content "c:\path\to\output.txt" </code></pre><p>что может быть дополнительно упрощено до этого:</p><pre><code>(get-content "c:\path\to\input.txt") | set-content "c:\path\to\output.txt" </code></pre><p>вышеприведенный оператор работает без явной замены, потому что <code>get-content</code> неявно разделяет входные файлы на любой тип перевода строки (cr, lf и cr-lf), а <code>set-content</code> объединяет входной массив с переносом строки windows (cr-lf) перед записью его в файл.</p>

<p>windows не больше ненадежна, она неизбежно уничтожает вкладки и добавляет строки.</p><p> <a href="https://sourceforge.net/projects/dos2unix/">unix2dos</a> также является частью mingw/msys, cygutils, gnuwin32 и других коллекций двоичных портов unix - и, возможно, уже установлена.</p><p>когда <a href="https://www.python.org/download/releases/2.7/">python</a> есть, этот однострочный переводит любые окончания строк в текущую платформу - на любой платформе:</p><pre class="lang-bat prettyprint-override"><code>type unixfile.ext | python -c "import sys; sys.stdout.write(sys.stdin.read())" > myplatfile.ext </code></pre><p>или же</p><pre class="lang-bat prettyprint-override"><code>python -c "import sys; sys.stdout.write(open(sys.argv[1]).read())" unixfile.ext > myplatfile.ext </code></pre><p>или поместите однострочник в скрипт .bat/shell и в path в соответствии с вашей платформой:</p><pre class="lang-bat prettyprint-override"><code>@rem this is any2here.bat python -c "import sys; sys.stdout.write(open(sys.argv[1]).read())" %1 </code></pre><p>и использовать этот инструмент, как</p><pre class="lang-bat prettyprint-override"><code>any2here unixfile.ext > myplatfile.ext </code></pre>

<p>я имел дело с проблемами <code>crlf</code>, поэтому я решил создать действительно простой инструмент для конвертации (в nodejs):</p><p>это <a href="https://github.com/jurosh/nodejs-eol-converter-cli">nodejs eol конвертер cli</a> </p><p>так что если у вас есть <strong>nodejs с установленным npm</strong>, вы можете попробовать это:</p><pre><code>npm i -g eol-converter-cli eolconverter crlf "**/*.{txt,js,java,etc}" </code></pre><p>путь может быть настроен динамически с помощью регулярного выражения glob (то же, что и в shell).</p><p>так что если вы можете использовать nodejs, это действительно просто, и вы можете интегрировать эту команду для преобразования всего рабочего пространства в желаемые окончания строк.</p>

<p>опираясь на полезные ответы tampahaze и md xf. </p><p>это изменит все .txt файлы<em> на месте </em>в текущем каталоге с lf на crlf в командной строке</p><pre><code>for /f %f in ('dir /b "*.txt"') do ( type %f | more /p > %f.1 & move %f.1 %f ) </code></pre><p>если вы не хотите проверять каждое изменение </p><blockquote> <p>переехать</p> </blockquote><p>к </p><blockquote> <p>двигаться/у</p> </blockquote><p>включить подкаталоги изменить</p><blockquote> <p>dir/b</p> </blockquote><p>к</p><blockquote> <p>dir/b/s</p> </blockquote><p>чтобы сделать все это в пакетном файле, включая подкаталоги, не предлагая использовать ниже</p><pre><code>@echo off setlocal enabledelayedexpansion for /f %%f in ('dir /s /b "*.txt"') do ( type %%f | more /p > %%f.1 move /y %%f.1 %%f > nul @echo changing lf-^>crlf in file %%f ) echo. pause </code></pre>

<p>попробуй это:</p><pre><code>(for /f "delims=" %i in (file.unix) do @echo %i)>file.dos </code></pre><p>протокол сеанса:</p><pre> 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> (для/f "delims ="% i в (file.unix) do @echo% i)> файле. 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 .. </pre>

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

<p>вы можете создать простой пакетный скрипт, чтобы сделать это для вас:</p><pre><code>type %1 | more /p >%1.1 move %1.1 %1 </code></pre><p>затем запустите <code><batch script name> <file></code> и <code><file></code> будут мгновенно преобразованы в окончания строки dos.</p>

<p>исходя из ответа эндоро, но, чтобы сохранить пробелы, попробуйте это:</p><pre><code>@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 </code></pre>

<p>я клонировал свой проект git, используя <code>git bash</code> на <code>windows</code>. все файлы имели окончание <code>lf</code>. наш репозиторий имеет <code>crlf</code> окончания по умолчанию.</p><p>я удалил проект, а затем снова клонировал его, используя <code>windows command prompt</code>. окончания <code>crlf</code> были тогда нетронуты. в моем случае, если бы я изменил окончание проекта, это привело бы к огромным усилиям и вызвало бы проблемы для моих товарищей по команде. итак, сделал это так. надеюсь, это кому-нибудь поможет. </p>

<p>я беру курс aws, и мне часто приходилось копировать текстовые поля веб-форм aws в блокнот windows. таким образом, я получаю текст с разделителями lf только в своем буфере обмена. я случайно обнаружил, что вставив его в мой редактор delphi, а затем нажав ctrl + k + w, мы напишем текст в файл с разделителями cr + lf. (бьюсь об заклад, многие другие редакторы ide сделали бы то же самое).</p>