使用批处理文件用真实数据覆盖可移动媒体上的可用空间



我正在创建一个批处理文件,用真实数据完全填充USB驱动器、SD卡、Micro SD卡等上的剩余可用空间,以防止恢复设备上以前删除的文件。

背景:我有一个简单的PNY品牌16GB SD卡,里面装有狩猎相机拍摄的静态照片。我用Windows 8的正常删除方法删除了照片。然后,我使用了Windows8格式功能(取消选中"快速格式"选项),据说可以安全地擦除数据。接下来,我在select驱动器上运行了DiskDigger.exe程序,它检索到了每一张照片。然后我运行Privazer.exe并在SD卡上执行3遍DoD覆盖。尽管如此,DiskDigger还是检索到了最后一张照片。通过多次尝试将数据复制并粘贴到卡上,然后运行安全擦除程序删除数据,照片仍然可以检索。我唯一能让照片无法检索的方法是用一个128字节的文本文件覆盖SD卡上的最后一个字节,重复复制直到满。当我重新格式化驱动器时,照片已无法恢复。

抱歉说得太详尽了,但希望每个人都知道确切的问题。

我想要什么:

  • .bat文件覆盖媒体上可用的每个字节的可用空间

  • 覆盖数据将来自同一DIR 中包含的一组.txt文件

  • 一旦执行,我不希望.bat文件在上提示用户

  • 我不想运行.bat文件到我得到磁盘满错误的地步

  • 我希望它能处理多达64GB的可移动驱动器

我有什么:

  • F:恰好是我的特定USB驱动器字母

  • 毫无疑问,这离高效还有数百万英里,但我本来打算用一种"只做点什么"的方法。直到我get"达到递归SETLOCAL限制"(然而,它填充了驱动器)

  • 我首先使用.bat文件生成了各种标准大小的.txt文件并将它们与我的overwrite.bat文件加载到同一目录中。我似乎无法使用批处理复制大于2GB的文件。因此,我创建了8个不同名称的2GB文本文件以覆盖至少一个16GB SD卡。我遇到的另一个问题是提示用户确认覆盖相同的文件名。我还没有弄清楚如何克服相同的文件名提示。

  • 为了让For语句准确读取剩余的可用空间。如果没有它们freespace变量在每次迭代中保持不变。

我知道有更好的方法,但请原谅,这就是我想要的帮助。有人能请吗

  • 演示如何正确循环此

  • 如果可能的话,向我展示如何在不提示用户的情况下强制复制重复的文件名。这将使我不必创建32个不同名称的2GB.txt文件来覆盖64GB驱动器。

  • 我知道它是初级的,但是的,我想要批量生产。

这个.bat文件应该从驱动器中读取可用空间,复制将放入该空间的最大.txt文件,重读可用空间,拷贝最大.txt文件等……直到它完全将驱动器填充到128字节的空间,而无需用户输入,也不会出错。

@echo off
Set "Blank=               "
Set "GB2=     2097152000"
Set "GB1=     1048576000"
Set "MB512=      524288000"
Set "MB256=      262144000"
Set "MB128=      131072000"
Set "MB64=       65536000"
Set "MB32=       32768000"
Set "MB16=       16384000"
Set "MB8=        8192000"
Set "MB4=        4096000"
Set "MB2=        2048000"
Set "MB1=        1024000"
Set "KB512=         512000"
Set "KB256=         256000"
Set "KB128=         128000"
Set "KB64=          64000"
Set "KB32=          32000"
Set "KB16=          16000"
Set "KB8=           8000"
Set "KB4=           4000"
Set "KB2=           2000"
Set "KB1=           1000"
Set "B512=            512"
Set "B256=            256"
Set "B128=            128"
Set "TB_10= 10995116277760"
for /F "tokens=2" %%i in ('date /t') do set mydate=%%i
set mytime=%time%
echo Current time is %mydate%:%mytime%
:Loop
setlocal
for /f "tokens=2" %%A in ('wmic LogicalDisk Get DeviceID^,FreeSpace ^| find /i "F:"') Do Set "FreeSpace=%Blank%%%A"
Set "FreeSpace=%FreeSpace:~-15%"
Echo FreeSpace="%FreeSpace%"
If "%FreeSpace%" gtr "%GB2%" ( xcopy "c:Batch FilesFile BuilderGigabytes2 (1).txt" F:
Echo File Copied )
setlocal
for /f "tokens=2" %%A in ('wmic LogicalDisk Get DeviceID^,FreeSpace ^| find /i "F:"') Do Set "FreeSpace=%Blank%%%A"
Set "FreeSpace=%FreeSpace:~-15%"
Echo FreeSpace="%FreeSpace%" 
If "%FreeSpace%" gtr "%GB2%" ( xcopy "c:Batch FilesFile BuilderGigabytes2 (2).txt" F:
Echo File Copied )
setlocal
for /f "tokens=2" %%A in ('wmic LogicalDisk Get DeviceID^,FreeSpace ^| find /i "F:"') Do Set "FreeSpace=%Blank%%%A"
Set "FreeSpace=%FreeSpace:~-15%"
Echo FreeSpace="%FreeSpace%" 
If "%FreeSpace%" gtr "%GB2%" ( xcopy "c:Batch FilesFile BuilderGigabytes2 (3).txt" F:
Echo File Copied )
setlocal
for /f "tokens=2" %%A in ('wmic LogicalDisk Get DeviceID^,FreeSpace ^| find /i "F:"') Do Set "FreeSpace=%Blank%%%A"
Set "FreeSpace=%FreeSpace:~-15%"
Echo FreeSpace="%FreeSpace%" 
If "%FreeSpace%" gtr "%GB2%" ( xcopy "c:Batch FilesFile BuilderGigabytes2 (4).txt" F:
Echo File Copied )
setlocal
for /f "tokens=2" %%A in ('wmic LogicalDisk Get DeviceID^,FreeSpace ^| find /i "F:"') Do Set "FreeSpace=%Blank%%%A"
Set "FreeSpace=%FreeSpace:~-15%"
Echo FreeSpace="%FreeSpace%" 
If "%FreeSpace%" gtr "%GB2%" ( xcopy "c:Batch FilesFile BuilderGigabytes2 (5).txt" F:
Echo File Copied )
setlocal
for /f "tokens=2" %%A in ('wmic LogicalDisk Get DeviceID^,FreeSpace ^| find /i "F:"') Do Set "FreeSpace=%Blank%%%A"
Set "FreeSpace=%FreeSpace:~-15%"
Echo FreeSpace="%FreeSpace%" 
If "%FreeSpace%" gtr "%GB2%" ( xcopy "c:Batch FilesFile BuilderGigabytes2 (6).txt" F:
Echo File Copied )
setlocal
for /f "tokens=2" %%A in ('wmic LogicalDisk Get DeviceID^,FreeSpace ^| find /i "F:"') Do Set "FreeSpace=%Blank%%%A"
Set "FreeSpace=%FreeSpace:~-15%"
Echo FreeSpace="%FreeSpace%" 
If "%FreeSpace%" gtr "%GB2%" ( xcopy "c:Batch FilesFile BuilderGigabytes2 (7).txt" F:
Echo File Copied )
setlocal
for /f "tokens=2" %%A in ('wmic LogicalDisk Get DeviceID^,FreeSpace ^| find /i "F:"') Do Set "FreeSpace=%Blank%%%A"
Set "FreeSpace=%FreeSpace:~-15%"
Echo FreeSpace="%FreeSpace%" 
If "%FreeSpace%" gtr "%GB2%" ( xcopy "c:Batch FilesFile BuilderGigabytes2 (8).txt" F:
Echo File Copied )
setlocal
for /f "tokens=2" %%A in ('wmic LogicalDisk Get DeviceID^,FreeSpace ^| find /i "F:"') Do Set "FreeSpace=%Blank%%%A"
Set "FreeSpace=%FreeSpace:~-15%"
Echo FreeSpace="%FreeSpace%" 
If "%FreeSpace%" gtr "%GB1%" ( xcopy "c:Batch FilesFile BuilderGigabytes1.txt" F:
Echo File Copied
GOTO :Loop )
If "%FreeSpace%" gtr "%MB512%" ( xcopy "c:Batch FilesFile BuilderMegabytes512.txt" F:
Echo File Copied
GOTO :Loop )
If "%FreeSpace%" gtr "%MB256%" ( xcopy "c:Batch FilesFile BuilderMegabytes256.txt" F:
Echo File Copied
GOTO :Loop )
If "%FreeSpace%" gtr "%MB128%" ( xcopy "c:Batch FilesFile BuilderMegabytes128.txt" F:
Echo File Copied
GOTO :Loop )
If "%FreeSpace%" gtr "%MB64%" ( xcopy "c:Batch FilesFile BuilderMegabytes64.txt" F:
Echo File Copied
GOTO :Loop )
If "%FreeSpace%" gtr "%MB32%" ( xcopy "c:Batch FilesFile BuilderMegabytes32.txt" F:
Echo File Copied
GOTO :Loop )
If "%FreeSpace%" gtr "%MB16%" ( xcopy "c:Batch FilesFile BuilderMegabytes16.txt" F:
Echo File Copied
GOTO :Loop )
If "%FreeSpace%" gtr "%MB8%" ( xcopy "c:Batch FilesFile BuilderMegabytes8.txt" F:
Echo File Copied
GOTO :Loop )
If "%FreeSpace%" gtr "%MB4%" ( xcopy "c:Batch FilesFile BuilderMegabytes4.txt" F:
Echo File Copied
GOTO :Loop )
If "%FreeSpace%" gtr "%MB2%" ( xcopy "c:Batch FilesFile BuilderMegabytes2.txt" F:
Echo File Copied
GOTO :Loop )
If "%FreeSpace%" gtr "%MB1%" ( xcopy "c:Batch FilesFile BuilderMegabytes1.txt" F:
Echo File Copied
GOTO :Loop )
If "%FreeSpace%" gtr "%KB512%" ( xcopy "c:Batch FilesFile BuilderKilobytes512.txt" F:
Echo File Copied
GOTO :Loop )
If "%FreeSpace%" gtr "%KB256%" ( xcopy "c:Batch FilesFile BuilderKilobytes256.txt" F:
Echo File Copied
GOTO :Loop )
If "%FreeSpace%" gtr "%KB128%" ( xcopy "c:Batch FilesFile BuilderKilobytes128.txt" F:
Echo File Copied
GOTO :Loop )
If "%FreeSpace%" gtr "%KB64%" ( xcopy "c:Batch FilesFile BuilderKilobytes64.txt" F:
Echo File Copied
GOTO :Loop )
If "%FreeSpace%" gtr "%KB32%" ( xcopy "c:Batch FilesFile BuilderKilobytes32.txt" F:
Echo File Copied
GOTO :Loop )
If "%FreeSpace%" gtr "%KB16%" ( xcopy "c:Batch FilesFile BuilderKilobytes16.txt" F:
Echo File Copied
GOTO :Loop )
If "%FreeSpace%" gtr "%KB8%" ( xcopy "c:Batch FilesFile BuilderKilobytes8.txt" F:
Echo File Copied
GOTO :Loop )
If "%FreeSpace%" gtr "%KB4%" ( xcopy "c:Batch FilesFile BuilderKilobytes4.txt" F:
Echo File Copied
GOTO :Loop )
If "%FreeSpace%" gtr "%KB2%" ( xcopy "c:Batch FilesFile BuilderKilobytes2.txt" F:
Echo File Copied
GOTO :Loop )
If "%FreeSpace%" gtr "%KB1%" ( xcopy "c:Batch FilesFile BuilderKilobytes1.txt" F:
Echo File Copied
GOTO :Loop )
If "%FreeSpace%" gtr "%B512%" ( xcopy "c:Batch FilesFile BuilderBytes512.txt" F:
Echo File Copied
GOTO :Loop )
If "%FreeSpace%" gtr "%B256%" ( xcopy "c:Batch FilesFile BuilderBytes256.txt" F:
Echo File Copied
GOTO :Loop )
If "%FreeSpace%" gtr "%B128%" ( xcopy "c:Batch FilesFile BuilderBytes128.txt" F:
Echo File Copied )
for /f "tokens=2" %%j in ('date /t') do set enddate=%%j
set endtime=%time%
echo Beginning time was %mydate%:%mytime%
echo Ending time was %enddate%:%endtime%
pause

文件运行

我提出了一个有效的解决方案,可以用真实的文本数据覆盖可移动媒体上的可用空间。.bat程序在我的笔记本电脑上从头到尾运行,没有用户输入或错误。

通过USB卡适配器使用一张空白的16GB SD卡,我将运行时间与CCleaner进行了比较。

  • 我的.bat文件花了33分钟才用文本数据完全填充SD卡。

  • "1次伪随机数据"上的CCleaner设置耗时32分钟。

与大型商业品牌的比较给我留下了相当深刻的印象。我知道这个.bat文件正在向驱动器上的每个可用空间写入数据;然而,我不肯定1次伪随机CCleaner也能做到这一点。我也可以放心,这个.bat文件不会给家里打电话,不会收集用户数据,也不会对我进行统计。这就是我选择编写.bat文件而不是使用别人的商业品牌的原因。没有广告,没有弹出窗口,没有隐藏的互联网连接,等等…

如果有人想真正使用这个程序,我可以发布我用来生成特定大小的.txt文件的.bat文件的副本,这些文件被用作填充数据。只要给我发信息,我会尽快给你回复的。

下面是我的.bat程序。我尽力去评论它。我仍然对缩小或精简它以提高效率的建议持开放态度。我不是专家,这正是我现在处理批量的地方。最后时间计算不正确。我想你不能简单地从结束时间减去开始时间。我会努力的,不过不会出错。

::  THIS BATCH FILE FILLS THE REMAINING FREE SPACE OF A DRIVE WITH PREDETERMINED
::  USER CREATED DATA FILES OF SPECIFIC BYTE LENGTHS EQUALING THE LENGTHS SHOWN
::  BELOW IN THE VARIABLE INITIALIZATIONS.  
@echo off
Set "Blank=               "
Set "GB64=    67108864000"
Set "GB32=    33554432000"   
Set "GB16=    16777216000"
Set "GB8=     8388608000"
Set "GB4=     4194304000"
Set "GB2=     2097152000"
Set "GB1=     1048576000"
Set "MB512=      524288000"
Set "MB256=      262144000"
Set "MB128=      131072000"
Set "MB64=       65536000"
Set "MB32=       32778000"
Set "MB16=       16384000"
Set "MB8=        8192000"
Set "MB4=        4096000"
Set "MB2=        2048000"
Set "MB1=        1024000"
Set "KB512=         512000"
Set "KB256=         256000"
Set "KB128=         128000"
Set "KB64=          64000"
Set "KB32=          32000"
Set "KB16=          16000"
Set "KB8=           8000"
Set "KB4=           4000"
Set "KB2=           2000"
Set "KB1=           1000"
Set "B512=            512"
Set "B256=            256"
Set "B128=            128"
::  GET THE FILE EXECUTION START TIME
set StartTime=%time%
echo Start time is %StartTime%
echo.
::  GET THE CURRENT AMOUNT OF FREE SPACE ON THE REMOVEABLE MEDIA (CHANGE DRIVE LETTER AS APPROPRIATE)
for /f "tokens=2" %%A in ('wmic LogicalDisk Get DeviceID^,FreeSpace ^| find /i "F:"') Do Set "FreeSpace=%Blank%%%A"
::  LIMIT THE VARIABLE TO 15 DIGITS
Set "FreeSpace=%FreeSpace:~-15%"
::  PRINT INITIAL FREE SPACE IN TERMINAL WINDOW
echo Amount of intial free space to be filled = %FreeSpace%
echo.
::  BEGIN PROCESS OF NARROWING DOWN FREE SPACE BY COPYING LARGEST FILES FIRST THEN INCREMENTALLY SMALLER ONES
If "%FreeSpace%" gtr "%GB64%" ( call :TooLarge )
If "%FreeSpace%" gtr "%GB2%" ( call :Over2MB )
If "%FreeSpace%" gtr "%GB1%" ( xcopy "c:Batch FilesFile BuilderGigabytes1.txt" F: 
call :ReCalculate)
If "%FreeSpace%" gtr "%MB512%" ( xcopy "c:Batch FilesFile BuilderMegabytes512.txt" F: 
call :ReCalculate)
If "%FreeSpace%" gtr "%MB256%" ( xcopy "c:Batch FilesFile BuilderMegabytes256.txt" F:
call :ReCalculate )
If "%FreeSpace%" gtr "%MB128%" ( xcopy "c:Batch FilesFile BuilderMegabytes128.txt" F:
call :ReCalculate )
If "%FreeSpace%" gtr "%MB64%" ( xcopy "c:Batch FilesFile BuilderMegabytes64.txt" F: 
call :ReCalculate)
If "%FreeSpace%" gtr "%MB32%" ( xcopy "c:Batch FilesFile BuilderMegabytes32.txt" F: 
call :ReCalculate)
If "%FreeSpace%" gtr "%MB16%" ( xcopy "c:Batch FilesFile BuilderMegabytes16.txt" F: 
call :ReCalculate)
If "%FreeSpace%" gtr "%MB8%" ( xcopy "c:Batch FilesFile BuilderMegabytes8.txt" F: 
call :ReCalculate)
If "%FreeSpace%" gtr "%MB4%" ( xcopy "c:Batch FilesFile BuilderMegabytes4.txt" F: 
call :ReCalculate)
If "%FreeSpace%" gtr "%MB2%" ( xcopy "c:Batch FilesFile BuilderMegabytes2.txt" F: 
call :ReCalculate)
If "%FreeSpace%" gtr "%MB1%" ( xcopy "c:Batch FilesFile BuilderMegabytes1.txt" F: 
call :ReCalculate)
If "%FreeSpace%" gtr "%KB512%" ( xcopy "c:Batch FilesFile BuilderKilobytes512.txt" F: 
call :ReCalculate)
If "%FreeSpace%" gtr "%KB256%" ( xcopy "c:Batch FilesFile BuilderKilobytes256.txt" F: 
call :ReCalculate)
If "%FreeSpace%" gtr "%KB128%" ( xcopy "c:Batch FilesFile BuilderKilobytes128.txt" F: 
call :ReCalculate)
If "%FreeSpace%" gtr "%KB64%" ( xcopy "c:Batch FilesFile BuilderKilobytes64.txt" F: 
call :ReCalculate)
If "%FreeSpace%" gtr "%KB32%" ( xcopy "c:Batch FilesFile BuilderKilobytes32.txt" F: 
call :ReCalculate)
If "%FreeSpace%" gtr "%KB16%" ( xcopy "c:Batch FilesFile BuilderKilobytes16.txt" F: 
call :ReCalculate)
If "%FreeSpace%" gtr "%KB8%" ( xcopy "c:Batch FilesFile BuilderKilobytes8.txt" F: 
call :ReCalculate)
If "%FreeSpace%" gtr "%KB4%" ( xcopy "c:Batch FilesFile BuilderKilobytes4.txt" F: 
call :ReCalculate)
If "%FreeSpace%" gtr "%KB2%" ( xcopy "c:Batch FilesFile BuilderKilobytes2.txt" F: 
call :ReCalculate)
If "%FreeSpace%" gtr "%KB1%" ( xcopy "c:Batch FilesFile BuilderKilobytes1.txt" F: 
call :ReCalculate)
If "%FreeSpace%" gtr "%B512%" ( xcopy "c:Batch FilesFile BuilderBytes512.txt" F: 
call :ReCalculate)
If "%FreeSpace%" gtr "%B256%" ( xcopy "c:Batch FilesFile BuilderBytes256.txt" F: 
call :ReCalculate)
If "%FreeSpace%" gtr "%B128%" ( xcopy "c:Batch FilesFile BuilderBytes128.txt" F: 
call :ReCalculate)
echo. 
echo.
echo.
echo ---------Amount of free space remaining on drive f: = %FreeSpace%----------
echo.
echo.
setlocal
set StopTime=%time%
set /a CompletionTime=%StopTime%-%StartTime%
echo Total execution time was %CompletionTime% 
echo.
echo.
pause
exit /b
::  RECALCULATE FREE SPACE AFTER EACH FILE IS COPIED
:ReCalculate
for /f "tokens=2" %%A in ('wmic LogicalDisk Get DeviceID^,FreeSpace ^| find /i "F:"') Do Set "FreeSpace=%Blank%%%A"
Set "FreeSpace=%FreeSpace:~-15%"
goto :eof

::  PERFORM COPY OF MORE THAN ONE 2MB FILE, IF NECESSARY, BY RENAMING THE FILE TO BE COPIED
::  SO AS TO AVOID A 'FILE ALREADY EXISTS' USER PROMPT
:Over2MB
set /a Counter=Counter+1
xcopy "c:Batch FilesFile BuilderGigabytes2 ("%Counter%").txt" F:
echo File Copied "%Counter%" times.
for /f "tokens=2" %%A in ('wmic LogicalDisk Get DeviceID^,FreeSpace ^| find /i "F:"') Do Set "FreeSpace=%Blank%%%A"
Set "FreeSpace=%FreeSpace:~-15%"
Echo FreeSpace="%FreeSpace%"
If "%FreeSpace%" gtr "%GB2%" ( goto :Over2MB ) 
goto :eof
::  INFORM USER THAT THE DRIVE SPACE EXCEEDS THE CAPABILITIES OF THIS BATCH FILE 
:TooLarge
echo.
echo.
echo This program is limited to devices 64 MB or less.
echo.
echo.
echo --------------- PROGRAM ENDED ------------------
echo.
echo.
pause
exit /b

最新更新