如何在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
相关产品推荐
相关产品推荐

