我正在使用SQL Server 2008 R2创建一个存储过程来跟踪某些服务器文件夹的已用空间。我遇到了一个特定目录的有趣问题。
当我运行EXEC master.dbo.xp_cmdshell 'dir "\\servername\e$\media\Google" /s /-C'
时,我得到一个结果:
然而,当我使用dos命令的变量时
DECLARE @dir VARCHAR(255) = 'dir "\\servername\e$\media\Google" /s /-C'
EXEC master.dbo.xp_cmdshell @dir
我得到了不同的结果:
您可以看到文件数相同,但使用的字节数不同。以下是包含文件的子目录的详细信息:
不使用变量:
使用@dir变量:
你可以看到虽然它似乎每个文件的大小相同,但总数却不同。
我有其他子目录,其zip文件不会出现此行为。 有没有人对可能导致这种情况有什么想法?或者如何解决?
答案 0 :(得分:2)
如果人们在共享上添加,编辑或删除文件,则自由字节将始终不同。
我尝试在我的测试机器上运行它,并且两次执行都有相同的结果。我正在使用Windows 7和2014 CTP。
您确定没有更改总计的隐藏或系统文件吗?目录,索引等也占用空间但不显示。您没有为文件匹配指定通配符模式。
这是一篇关于这个主题的外行文章。
如果您从Windows资源管理器中手动选择文件,您会得到相同的总数吗?
尝试只指定' dir * .zip / s'。这只会选择zip文件。请回复结果!
答案 1 :(得分:1)
也许这不是您正在寻找的答案,但我希望它能以某种方式帮助您:)
我在第一次比较中注意到:
181661290 - 181644906 = 16384/2048 = 8
所以我想也许,出于某种原因,当你使用变量时,命令会计算子文件夹的“簇大小”(我猜是2048字节)......
但后来我注意到了:
8131596 - 8119308 = 12288/2048 = 6
所以只有6个文件夹在那里添加了2048个字节,我不知道为什么。
然后你说:
有趣,所以当我只用* .zip运行时,两个结果相互匹配。
将命令行添加开关/ a-d(不显示文件夹)可以解决问题。
我正在添加this post of sqlservercentral我发现它可能与问题有关:
CompressedBit AS CASE WHEN属性& 2048 = 2048那么1 ELSE 0 END,