You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure函数应用复制文件至文件共享时内容追加\r\n的问题求助

问题分析与解决:Azure文件共享上传后文件追加\r\n

问题场景

使用以下PowerShell命令将Azure函数应用本地文件复制到挂载在VM中的Azure文件共享:

Set-AzStorageFileContent -Source 'C:/home/site/wwwroot/HttpTrigger2/demo.tfvars' -ShareName "storage-fileshare" -Path "Demo/Test" -Context $destctx -Force -ContentEncoding "UTF-8"  #-Properties @{"ContentEncoding" = "UTF-8"}

上传后文件内容被自动追加\r\n,原文件无此内容:

  • 实际得到内容:tfv_storage_account_name="sandeep"\r\ntfv_location_storage="Brazil"\r\ntfv_account_tier="Standard"\r\n
  • 期望内容:
    tfv_storage_account_name="sandeep" 
    tfv_location_storage="Brazil"
    tfv_account_tier="Standard"
    

已尝试-Properties @{"ContentEncoding" = "UTF-8"}、-ContentEncoding "UTF-8"、-Encoding UTF-8等参数,问题未解决。

原因分析

核心问题是PowerShell文本文件处理的自动换行符转换:

  • Windows系统默认采用CRLF(\r\n)作为换行符,而你的源文件大概率是LF(\n)换行格式。
  • Set-AzStorageFileContent在读取文本文件时,PowerShell会自动将LF转换为Windows标准的CRLF,导致上传后的文件多出\r字符。
  • 你尝试的-ContentEncoding、-Properties编码参数仅设置文件的HTTP内容编码属性,和本地文件读取时的换行符转换逻辑无关;-Encoding UTF-8若未搭配正确的读取模式,仍会触发换行符转换。

解决方法

1. 二进制模式上传(最稳妥)

绕过PowerShell的文本转换逻辑,直接以二进制形式读取并上传,完全保留原文件格式:

$fileBytes = [System.IO.File]::ReadAllBytes('C:/home/site/wwwroot/HttpTrigger2/demo.tfvars')
Set-AzStorageFileContent -Value $fileBytes -ShareName "storage-fileshare" -Path "Demo/Test" -Context $destctx -Force

2. 指定无BOM的UTF-8编码

使用UTF8NoBOM编码参数,避免PowerShell自动转换换行符(部分PowerShell版本适用):

Set-AzStorageFileContent -Source 'C:/home/site/wwwroot/HttpTrigger2/demo.tfvars' -ShareName "storage-fileshare" -Path "Demo/Test" -Context $destctx -Force -Encoding UTF8NoBOM

3. 确认源文件换行符格式

用文本编辑器(如VS Code)查看源文件右下角的换行符标识:

  • 若显示LF,则验证了上述转换问题;
  • 若显示CRLF,则需检查VM挂载文件共享时的文件系统适配设置(此情况极少)。

内容的提问来源于stack exchange,提问作者SANDEEP KUMAR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 21:45:24