No se puede leer el archivo en Windows debido a problema de escape

Describe el problema/error/pregunta

Estoy intentando leer un archivo txt en un servidor Windows pero tiene problemas para leer de una carpeta si contiene corchetes u otros caracteres especiales. Así que para arreglarlo necesito escapar los corchetes pero por alguna razón extraña n8n está reemplazando la barra invertida con barra diagonal. ¿Alguien sabe cómo arreglarlo?

¿Cuál es el mensaje de error (si hay alguno)?

Como puedes ver en la entrada escapé los corchetes con una barra invertida pero en la salida ves que los corchetes son barra diagonal

Por favor comparte tu flujo de trabajo

Comparte el resultado devuelto por el último nodo

Información sobre tu configuración de n8n

  • Versión de n8n: 2.19.5
  • Base de datos (predeterminada: SQLite): predeterminada
  • Configuración de n8n EXECUTIONS_PROCESS (predeterminada: own, main): predeterminada
  • Ejecutando n8n a través de (Docker, npm, n8n cloud, aplicación de escritorio): npm
  • Sistema operativo: Windows Server 2022

@Ruriko
Una solución simple es mover o copiar el archivo a una ruta sin corchetes ni caracteres especiales, como C:\n8n-files\input.txt, y hacer que n8n lea desde esa ruta sanitizada en su lugar.

La razón por la que esto está sucediendo es que n8n procesa la ruta como una cadena y normaliza las barras invertidas. Este es un comportamiento conocido al ejecutar n8n en Windows. Mover el archivo a una carpeta diferente ayudaría, pero aquí hay lo que podrías intentar en su lugar:

-Usa barras invertidas dobles para escapar algo como, “C:\\folder (with brackets)\\file.txt”. La primera barra invertida hace el escape, lo que significa que la segunda sobrevive al procesamiento de cadenas.

-Coloca la ruta en una expresión usando ‘$json’ o un nodo Set para construirla, en lugar de escribir directamente en el campo, esto a veces puede eludir la normalización.

-Si estás auto-hospedando, usar una ruta UNC (‘\\\\server\\share\\folder’) a veces puede eludir el problema.

¿Con qué nodo estás leyendo el archivo? Esto ayudará a reducir las opciones.

En mi flujo de trabajo ya intenté poner la ruta en una expresión y no funcionó. Estoy usando el nodo Read/Write para leer el archivo. El problema es que en la versión 1.x funcionaba, pero al pasar a 2.x ya no funciona porque está reemplazando la barra invertida con la barra diagonal.

@Ruriko tu expresión en Edit Fields1 llama a .replaceAll(‘\’,‘/’) primero — eso es que estás convirtiendo barras invertidas, no n8n. Elimina el replace y simplemente escapa los corchetes, o usa barras diagonales en toda la expresión ya que readWriteFile las acepta en Windows.

¡Hola @Ruriko, qué bien que hayas compartido la captura del flujo de trabajo - eso hace mucho más fácil entender!

Este es un comportamiento conocido al crear rutas en expresiones de n8n en Windows. El motor de expresiones trata la barra invertida como un carácter de escape, así que \[ se normaliza a /[ o se elimina.

La solución más limpia es crear la ruta en un nodo Code (no en una expresión) donde tienes control total de JavaScript:

const folderName = $('Edit Fields').item.json.folderName; // tu entrada
const safePath = 'C:\\Users\\Admin\\Desktop\\' + folderName;
// o usa String.raw si el nombre de la carpeta viene de la entrada:
const filePath = String.raw`C:\Users\Admin\Desktop\` + folderName;

return [{ json: { filePath } }];

Luego usa {{ $json.filePath }} en tu nodo Read/Write Files.

Alternativamente, si quieres mantener el enfoque de expresión, puedes reemplazar las barras diagonales nuevamente por barras invertidas dentro de la expresión:

{{ $json.path.replace(/\//g, '\\') }}

¿Te funcionó el ejemplo del flujo de trabajo de @achamm? Si puedes compartir cómo se ve tu valor de ruta actual después del nodo Edit Fields, podemos identificar exactamente dónde está sucediendo la sustitución de barras.

Hola @Ruriko :waving_hand:
Gracias por compartir este problema de rutas de Windows muy interesante.

Algo que puede ayudar es construir la ruta final en un nodo Code usando path.join() en lugar de escapar manualmente la cadena en expresiones. Dado que el nodo Code de n8n se ejecuta en el tiempo de ejecución de Node.js: esta puede ser una forma más limpia de normalizar los separadores y mantener la construcción de la ruta determinista.

Por ejemplo:

const path = require('path');

const finalPath = path.join(
  'C:\\Users\\user1',
  '[project]',
  'input.txt'
);

return [{ json: { finalPath } }];

Luego puedes pasar {{$json.finalPath}} al nodo de archivo.

En mi opinión, generalmente es más seguro que luchar contra el escape de barras invertidas paso a paso en expresiones.

Agrega una barra invertida antes de cada corchete cuadrado directamente en el campo File(s) Selector:
\[A+B\]/file.txt
C:/Users/Administrator/Desktop/Data/Test \[A+B\]/file.txt

o Usa .replaceAll() en una expresión

Si la ruta proviene de una expresión dinámica (por ejemplo, desde un nodo anterior), usa .replaceAll() para escapar los caracteres especiales programáticamente

{{$json.path.replace(‘[’, ‘\[’).replaceAll(‘]’, ‘\]’).replaceAll(‘{’, ‘\{’).replaceAll(‘}’, ‘\}’)}}