2012-01-13 14 views
5

Tengo un script por lotes que solicita al usuario una entrada y luego genera un par de archivos que estoy usando en un entorno AIX. Estos archivos deben estar en formato UNIX (que creo que es UTF8), pero estoy buscando alguna dirección en la forma MÁS SENCILLA de hacerlo.Convertir archivos de Windows a UNIX a través de Powershell o lote

No me gusta tener que descargar paquetes de software adicionales; Cygwin o GnuWin32. No me importa codificar esto si es posible, mis opciones de codificación son Batch, Powershell y VBS. ¿Alguien sabe de una manera de hacer esto?

Como alternativa, ¿podría crear los archivos con Batch y llamar a un script de Powershell para reformarlos?

La idea aquí es que se le solicitará al usuario cierta información, luego le daré un archivo estándar que son básicamente respuestas rápidas en AIX para un trabajo. Inicialmente uso Batch, porque no sabía que me encontraría con este problema, pero me inclino a rehacer esto en Powershell. porque había encontrado algún código en otro foro que puede hacer la conversión (abajo).

% foreach($i in ls -name DIR/*.txt) { \ 
     get-content DIR/$i | \ 
     out-file -encoding utf8 -filepath DIR2/$i \ 
    } 

Buscando alguna dirección o alguna entrada sobre esto.

Respuesta

15

No puede hacer esto sin herramientas externas en archivos por lotes.

Si todo lo que necesita es la codificación del archivo, entonces el fragmento que proporcionó debería funcionar. Si desea convertir los archivos en línea (en lugar de escribirlos en otro lugar) que puede hacer

Get-ChildItem *.txt | ForEach-Object { (Get-Content $_) | Out-File -Encoding UTF8 $_ } 

(los paréntesis alrededor de Get-Content son importantes) Sin embargo, esto va a escribir los archivos en UTF-8 con una firma en el inicio (U + FEFF) que algunas herramientas de Unix no aceptan (a pesar de que es técnicamente legal, aunque desaconsejable de usar).

Luego está el problema de que los saltos de línea son diferentes entre Windows y Unix. Unix usa solo U + 000A (LF) mientras que Windows usa dos caracteres para eso: U + 000D U + 000A (CR + LF). Así que, idealmente, convertirías los saltos de línea también. Pero eso es un poco más complejo:

Get-ChildItem *.txt | ForEach-Object { 
    # get the contents and replace line breaks by U+000A 
    $contents = [IO.File]::ReadAllText($_) -replace "`r`n?", "`n" 
    # create UTF-8 encoding without signature 
    $utf8 = New-Object System.Text.UTF8Encoding $false 
    # write the text back 
    [IO.File]::WriteAllText($_, $contents, $utf8) 
} 
+0

Nice Joey. Sería una buena adición a poshcode.org (ConvertTo-UnixTextFile). –

+0

HM, solo he estado allí para los juegos de scripting. Trataré de recordar hacerlo más tarde ;-) – Joey

+0

Genial, sí, es un buen repo de la comunidad. Acabo de buscar repositorios de PowerShell porque pensé que poshcode era el único bueno y bajo, parece que el script center también tiene una [buena versión] (http://gallery.technet.microsoft.com/scriptcenter). –

Cuestiones relacionadas