Domanda

Qualcuno sa di un modo (dire PowerShell, o di uno strumento) in Windows che può ricorsivamente su una directory e convertire qualsiasi file UNIX per i file di Windows.

sarei perfettamente felice con un modo in PowerShell per rilevare almeno un file UNIX.

E 'facile fare questo per un singolo file, ma sono alla ricerca di qualcosa di un po' più scalabile (da qui pendente verso una soluzione Powershellish).

È stato utile?

Soluzione

Ecco il modo in cui PowerShell puro, se siete interessati.

Trovare i file con almeno uno linea di UNIX finale (PowerShell v1):

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

Ecco come trovare e segrete linea terminazioni UNIX a fine riga di Windows. Una cosa importante da notare è che una linea aggiuntiva fine (\ r \ n) verrà aggiunto alla fine del file, se non c'è già una linea che termina alla fine. Se davvero non si vuole che, vi posterò un esempio di come si può evitare (è un po 'più complessa).

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
    }
}

I lavori di cui sopra, perché PowerShell dividerà automaticamente il contenuto di \ n (lasciando cadere \ r se esistono) e quindi aggiungere \ r \ n quando si scrive ogni cosa (in questo caso una linea) al file. È per questo che si finisce sempre con una linea che termina alla fine del file.

Inoltre, ho scritto il codice di cui sopra in modo che esso modifica solo i file che è necessario. Se non si preoccupano che è possibile rimuovere l'istruzione if. Oh, assicurarsi che solo i file di arrivare al ForEach-Object. Diverso da quello che si può fare quello che vuoi filtrare all'inizio di quel gasdotto.

Altri suggerimenti

C'è dos2unix e unix2dos in Cygwin .

Questo sembra funzionare per me.

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

vim , aprire il file e problema

:se fileformat=dos|up

Batch per più file (tutti i file * .txt in C: \ tmp - ricorsive):

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

È possibile utilizzare Visual Studio. File -> Opzioni di salvataggio avanzate ...

Se Cygwin non è per voi, ci sono numerosi eseguibili standalone per unix2dos in Windows Se Google in giro, o si potrebbe scrivere uno voi stessi, vedere il mio simile (direzione opposta per la conversione) domanda here .

Ho trascorso 6 ore ieri e di oggi testare il codice di cui sopra in un ciclo con 10.000 file, molti di loro> 50kb in termini di dimensioni. Linea di fondo, il codice PowerShell è molto inefficiente / lento / inutilizzabile per file di grandi dimensioni e il gran numero di file. Inoltre non conserva byte BOM. Ho trovato unix2dos 7.2.3 di essere la soluzione più veloce e pratico. Spero che questo aiuta gli altri e fa risparmiare tempo.

L'apertura di un file con terminazioni di linea Unix in Wordpad e salvandolo riscriverà tutti i fine riga come DOS. Un po 'laborioso per un gran numero di file, ma funziona abbastanza bene per un paio di file ogni tanto un po'.

Si lavora per me:

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

Che ne dite di questo (con lookbehind negativo). Senza -nonewline, set-content mette un extra `r`n in fondo. Con le parentesi, è possibile modificare lo stesso file.

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

Il contrario sarebbe questo, finestre per il testo unix.

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

Esempi:

unix2dos file.txt
dos2unix file.txt

Se si dispone di emacs, si può controllare con hexl modalità ESC-x. Blocco note non visualizzerà il testo UNIX in modo corretto. Devo specificare il percorso per il set di contenuti, perché -replace cancella il PSPath.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top