xp_cmdshell dir将命令作为变量传递时会产生不同的结果

时间:2014-06-12 21:31:30

标签: sql-server sql-server-2008-r2 dos dir xp-cmdshell

我正在使用SQL Server 2008 R2创建一个存储过程来跟踪某些服务器文件夹的已用空间。我遇到了一个特定目录的有趣问题。

当我运行EXEC master.dbo.xp_cmdshell 'dir "\\servername\e$\media\Google" /s /-C'时,我得到一个结果:

enter image description here

然而,当我使用dos命令的变量时 DECLARE @dir VARCHAR(255) = 'dir "\\servername\e$\media\Google" /s /-C' EXEC master.dbo.xp_cmdshell @dir

我得到了不同的结果:

enter image description here

您可以看到文件数相同,但使用的字节数不同。以下是包含文件的子目录的详细信息:

不使用变量:

enter image description here

使用@dir变量:

enter image description here

你可以看到虽然它似乎每个文件的大小相同,但总数却不同。

我有其他子目录,其zip文件不会出现此行为。 有没有人对可能导致这种情况有什么想法?或者如何解决?

2 个答案:

答案 0 :(得分:2)

如果人们在共享上添加,编辑或删除文件,则自由字节将始终不同。

我尝试在我的测试机器上运行它,并且两次执行都有相同的结果。我正在使用Windows 7和2014 CTP。

您确定没有更改总计的隐藏或系统文件吗?目录,索引等也占用空间但不显示。您没有为文件匹配指定通配符模式。

这是一篇关于这个主题的外行文章。

http://ask-leo.com/why_does_the_space_used_by_files_on_my_hard_drive_show_different_numbers_depending_on_how_i_look.html

如果您从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,