如何从Windows命令提示符检测NTFS压缩?

问题描述 投票:1回答:3

我想检测脚本的包含文件夹中是否启用了Windows文件夹压缩。

windows command-line ntfs
3个回答
3
投票

编辑:答案是在Command Line arguments (Parameters)。替换“。” (=当前目录)具有所需的文件夹名称,当然:

for /f "delims=" %I in ('dir /B /AD "." 2^>Nul') do @echo %~aI "%I"

%~aI修饰符返回一个与File Attribute Constants一致的字符串,如下所示:

FILE_ATTRIBUTE_DIRECTORY     d-------- 
FILE_ATTRIBUTE_READONLY      -r------- 
FILE_ATTRIBUTE_ARCHIVE       --a------ 
FILE_ATTRIBUTE_HIDDEN        ---h----- 
FILE_ATTRIBUTE_SYSTEM        ----s---- 
FILE_ATTRIBUTE_COMPRESSED    -----c--- 
FILE_ATTRIBUTE_OFFLINE       ------o-- 
FILE_ATTRIBUTE_TEMPORARY     -------t- 
FILE_ATTRIBUTE_REPARSE_POINT --------l

my answer to another question中,有一个脚本输出带有标题的csv文件,如下所示(修改文件掩码以缩小输出到合理的大小):

@ECHO OFF
SETLOCAL enableextensions
> files\FoldersAndFilesWithAttributes.csv (
  rem csv header
  echo "d","r","a","h","s","c","o","t","l","file"
  rem csv lines
  for /f "delims=" %%I in ('
    dir /S /B /A "%~1*.*" 2^>Nul
                           ') do call :display "%%~aI" "%%I"
)

ENDLOCAL
goto :eof

:display
:: subroutine to display file attributes as csv line
:: %1 file attributes ---------
:: %2 file name
set "attr=%~1"
set "out="%attr:~0,1%""
set "out=%out%,"%attr:~1,1%""
set "out=%out%,"%attr:~2,1%""
set "out=%out%,"%attr:~3,1%""
set "out=%out%,"%attr:~4,1%""
set "out=%out%,"%attr:~5,1%""
set "out=%out%,"%attr:~6,1%""
set "out=%out%,"%attr:~7,1%""
set "out=%out%,"%attr:~8,1%""
set "out=%out:-=%"
echo %out%,"%~2"
goto :eof

要将单行输出限制为单个目录,请将dir命令的适当文件掩码与pipe组合到findstr command。例如,要获取当前目录的属性:

for /f "delims=" %I in ('dir /B /S /AD ".." 2^>Nul ^|findstr /I /R /C:"^%CD:\=\\%$"') do @echo %~aI "%~I"

输出(:

D:\bat\compressed folder>for /f "delims=" %I in ('dir /B /S /AD ".." 2^>Nul ^|findstr /R /C:"^%CD:\=\\%$"') do @echo %~aI "%~I"
d----c----- "D:\bat\compressed folder"

D:\bat\compressed folder>cd ..

D:\bat>for /f "delims=" %I in ('dir /B /S /AD ".." 2^>Nul ^|findstr /R /C:"^%CD:\=\\%$"') do @echo %~aI "%~I"
d---------- "D:\bat"

D:\bat>

或者只使用具有相同输出的for %I in (.) do @echo %~aI %~fI

获取当前目录及其内容的属性:

for /f "delims=" %I in ('dir /B /S /A ".." 2^>Nul ^|findstr /I /R /C:"^%CD:\=\\%"') do @echo %~aI "%~I"

输出:

D:\bat\compressed folder>for /f "delims=" %I in ('dir /B /S /A ".." 2^>Nul ^|findstr /I /R /C:"^%CD:\=\\%"') do @echo %~aI "%~I"
d----c----- "D:\bat\compressed folder"
d----c----- "D:\bat\compressed folder\Within compressed folder"
--a--c----- "D:\bat\compressed folder\Within compressed folder\xxx.csv"
--a--c----- "D:\bat\compressed folder\Within compressed folder\xxxx.csv"

D:\bat\compressed folder>

获取当前目录及其子文件夹的属性(无文件):

for /D /R %I in (.) do @echo %~aI %~fI

0
投票

compact命令行实用程序......

显示或更改NTFS分区上的文件或目录的压缩。如果在没有参数的情况下使用,compact将显示当前目录的压缩状态及其包含的文件。

https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/compact

以下是它的输出示例,仅显示大量文件(所有未压缩文件)的一般格式:

C:\Windows
λ compact *.exe

 Listing C:\Windows\
 New files added to this directory will not be compressed.

    71168 :     71168 = 1.0 to 1   bfsvc.exe
    44544 :     44544 = 1.0 to 1   clspack.exe
  2871808 :   2871808 = 1.0 to 1   explorer.exe
   103424 :    103424 = 1.0 to 1   extrac32.exe
    15360 :     15360 = 1.0 to 1   fveupdate.exe
   733696 :    733696 = 1.0 to 1   HelpPane.exe
    16896 :     16896 = 1.0 to 1   hh.exe
   306688 :    306688 = 1.0 to 1   IsUninst.exe
   154112 :    154112 = 1.0 to 1   jview.exe
    19456 :     19456 = 1.0 to 1   keyhh.exe
   193536 :    193536 = 1.0 to 1   notepad.exe
   427008 :    427008 = 1.0 to 1   regedit.exe
    30720 :     30720 = 1.0 to 1   REGTLIB.EXE
    42496 :     42496 = 1.0 to 1   setdebug.exe
    67072 :     67072 = 1.0 to 1   splwow64.exe
  1372840 :   1372840 = 1.0 to 1   Sysmon.exe
    49680 :     49680 = 1.0 to 1   twunk_16.exe
    31232 :     31232 = 1.0 to 1   twunk_32.exe
    24168 :     24168 = 1.0 to 1   UnsignedThemesSvc.exe
   296960 :    296960 = 1.0 to 1   winhlp32.exe
   147456 :    147456 = 1.0 to 1   wjview.exe
    10240 :     10240 = 1.0 to 1   write.exe

Of 22 files within 1 directories
0 are compressed and 22 are not compressed.
7,030,560 total bytes of data are stored in 7,030,560 bytes.
The compression ratio is 1.0 to 1.

这是第二个示例,显示了示例压缩文件的输出:

λ compact test*.txt

 Listing C:\Users\chg0418\Documents\
 New files added to this directory will not be compressed.

   266240 :    180224 = 1.5 to 1 C test.txt
    29970 :     28672 = 1.0 to 1 C test2.txt

Of 2 files within 1 directories
2 are compressed and 0 are not compressed.
296,210 total bytes of data are stored in 208,896 bytes.
The compression ratio is 1.4 to 1.

0
投票

我确认“%v”替换变量中间的“~a”修饰符只返回包含文件%v的文件夹的属性,而不是文件本身的属性...

要获得文件的实际压缩状态,请使用“COMPACT filanemes”显示其压缩比。

不幸的是,这并不直接显示文件的压缩,并且使用了“WOFADK.SYS”方法(XPRESS4K,XPRESS8K,XPRESS16K或LZX)用于特定的可执行文件(非可执行文件使用不同的方法)。 NTFS本机压缩不用于使用WOF / WOFADK覆盖驱动程序压缩的可执行文件(或多或少表现为具有结构化数据存储的重新分析点,指示压缩数据实际存储的位置,它可能位于WIM文件中的另一个文件中,以及组织文件的页面片段的位置)

在文件资源管理器中启用此设置时,WOF / WOFADK压缩的可执行文件未显示为“蓝色”:蓝色用于普通数据文件(文本/日志,位图/图标,XML,HTML,源文件......)。 WOF可以在其上使用,并在内部使用标准隐藏文件,这些文件可能是也可能不是自己使用NTFS压缩。这些WOF压缩文件在资源管理器中看起来好像它们没有被压缩,但在内部存储可能是稀疏的,如果WOF压缩文件有共同的碎片(例如大量的常见数据,它们将占用更少的空间,但是压缩是在内存页面大小边界上完成的。我认为这是出于性能原因在内核中完成的,因此WOF压缩可以避免跨越多个存储页面的片段,然后减少I / O,并且分页可以工作。

NTFS文件压缩可以更有效,但它不允许原位压缩,并且不能很好地扩展非读取文件:它只适用于一次压缩整个文件,以及顺序读取访问。 WOF压缩允许随机访问,但价格:压缩比更适中。 WOF-compaction还可以通过内部链接到公共存储池来压缩多个不同的可执行文件(这就是为什么Windows图像的WIM文件如此之小,与其扩展大小相比大约4GB的原因,大约是4倍:WOF-compaction是全局的在WIM文件中,最适合只读文件)。 WOF压缩显然也用于VM的VHDX格式;两者都在一个小的物理空间上创建一个虚拟的大型存储空间,但随机访问只读操作; WOF / WIM / VHDX中的写入操作可能很慢或者会降低压缩率(后台工作人员可以重新优化存储,如果没有更多的修改未决,并且没有写入访问就已经过了足够的时间)。

© www.soinside.com 2019 - 2024. All rights reserved.