سؤال

هل يعرف أي شخص بطريقة (يقول PowerShell، أو أداة) في Windows التي يمكن أن تكرر عبر دليل وتحويل أي ملفات UNIX إلى ملفات Windows.

سأكون سعيدا تماما بالطريقة في PowerShell إلى اكتشاف ملف UNIX على الأقل.

من السهل القيام بذلك لملف واحد واحد، لكنني بعد شيء أكثر قابلية للتوسعة قليلا (وبالتالي يميل نحو حل بوبرز).

هل كانت مفيدة؟

المحلول

فيما يلي طريقة PowerShell النقية إذا كنت مهتما.

العثور على ملفات مع خط خط Unix واحد على الأقل (PowerShell V1):

dir * -inc *.txt | %{ if (gc $_.FullName -delim "`0" | Select-String "[^`r]`n") {$_} }

فيما يلي كيفية العثور على نهايات خط UNIX وسريتها إلى نهايات خط Windows. أحد الأشياء المهمة التي يجب ملاحظتها هي أن نهاية خط إضافية ( r n) ستضاف إلى نهاية الملف إذا لم يكن هناك بالفعل خط ينتهي في النهاية. إذا كنت لا ترغب في ذلك حقا، فسوف نشر مثالا على كيفية تجنبه (إنه أكثر تعقيدا بعض الشيء).

Get-ChildItem * -Include *.txt | ForEach-Object {
    ## If contains UNIX line endings, replace with Windows line endings
    if (Get-Content $_.FullName -Delimiter "`0" | Select-String "[^`r]`n")
    {
        $content = Get-Content $_.FullName
        $content | Set-Content $_.FullName
    }
}

يعمل العمل أعلاه لأن PowerShell سيقوم تلقائيا بتقسيم المحتويات على n (إسقاط r إذا كانت موجودة) ثم أضف r n عندما يكتب كل شيء (في هذه الحالة خط) إلى الملف. هذا هو السبب في أنه ينتهي بك دائما مع خط ينتهي في نهاية الملف.

أيضا، كتبت الرمز أعلاه بحيث يقوم فقط بتعديل الملفات التي تحتاج إليها. إذا كنت لا تهتم بحيث يمكنك إزالة عبارة IF. أوه، تأكد من أن الملفات فقط تصل إلى كائن Foreach. بخلاف ذلك يمكنك القيام بكل ما تريد التصفية التي تريدها في بداية ذلك الأنابيب.

نصائح أخرى

هناك dos2unix و unix2dos في cygwin..

يبدو هذا عمل بالنسبة لي.

Get-Content Unix.txt | Out-File Dos.txt

تحميل همة, ، افتح الملف والإصدار الخاص بك

:se fileformat=dos|up

دفعة من ملفات متعددة (جميع الملفات الكل * في c: tmp - العودية):

:args C:\tmp\**\*.txt
:argdo se fileformat=dos|up

يمكنك استخدام Visual Studio. ملف -> خيارات حفظ متقدمة ...

إذا لم يكن Cygwin من أجلك، فهناك العديد من الملفات التنفيذية المستقلية ل UNIX2DOS ضمن Windows إذا كنت جوجل حولها، أو يمكنك كتابة واحدة بنفسك، راجع سؤالي المماثل (الاتجاه المعاكس لتحويل) هنا.

قضيت 6 ساعات أمس واليوم اختبار الكود الوارد أعلاه في حلقة مع 10000 ملف، العديد منها> 50 كيلو بايت في الحجم. خلاصة القول، رمز PowerShell غير فعال للغاية / بطيء / غير قابل للاستخدام لملفات كبيرة وعدد كبير من الملفات. كما أنه لا يحافظ على بايت بوم. لقد وجدت UNIX2DOS 7.2.3 ليكون الحل الأسرع والأكثر عملية. نأمل أن يساعد ذلك الآخرين ويقدمهم الوقت.

يفتح ملف مع نهايات خط UNIX في الدفتر وحفظه سيتم كتابة جميع نهايات السطر ك DOS. شاقة بعض الشيء لأعداد كبيرة من الملفات، لكنها تعمل بشكل جيد بما فيه الكفاية لعدد قليل من الملفات مرة واحدة في حين.

يعمل بالنسبة لي:

 Get-ChildItem -Recurse -File | % { $tmp = Get-Content $_; $tmp | Out-File "$_" -Encoding UTF8 }

ماذا عن هذا (مع lookbehind سلبي). بدون -newline، يضع المحتوى المحدد `` `` `` `` يلة في الأسفل. مع الأقواس، يمكنك تعديل نفس الملف.

function unix2dos {
    (Get-Content -raw $args[0]) -replace "(?<!`r)`n","`r`n" | 
    set-content -nonewline $args[0]
}

العكس سيكون هذا، ويندوز إلى نص يونيكس.

function dos2unix {
    (Get-Content -raw $args[0]) -replace "`r`n","`n" | 
    set-content -nonewline $args[0]
}

أمثلة:

unix2dos file.txt
dos2unix file.txt

إذا كان لديك EMACS، فيمكنك التحقق من ذلك مع وضع HEXL ESC-X. Notepad لن يعرض نص UNIX بشكل صحيح. لا بد لي من تحديد المسار للمحتوى المحدد، لأن -Reply يحدد Pspath.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top