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étodoWriteString
se implementa en dos clases,SCREEN
ySTREAM
. La versiónSCREEN
usaWriteConsoleW
directamente, por lo que todos los caracteres Unicode se muestran correctamente. La versiónSTREAM
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