vistas transitorio modelo estructura diccionario datos campos calculados windows command-line unicode

windows - estructura - modelo transitorio odoo



Guardar resultados ''tree/f/a'' en un archivo de texto con soporte Unicode (10)

Intento utilizar el comando árbol en una línea de comandos de Windows para generar un archivo de texto que enumere el contenido de un directorio, pero cuando canalizo el resultado, los caracteres Unicode se rellenan.

Aquí está el comando que estoy usando:

tree /f /a > output.txt

Los resultados en la ventana de la consola están bien:

/---Erika szobája cover.jpg Erika szobája.m3u Kátai Tamás - 01 Télvíz.ogg Kátai Tamás - 02 Zölderdõ.ogg Kátai Tamás - 03 Renoir kertje.ogg Kátai Tamás - 04 Esõben szaladtál.ogg Kátai Tamás - 05 Ázik az út.ogg Kátai Tamás - 06 Sûrû völgyek takaród.ogg Kátai Tamás - 07 Õszhozó.ogg Kátai Tamás - 08 Mécsvilág.ogg Kátai Tamás - 09 Zúzmara.ogg

Pero el archivo de texto no es bueno:

/---Erika szob ja cover.jpg Erika szob ja.m3u K tai Tam s - 01 T‚lv¡z.ogg K tai Tam s - 02 Z”lderdä.ogg K tai Tam s - 03 Renoir kertje.ogg K tai Tam s - 04 Esäben szaladt l.ogg K tai Tam s - 05 µzik az £t.ogg K tai Tam s - 06 S–r– v”lgyek takar¢d.ogg K tai Tam s - 07 åszhoz¢.ogg K tai Tam s - 08 M‚csvil g.ogg K tai Tam s - 09 Z£zmara.ogg

¿Cómo puedo arreglar esto? Idealmente, el archivo de texto sería exactamente el mismo que el resultado en la ventana de la consola.

Probé la sugerencia de Chris Jester-Young (¿qué pasó, lo eliminaste Chris?) De ejecutar la línea de comandos con el modificador / U, parecía exactamente lo que necesitaba, pero parece que no funciona. He intentado abrir el archivo tanto en VS2008 como en el bloc de notas, y ambos muestran los mismos caracteres incorrectos.


Decidí que tenía que echarle un vistazo a tree.com y descubrir por qué no respetaba la configuración de Unicode de la consola. Resulta que (como muchas de las utilidades de archivos de línea de comandos), utiliza una biblioteca llamada ulib.dll para hacer toda la impresión (específicamente, TREE::DisplayName WriteString llama a WriteString en ulib ).

Ahora, en ulib , el método WriteString se implementa en dos clases, SCREEN y STREAM . La versión SCREEN usa WriteConsoleW directamente, por lo que todos los caracteres Unicode se muestran correctamente. La versión STREAM convierte el texto Unicode en una de tres codificaciones diferentes ( _UseConsoleConversions ⇒ página de códigos de consola ( GetConsoleCP ), _UseAnsiConversions ⇒ página de códigos predeterminada de ANSI, de lo contrario ⇒ página de códigos OEM predeterminada), y luego escribe esto. No sé cómo cambiar el modo de conversión, y no creo que la conversión se pueda deshabilitar.

¡Solo he mirado esto brevemente, así que quizás las almas más aventureras puedan hablar más sobre eso! :-)


Si la salida no es Unicode (lo que aparentemente hace), tiene que ver el archivo de texto que crea usando la misma codificación que usa la ventana de la Consola. Es por eso que se ve correcto en la consola. En algunos editores de texto, puede elegir una codificación (o "página de códigos") cuando abre un archivo. (Cómo generar como Unicode, no lo sé. Cmd / U no hace lo que dice la documentación.)

La codificación de la consola depende de su instalación de Windows. Para mí, es "Europeo occidental (DOS)" (o simplemente "MS-DOS") en Microsoft Word.


La respuesta corta es que no puede y esto es porque tree.com es una aplicación ANSI, incluso en Windows 7.

La única solución es escribir su propia implementación de tree . También podría presentar un error a Microsoft, pero dudo que aún no lo sepan.


Esto funcionó para mí:

tree /f /a > %temp%/Listing >> files.txt


¿Alguien ya ha intentado esto?

tree /f /a |clip

Abra el Bloc de notas, ctrl + V, guarde en el bloc de notas como output.txt con soporte Unicode?


Puedes probar

tree /A > output.txt

Aunque se ve diferente de la línea CMD, todavía podría ser aceptable. :PAG


Esto guardará los resultados como ASCII (Código Estándar Estadounidense para el Intercambio de Información) en su escritorio, ASCII / ANSI no reconoce cada carácter internacional o extendido:

tree /f > ascii.txt

Esto convertirá su texto ASCII en Unicode (/ c debe preceder al comando real):

cmd /u /c type ascii.txt > unicode.txt

Entonces, ¿por qué no solo pensar en el archivo ascii como un archivo temporal y eliminarlo?

del ascii.txt

Si debe poner todo en una línea, puede usar:

tree /f > ascii.txt & cmd.exe /u /c type ascii.txt > unicode.txt & del ascii.txt


Logré obtener la salida tal como está en la consola, sin convertir todos los caracteres no ASCII, al enviar a la consola (solo tree ) y luego copiar desde allí (menú del sistema -> Editar -> Marcar, seleccionando todo, Entrar ) El tamaño del búfer de la consola se debe aumentar de antemano, según los archivos / carpetas numéricos, en las propiedades de la consola (menú del sistema -> Propiedades). Otras formas no funcionaron. tree|clip , mencionado en una publicación anterior, convierte caracteres no ascii en ascii lo mismo que tree>file.txt .


Me las he arreglado para enviar correctamente caracteres que no sean ASCII desde el comando de árbol a un archivo a través de Take Command Console .

En TCC escriba "opción" y en la primera pestaña seleccione "Salida Unicode". Entonces simplemente ejecuta

tree /f /a > output.txt


Use PowerShell:

powershell -command "tree /f > tree.txt"

Caso de prueba:

create.ps1 :

mkdir "Erika szobája" $null | Set-Content "Erika szobája/cover.jpg" $null | Set-Content "Erika szobája/Erika szobája.m3u" $null | Set-Content "Erika szobája/Kátai Tamás - 01 Télvíz.ogg" $null | Set-Content "Erika szobája/Kátai Tamás - 02 Zölderdõ.ogg" $null | Set-Content "Erika szobája/Kátai Tamás - 03 Renoir kertje.ogg" $null | Set-Content "Erika szobája/Kátai Tamás - 04 Esõben szaladtál.ogg" $null | Set-Content "Erika szobája/Kátai Tamás - 05 Ázik az út.ogg" $null | Set-Content "Erika szobája/Kátai Tamás - 06 Sûrû völgyek takaród.ogg" $null | Set-Content "Erika szobája/Kátai Tamás - 07 Õszhozó.ogg" $null | Set-Content "Erika szobája/Kátai Tamás - 08 Mécsvilág.ogg" $null | Set-Content "Erika szobája/Kátai Tamás - 09 Zúzmara.ogg"

Salida:

tree.txt :

Folder PATH listing Volume serial number is 00000000 0000:0000 C:. │ create.ps1 │ tree.txt │ └───Erika szobája cover.jpg Erika szobája.m3u Kátai Tamás - 01 Télvíz.ogg Kátai Tamás - 02 Zölderdo.ogg Kátai Tamás - 03 Renoir kertje.ogg Kátai Tamás - 04 Esoben szaladtál.ogg Kátai Tamás - 05 Azik az út.ogg Kátai Tamás - 06 Sûrû völgyek takaród.ogg Kátai Tamás - 07 Oszhozó.ogg Kátai Tamás - 08 Mécsvilág.ogg Kátai Tamás - 09 Zúzmara.ogg

EDITAR:

Versión mejorada y mejorada para usuarios avanzados

Caso de prueba:

$null | Set-Content "欲速则不达.txt" $null | Set-Content "爱不是占有,是欣赏.txt" $null | Set-Content "您先请是礼貌.txt" $null | Set-Content "萝卜青菜,各有所爱.txt" $null | Set-Content "广交友,无深交.txt" $null | Set-Content "一见钟情.txt" $null | Set-Content "山雨欲来风满楼.txt" $null | Set-Content "悪妻は百年の不作。.txt" $null | Set-Content "残り物には福がある。.txt" $null | Set-Content "虎穴に入らずんば虎子を得ず。.txt" $null | Set-Content "夏炉冬扇.txt" $null | Set-Content "花鳥風月.txt" $null | Set-Content "起死回生.txt" $null | Set-Content "自業自得.txt" $null | Set-Content "아는 길도 물어가라.txt" $null | Set-Content "빈 수레가 요란하다.txt" $null | Set-Content "방귀뀐 놈이 성낸다.txt" $null | Set-Content "뜻이 있는 곳에 길이 있다.txt" $null | Set-Content "콩 심은데 콩나고, 팥 심은데 팥난다.txt"

De su respuesta , @Chris Jester-Young escribió:

Ahora, en ulib , el método WriteString se implementa en dos clases, SCREEN y STREAM . La versión SCREEN usa WriteConsoleW directamente, por lo que todos los caracteres Unicode se muestran correctamente. La versión STREAM convierte el texto Unicode en una de tres codificaciones diferentes ( _UseConsoleConversions ⇒ página de códigos de consola ( GetConsoleCP ), _UseAnsiConversions ⇒ página de códigos predeterminada de ANSI, de lo contrario ⇒ página de códigos OEM predeterminada), y luego escribe esto.

Esto significa que no podemos confiar en obtener los personajes de una transmisión. Las redirecciones de archivos no funcionarán. Tenemos que confiar en escribir en la consola para obtener los caracteres Unicode.

La solución, o hack, es escribir el árbol en la consola y luego volcar el búfer a un archivo.

He escrito las secuencias de comandos para agregar el menú contextual del árbol al hacer clic derecho en los directorios en el Explorador. Guarde los archivos en el mismo directorio y luego ejecute Install list menu.bat como administrador para instalar.

Install list menu.bat

@echo on regedit /s "List files.reg" copy "List.ps1" "%SystemRoot%" pause

List files.reg

Windows Registry Editor Version 5.00 ; Directory. [HKEY_LOCAL_MACHINE/Software/Classes/Directory/Shell/List] "MUIVerb"="List" "ExtendedSubCommandsKey"="Directory//ContextMenus//List" [HKEY_LOCAL_MACHINE/Software/Classes/Directory/ContextMenus/List/Shell/Files] "MUIVerb"="Files" [HKEY_LOCAL_MACHINE/Software/Classes/Directory/ContextMenus/List/Shell/Files/Command] ; powershell -executionPolicy bypass "%SystemRoot%/List.ps1" -type ''files'' -directory ''%1'' @=hex(2):70,00,6f,00,77,00,65,00,72,00,73,00,68,00,65,00,6c,00,6c,00,20,00,2d,/ 00,65,00,78,00,65,00,63,00,75,00,74,00,69,00,6f,00,6e,00,50,00,6f,00,6c,00,/ 69,00,63,00,79,00,20,00,62,00,79,00,70,00,61,00,73,00,73,00,20,00,22,00,25,/ 00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,00,5c,00,/ 4c,00,69,00,73,00,74,00,2e,00,70,00,73,00,31,00,22,00,20,00,2d,00,74,00,79,/ 00,70,00,65,00,20,00,27,00,66,00,69,00,6c,00,65,00,73,00,27,00,20,00,2d,00,/ 64,00,69,00,72,00,65,00,63,00,74,00,6f,00,72,00,79,00,20,00,27,00,25,00,31,/ 00,27,00,00,00 [HKEY_LOCAL_MACHINE/Software/Classes/Directory/ContextMenus/List/Shell/FilesRecursively] "MUIVerb"="Files recursively" [HKEY_LOCAL_MACHINE/Software/Classes/Directory/ContextMenus/List/Shell/FilesRecursively/Command] ; powershell -executionPolicy bypass "%SystemRoot%/List.ps1" -type ''filesRecursively'' -directory ''%1'' @=hex(2):70,00,6f,00,77,00,65,00,72,00,73,00,68,00,65,00,6c,00,6c,00,20,00,2d,/ 00,65,00,78,00,65,00,63,00,75,00,74,00,69,00,6f,00,6e,00,50,00,6f,00,6c,00,/ 69,00,63,00,79,00,20,00,62,00,79,00,70,00,61,00,73,00,73,00,20,00,22,00,25,/ 00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,00,5c,00,/ 4c,00,69,00,73,00,74,00,2e,00,70,00,73,00,31,00,22,00,20,00,2d,00,74,00,79,/ 00,70,00,65,00,20,00,27,00,66,00,69,00,6c,00,65,00,73,00,52,00,65,00,63,00,/ 75,00,72,00,73,00,69,00,76,00,65,00,6c,00,79,00,27,00,20,00,2d,00,64,00,69,/ 00,72,00,65,00,63,00,74,00,6f,00,72,00,79,00,20,00,27,00,25,00,31,00,27,00,/ 00,00 [HKEY_LOCAL_MACHINE/Software/Classes/Directory/ContextMenus/List/Shell/Tree] "MUIVerb"="Tree" [HKEY_LOCAL_MACHINE/Software/Classes/Directory/ContextMenus/List/Shell/Tree/Command] ; powershell -executionPolicy bypass "%SystemRoot%/List.ps1" -type ''tree'' -directory ''%1'' @=hex(2):70,00,6f,00,77,00,65,00,72,00,73,00,68,00,65,00,6c,00,6c,00,20,00,2d,/ 00,65,00,78,00,65,00,63,00,75,00,74,00,69,00,6f,00,6e,00,50,00,6f,00,6c,00,/ 69,00,63,00,79,00,20,00,62,00,79,00,70,00,61,00,73,00,73,00,20,00,22,00,25,/ 00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,00,5c,00,/ 4c,00,69,00,73,00,74,00,2e,00,70,00,73,00,31,00,22,00,20,00,2d,00,74,00,79,/ 00,70,00,65,00,20,00,27,00,74,00,72,00,65,00,65,00,27,00,20,00,2d,00,64,00,/ 69,00,72,00,65,00,63,00,74,00,6f,00,72,00,79,00,20,00,27,00,25,00,31,00,27,/ 00,00,00 ; Directory background. [HKEY_LOCAL_MACHINE/Software/Classes/Directory/Background/Shell/List] "MUIVerb"="List" "ExtendedSubCommandsKey"="Directory//Background//ContextMenus//List" [HKEY_LOCAL_MACHINE/Software/Classes/Directory/Background/ContextMenus/List/Shell/Files] "MUIVerb"="Files" [HKEY_LOCAL_MACHINE/Software/Classes/Directory/Background/ContextMenus/List/Shell/Files/Command] ; powershell -executionPolicy bypass "%SystemRoot%/List.ps1" -type ''files'' -directory ''%V'' @=hex(2):70,00,6f,00,77,00,65,00,72,00,73,00,68,00,65,00,6c,00,6c,00,20,00,2d,/ 00,65,00,78,00,65,00,63,00,75,00,74,00,69,00,6f,00,6e,00,50,00,6f,00,6c,00,/ 69,00,63,00,79,00,20,00,62,00,79,00,70,00,61,00,73,00,73,00,20,00,22,00,25,/ 00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,00,5c,00,/ 4c,00,69,00,73,00,74,00,2e,00,70,00,73,00,31,00,22,00,20,00,2d,00,74,00,79,/ 00,70,00,65,00,20,00,27,00,66,00,69,00,6c,00,65,00,73,00,27,00,20,00,2d,00,/ 64,00,69,00,72,00,65,00,63,00,74,00,6f,00,72,00,79,00,20,00,27,00,25,00,56,/ 00,27,00,00,00 [HKEY_LOCAL_MACHINE/Software/Classes/Directory/Background/ContextMenus/List/Shell/FilesRecursively] "MUIVerb"="Files recursively" [HKEY_LOCAL_MACHINE/Software/Classes/Directory/Background/ContextMenus/List/Shell/FilesRecursively/Command] ; powershell -executionPolicy bypass "%SystemRoot%/List.ps1" -type ''filesRecursively'' -directory ''%V'' @=hex(2):70,00,6f,00,77,00,65,00,72,00,73,00,68,00,65,00,6c,00,6c,00,20,00,2d,/ 00,65,00,78,00,65,00,63,00,75,00,74,00,69,00,6f,00,6e,00,50,00,6f,00,6c,00,/ 69,00,63,00,79,00,20,00,62,00,79,00,70,00,61,00,73,00,73,00,20,00,22,00,25,/ 00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,00,5c,00,/ 4c,00,69,00,73,00,74,00,2e,00,70,00,73,00,31,00,22,00,20,00,2d,00,74,00,79,/ 00,70,00,65,00,20,00,27,00,66,00,69,00,6c,00,65,00,73,00,52,00,65,00,63,00,/ 75,00,72,00,73,00,69,00,76,00,65,00,6c,00,79,00,27,00,20,00,2d,00,64,00,69,/ 00,72,00,65,00,63,00,74,00,6f,00,72,00,79,00,20,00,27,00,25,00,56,00,27,00,/ 00,00 [HKEY_LOCAL_MACHINE/Software/Classes/Directory/Background/ContextMenus/List/Shell/Tree] "MUIVerb"="Tree" [HKEY_LOCAL_MACHINE/Software/Classes/Directory/Background/ContextMenus/List/Shell/Tree/Command] ; powershell -executionPolicy bypass "%SystemRoot%/List.ps1" -type ''tree'' -directory ''%V'' @=hex(2):70,00,6f,00,77,00,65,00,72,00,73,00,68,00,65,00,6c,00,6c,00,20,00,2d,/ 00,65,00,78,00,65,00,63,00,75,00,74,00,69,00,6f,00,6e,00,50,00,6f,00,6c,00,/ 69,00,63,00,79,00,20,00,62,00,79,00,70,00,61,00,73,00,73,00,20,00,22,00,25,/ 00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,00,5c,00,/ 4c,00,69,00,73,00,74,00,2e,00,70,00,73,00,31,00,22,00,20,00,2d,00,74,00,79,/ 00,70,00,65,00,20,00,27,00,74,00,72,00,65,00,65,00,27,00,20,00,2d,00,64,00,/ 69,00,72,00,65,00,63,00,74,00,6f,00,72,00,79,00,20,00,27,00,25,00,56,00,27,/ 00,00,00

List.ps1

function sortNaturally { [Regex]::replace($_, ''/d+'', { $args[0].value.padLeft(20) }) } function writeList { param( [parameter(mandatory = $true)] [string] $text = $null ) $filePath = "$env:temp/List.txt" $text > "$filePath" notepad "$filePath" | out-null del "$filePath" } function listFiles { param( [switch] $recurse = $false ) get-childItem -name -recurse:$recurse -force | sort-object $function:sortNaturally | out-string } function listTree { tree /f } function getBufferText { $rawUi = $host.ui.rawUi $width = [Math]::max([Math]::max($rawUi.bufferSize.width, $rawUi.windowSize.width) - 1, 0) $height = [Math]::max($rawUi.cursorPosition.y - 1, 0) $lines = new-object System.Text.StringBuilder $characters = new-object System.Text.StringBuilder for ($h = 0; $h -lt $height; $h += 1) { $rectangle = new-object System.Management.Automation.Host.Rectangle 0, $h, $width, $h $buffer = $rawUi.getBufferContents($rectangle) for ($w = 0; $w -lt $width; $w += 1) { $cell = $buffer[0, $w] $character = $cell.character $characters.append($character) | out-null } $lines.appendLine($characters.toString()) | out-null $characters.length = 0 } $lines.toString() -replace ''[ /0]*/r?/n'', "`r`n" } function main { param( [parameter(mandatory = $true)] [string] $type = $null, [parameter(mandatory = $true)] [string] $directory = $null ) $outputEncoding = [Text.UTF8Encoding]::UTF8 [Console]::outputEncoding = [Text.UTF8Encoding]::UTF8 $PSDefaultParameterValues[''out-file:encoding''] = ''utf8'' set-location -literalPath "$directory" $typeFunction = @{ ''files'' = { writeList -text $(listFiles) }; ''filesRecursively'' = { writeList -text $(listFiles -recurse) }; ''tree'' = { listTree writeList -text $(getBufferText) } } &($typeFunction.get_item($type)) } main @args