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

如何在PowerShell中将计算值写入SQL的INSERT/UPDATE语句

问题根源

你调用Get-DirectoryTreeSize函数时没有接收它返回的自定义对象,脚本中用到的$TotalFileCount、$TotalDirectoryCount、$TotalFolderSizeInMB都是未定义的空变量,自然无法读取到值。
Get-DirectoryTreeSize函数内部的变量属于局部作用域,外部无法直接访问,它所有的计算结果都会封装为PSCustomObject对象输出,你需要将输出结果赋值给变量后再读取属性。

修复步骤

1. 接收函数返回值

修改循环内调用函数的代码,将结果存入自定义变量:

$folderStats = Get-DirectoryTreeSize $TempPath -AllItemsAndAllFolders

2. 从返回对象中读取属性值

拼接SQL语句时,从$folderStats中读取对应属性即可,示例如下:

$sqlInsertCommand = "INSERT INTO EFP_HomeFolder_Stats (Path,UserInitials,TotalFileCount,TotalDirectoryCount,TotalFolderSizeInMB,LastUpdated) VALUES('$TempPath','$($name.name)','$($folderStats.TotalFileCount)','$($folderStats.TotalDirectoryCount)','$($folderStats.TotalFolderSizeInMB)',GETDATE())"
$sqlUpdateCommand = "UPDATE EFP_HomeFolder_Stats SET Path = '$TempPath', UserInitials = '$($name.name)', TotalFileCount = '$($folderStats.TotalFileCount)', TotalDirectoryCount = '$($folderStats.TotalDirectoryCount)', TotalFolderSizeInMB = '$($folderStats.TotalFolderSizeInMB)', LastUpdated = GETDATE()"

优化建议

  • 原循环中两次Where { $_.PSIsContainer }逻辑重复,可以直接使用Get-ChildItem的-Directory参数简化写法,同时不需要单独筛选Name属性,直接操作文件夹对象更方便:
foreach ($folder in Get-ChildItem "\\FILSRV01\home dir$" -Directory)
{
    $TempPath = $folder.FullName
    $folderStats = Get-DirectoryTreeSize $TempPath -AllItemsAndAllFolders
    # 后续逻辑直接用$folder.Name读取用户名即可
}
  • 代码中Write-host $name.ExistCoun没有实际作用,你没有对ExistCoun属性赋值,输出的永远是空值,可以删除。
  • 当前直接拼接SQL字符串的写法存在SQL注入风险,如果是生产环境使用,建议改为参数化查询传递数值,避免语法错误和安全问题。

内容的提问来源于stack exchange,提问作者Stig Kølbæk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:06:04