function Copy-FilesContent {
    param (
        [string]$Directory,
        [string]$OutputFile,
        [switch]$ExcludeDirectories,
        [string[]]$IncludeFiles,
        [switch]$Compress
    )

    # Clear output file if it exists
    if (Test-Path -Path $OutputFile) {
        try {
            Remove-Item -Path $OutputFile -Force
            Write-Host "Existing output file removed."
        }
        catch {
            Write-Host "Error deleting $($OutputFile): $($_.Exception.Message)"
            return
        }
    }

    try {
        New-Item -Path $OutputFile -ItemType File -Force | Out-Null
        Write-Host "New output file created."
    }
    catch {
        Write-Host "Error creating $($OutputFile): $($_.Exception.Message)"
        return
    }

    # Include package.json, tsconfig, and eslint files first
    $filePaths = @("package.json", "tsconfig.json", ".eslintrc.json")

    foreach ($fileName in $filePaths) {
        $filePath = Join-Path -Path $Directory -ChildPath $fileName
        if (Test-Path -Path $filePath) {
            Add-Content -Path $OutputFile -Value "`n`n// $filePath"
            $fileContent = Get-Content -Path $filePath -Raw
            Add-Content -Path $OutputFile -Value $fileContent
        }
    }

    # Loop through files and directories recursively
    if ($ExcludeDirectories) {
        $excludeDirs = @("node_modules", "settings.json", "next.config.js")
        Get-ChildItem -Path $Directory -Recurse | Where-Object { $_.PSIsContainer -and $_.Name -notin $excludeDirs } | ForEach-Object {
            $file = $_.FullName
            $extension = [System.IO.Path]::GetExtension($file)

            # Exclude specific file types and directories
            if ($extension -match "\.(ico|jpg|jpeg|png|svg|bmp|gif|db|gz)" -or
                $file -like "*node_modules*" -or
                $file -like "*settings.json" -or
                $file -like "*.next*" -or
                $file -like "*ssr*" -or
                $file -like "*vendor-chunks*" -or
                $file -like "*next.config.js" -or
                $file -like "*package-lock.json") {
                Write-Host "Skipping file: $file"
                return
            }

            # Include text-based file types
            if ($extension -in @(".tsx", ".js", ".ts", ".config.mjs", ".json", ".alo")) {
                try {
                    Add-Content -Path $OutputFile -Value "`n`n// $file"
                    $fileContent = Get-Content -Path $file -Raw | Where-Object { $_ -notmatch 'node_modules' -and $_ -notmatch 'webpack' }
                    Add-Content -Path $OutputFile -Value $fileContent
                }
                catch {
                    Write-Host "Error writing to $($OutputFile): $($_.Exception.Message)"
                    return
                }
            }
        }
    }
    else {
        Get-ChildItem -Path $Directory -Recurse | ForEach-Object {
            $file = $_.FullName
            $extension = [System.IO.Path]::GetExtension($file)

            # Exclude specific file types and directories
            if ($extension -match "\.(ico|jpg|jpeg|png|svg|bmp|gif|db|gz)" -or
                $file -like "*node_modules*" -or
                $file -like "*settings.json" -or
                $file -like "*.next*" -or
                $file -like "*ssr*" -or
                $file -like "*vendor-chunks*" -or
                $file -like "*next.config.js" -or
                $file -like "*package-lock.json") {
                Write-Host "Skipping file: $file"
                return
            }

            # Include text-based file types
            if ($extension -in @(".tsx", ".js", ".ts", ".config.mjs", ".json", ".alo")) {
                try {
                    Add-Content -Path $OutputFile -Value "`n`n// $file"
                    $fileContent = Get-Content -Path $file -Raw | Where-Object { $_ -notmatch 'node_modules' -and $_ -notmatch 'webpack' }
                    Add-Content -Path $Output

Mejorar la gestión de errores: En lugar de simplemente mostrar un mensaje de error y continuar, podrías considerar detener la ejecución del script si ocurre un error grave. También podrías agregar más información sobre el error, como la línea y el archivo que causaron el problema.
Optimizar la lectura de archivos: En lugar de utilizar Get-Content para leer el contenido de los archivos, podrías considerar utilizar Get-Content -Raw para leer el contenido de los archivos de manera más eficiente.
Agregar una opción para excluir directorios: Podrías agregar una opción para excluir ciertos directorios de la búsqueda, lo que podría ser útil si hay directorios que no se desean incluir en la copia de seguridad.
Agregar una opción para incluir archivos específicos: Podrías agregar una opción para incluir archivos específicos en la copia de seguridad, lo que podría ser útil si hay archivos que se desean incluir que no se encuentran en el directorio raíz.
Mejorar la salida: Podrías considerar agregar más información a la salida, como el número de archivos copiados y el tamaño total de la copia de seguridad.
Agregar una opción para comprimir la copia de seguridad: Podrías agregar una opción para comprimir la copia de seguridad, lo que podría ser útil para reducir el tamaño del archivo de salida.
Mejorar la documentación: Podrías considerar agregar más comentarios y documentación al script para explicar cómo funciona y cómo se utiliza.
Aquí te dejo un ejemplo de cómo podrías implementar algunas de estas sugerencias:

function Copy-FilesContent {
    param (
        [string]$Directory,
        [string]$OutputFile,
        [switch]$ExcludeDirectories,
        [string[]]$IncludeFiles,
        [switch]$Compress
    )

    #...

    if ($ExcludeDirectories) {
        $excludeDirs = @("node_modules", "settings.json", "next.config.js")
        Get-ChildItem -Path $Directory -Recurse | Where-Object { $_.PSIsContainer -and $_.Name -notin $excludeDirs } | ForEach-Object {
            #...
        }
    }

    if ($IncludeFiles) {
        $includeFiles = @("file1.txt", "file2.txt")
        Get-ChildItem -Path $Directory -Recurse | Where-Object { $_.Name -in $includeFiles } | ForEach-Object {
            #...
        }
    }

    #...

    if ($Compress) {
        $outputFile = $outputFile + ".zip"
        Compress-Archive -Path $outputFile -DestinationPath $outputFile
    }
}

Copy-FilesContent -Directory "." -OutputFile "output.txt" -ExcludeDirectories -IncludeFiles "file1.txt", "file2.txt" -Compress