我想检测脚本的包含文件夹中是否启用了Windows文件夹压缩。
编辑:答案是在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
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.
我确认“%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中的写入操作可能很慢或者会降低压缩率(后台工作人员可以重新优化存储,如果没有更多的修改未决,并且没有写入访问就已经过了足够的时间)。