Azure Functions PowerShell读取Table Storage Timestamp值为空
问题原因
该问题由Azure Functions PowerShell运行时的Table Storage输入绑定默认序列化规则导致:绑定层向脚本透传表实体时,默认不会将系统保留字段Timestamp映射为实体对象的顶层属性,因此直接访问$_.Timestamp会返回空值。
其余系统字段PartitionKey、RowKey、ETag属于默认透传字段,因此可以直接读取到对应值,和表中实际存储的数据无关。
解决方法
你可以根据实际场景二选一:
- 方案1:修改绑定配置,显式声明需要透传Timestamp
找到Function目录下的function.json文件,找到对应Table Storage输入绑定的配置段,新增systemProperties配置项,将Timestamp加入需要透传的系统属性列表,示例配置如下:
{ "name": "inputTable", "type": "table", "direction": "in", "tableName": "替换为你的实际表名", "connection": "替换为你的存储连接字符串配置项名称", "systemProperties": ["Timestamp"] }
配置保存后重启Function应用,原有代码中$_.Timestamp即可正常返回时间值。
- 方案2:不修改配置,直接从实体属性集合读取值
透传到PowerShell的表实体对象会将所有字段(含未映射到顶层的系统字段)存放在Properties属性集合中,你可以直接通过键名读取Timestamp,修改后的代码如下:
# Input bindings are passed in via param block. param($Timer, $inputTable) $newValues = $inputTable.GetEnumerator() $newValues | ForEach-Object { # 从属性集合读取Timestamp并转为DateTime类型 $recordTimestamp = $_.Properties["Timestamp"].PropertyAsDateTime Write-Host $recordTimestamp }
补充说明:如果你的核心需求是筛选每次定时器触发后的新增记录,更稳妥的实现方式是自行维护处理游标(比如单独存一份上次处理的最新时间戳/RowKey到存储中),不要完全依赖自动生成的
Timestamp做增量判断,避免因绑定序列化、时间精度、重试执行等问题导致漏处理或重复处理数据。
内容的提问来源于stack exchange,提问作者Chethan S.
相关产品推荐
相关产品推荐

