当硬盘驱动器写入磁盘时,它如何知道写入时扇区是否坏,如果以前知道它是好的?据我所知,它不会读回它写入的数据,它只是把它放下,对吗?
它只是得到磁场强度不够高的反馈吗?还是只会在该扇区的下一次读取过程中检测到?
当硬盘驱动器写入磁盘时,它如何知道写入时扇区是否坏,如果以前知道它是好的?据我所知,它不会读回它写入的数据,它只是把它放下,对吗?
它只是得到磁场强度不够高的反馈吗?还是只会在该扇区的下一次读取过程中检测到?
有没有办法在不尝试修复的情况下使用 Windows CHKDSK 运行硬盘驱动器的表面扫描?
我看到的表面扫描的唯一选项是/r
扫描表面但也尝试恢复坏扇区。如果您怀疑驱动器坏了,我不一定要尝试恢复,只需检查表面是否有坏扇区,尝试备份,然后尝试修复。
我知道还有其他工具可以解决这个问题,但想知道 CHKDSK 是否有办法?
编辑:不知道为什么投反对票,这是一个有效的问题。
使用 Windows Batch,我要做的就是获取以 MB 为单位的指定驱动器大小(按驱动器号)以及该驱动器可用的相应可用空间,该驱动器以整数形式存储在变量中,以进行一些基本的数学运算。
我使用这个脚本:
for /f "usebackq delims== tokens=2" %%x in (`wmic logicaldisk where "DeviceID='Z:'" get Size /format:value`) do
set SizeDisk=%%x
for /f "usebackq delims== tokens=2" %%x in (`wmic logicaldisk where "DeviceID='Z:'" get FreeSpace /format:value`) do
set FreeS=%%x
这给了我想要的值。但是,当我截断最后六位数字给我 MB 时(它足够接近我的需要):
SET /A SizeDiskMB=%SizeDisk:~0,-6%
SET /A FreeSMB=%FreeS:~0,-6%
它只截断最后五位而不是六位。如果我使用~0,-7
,那么它会给我正确的值,但我想了解它为什么这样做。我还需要这些作为整数值,所以我可以做一些基本的数学运算,这就是/A
.
感谢您的任何帮助。
编辑:
好的,我意识到在我真正做数学之前我不需要 /A 。我以为它会将变量设置为整数,但似乎并非如此。所以暂时忽略它。
我运行了以下代码:
@ECHO OFF
cls
for /f "usebackq tokens=2 delims==" %%x in (`wmic logicaldisk where "DeviceID='Z:'" get Size /format:value`) do set SizeDisk=%%x
Echo Size Disk: %SizeDisk% bytes
Echo Size Disk 0,-1: %SizeDisk:~0,-1%
Echo Size Disk 0,-2: %SizeDisk:~0,-2%
Echo Size Disk 0,-3: %SizeDisk:~0,-3% KB
Echo Size Disk 0,-4: %SizeDisk:~0,-4%
Echo Size Disk 0,-5: %SizeDisk:~0,-5%
Echo Size Disk 0,-6: %SizeDisk:~0,-6% MB
Echo Size Disk 0,-7: %SizeDisk:~0,-7%
Pause
并收到以下结果:
Size Disk: 1887436795904 bytes <-- Same
Size Disk 0,-1: 1887436795904 <-- Same
Size Disk 0,-2: 188743679590
Size Disk 0,-3: 18874367959 KB
Size Disk 0,-4: 1887436795
Size Disk 0,-5: 188743679
Size Disk 0,-6: 18874367 MB
Size Disk 0,-7: 1887436
Press any key to continue . . .
"Size Disk"
并且"Size Disk 0,-1"
是相同的。不应该。
我想知道是否有一种快速简单的方法来搜索具有多个字符的文件名并删除之后的所有字符。
例如,如果我有一个名为:
Great Movie Title 2021 1080p asldkfjalfj.mkv
Another Great Movie 1997 480p aldfasdfa.avi
Boring movie but its ok 2015 720p asadfqwr.mp4
我想在文件名中找到1080p
, 720p
,480p
然后删除它后面的所有内容。
我知道您可以使用 Windows 批处理For
循环,但您只能使用单个字符来查找它。即使它是可以做到这一点的第三方应用程序,但我似乎无法找到它。
我在家中连接了一些 PoE 安全摄像头,使用实芯 CAT6 电缆。我可以将摄像头直接连接到监控盒,但为了使其干净并具有灵活性,想将摄像头线安装到墙上的穿孔梯形插孔,然后使用 CAT6 跳线将监控盒连接到墙上杰克。
不确定这是否是 PoE 设备公认的做法,或者最好直接运行。这是所有 CAT6 布线,长度不超过 75 英尺。
我确实使用耦合器进行了测试,视频和音频质量很好。
所以而不是:
Camera --> CAT6 Cable --> Surveillance Box
做:
Camera --> CAT6 Cable --> Keystone Wall Jack --> CAT6 patch cable --> Surveillance Box
谢谢。
感谢这里的另一个用户,我能够发现 Powershell 比较对象。
我使用的代码很简单,这里是:
$array = Compare-Object $(Get-Content $Source1) $(Get-Content $Source2)
$array | where {$_.SideIndicator -eq "<="} | Format-Table -Property InputObject -AutoSize -HideTableHeaders | Out-File -Width 512 -Encoding utf8 NoMatchA.txt
$array | where {$_.SideIndicator -eq "=>"} | Format-Table -Property InputObject -AutoSize -HideTableHeaders | Out-File -Width 512 -Encoding utf8 NoMatchB.txt
我比较的文件是哈希+文件路径,看起来像这个测试输入源A:
0004250736cc617f596b24d69c52a1276ea7f81cd5f7c7e49458894987d02538 D:\Documents\Server\DBackupServer\snapraid\Archive\authors.txt
5a10fd71a62ca272908ded8a7f20826722c0fc67da22256accb42159baa13af2 D:\Documents\Server\DBackupServer\snapraid\Archive\copying.txt
d3d868c751b91c5bd5105db5b9c4f35429fe85a6405bf7fa073d969a0f24a4bc D:\Documents\Server\DBackupServer\snapraid\Archive\history.txt
a1ca63b535996640ac4c5ae0fb91998ebcb495928a637d8d8f71508573c289bd D:\Documents\Server\DBackupServer\snapraid\Archive\install.txt
62f9bfd975bc0773be108b20467d6ece969e06e033b5ae51fb56597d09800000 D:\Documents\Server\DBackupServer\snapraid\Archive\readme.txt
来源B:
0004250736cc617f596b24d69c52a1276ea7f81cd5f7c7e49458894987d00000 E:\Documents\Server\DBackupServer\snapraid\Archive\authors.txt
06d99bb9e6b9c0f57828b29a465a769628da86faca48a104fbdd3263d85eda4d E:\Documents\Server\DBackupServer\snapraid\Archive\backup_snapraid.bat
5a10fd71a62ca272908ded8a7f20826722c0fc67da22256accb42159baa13af2 E:\Documents\Server\DBackupServer\snapraid\Archive\history.txt
a1ca63b535996640ac4c5ae0fb91998ebcb495928a637d8d8f71508573c289bd E:\Documents\Server\DBackupServer\snapraid\Archive\install.txt
62f9bfd975bc0773be108b20467d6ece969e06e033b5ae51fb56597d098969f3 E:\Documents\Server\DBackupServer\snapraid\Archive\readme.txt
但我希望它忽略驱动器号,以便我可以比较来自两个不同来源的两个文件。现在我通过for /f
批处理文件中的命令运行哈希日志文件以删除驱动器号,但是对于大量条目可能需要很长时间。
compare-object 有什么方法可以忽略驱动器号?这:
是驱动器号的唯一标识符(尽管最终希望让它与前面的 UNC 一起工作\\
)并且考虑到哈希值,它应该始终位于相同的位置,所以这可能会有所帮助。
我尝试使用该Split()
命令,虽然我可以根据空格字符拆分对象,但我不确定如何将它实现到比较对象中。
我尝试使用:get-content $Source1 | foreach {$_ -replace "D:", ""} | Set-Content "$Source1a"
这与批处理文件一样长...
谢谢你的帮助。
编辑:谢谢大家到目前为止的帮助。我还没有机会测试一个提案,明天应该会去。
无论如何,为了澄清我正在寻找三个文件输出:
从上面的测试输入中,结果输出将是“FileAnotInB.txt”:
5a10fd71a62ca272908ded8a7f20826722c0fc67da22256accb42159baa13af2 D:\Documents\Server\DBackupServer\snapraid\Archive\copying.txt
从上面的测试输入中,结果输出将是“FileBnotInA.txt”:
06d99bb9e6b9c0f57828b29a465a769628da86faca48a104fbdd3263d85eda4d E:\Documents\Server\DBackupServer\snapraid\Archive\backup_snapraid.bat
从上面的 Test INPUT 中,结果输出将是(通知 00000 在哈希末尾替换以进行测试)“FailedHashes.txt”:
0004250736cc617f596b24d69c52a1276ea7f81cd5f7c7e49458894987d02538 D:\Documents\Server\DBackupServer\snapraid\Archive\authors.txt
0004250736cc617f596b24d69c52a1276ea7f81cd5f7c7e49458894987d00000 D:\Documents\Server\DBackupServer\snapraid\Archive\authors.txt
62f9bfd975bc0773be108b20467d6ece969e06e033b5ae51fb56597d09800000 E:\Documents\Server\DBackupServer\snapraid\Archive\readme.txt
62f9bfd975bc0773be108b20467d6ece969e06e033b5ae51fb56597d098969f3 E:\Documents\Server\DBackupServer\snapraid\Archive\readme.txt
看起来 JosefZ 的回应可能会做到这一点,或者至少我可以调整它来做到这一点。我必须测试才能看到,但想编辑以澄清并感谢您的帮助!
编辑:看来我在声明GOTO :EOF
的末尾有一个迷路ECHO
,它实际上会 GOTO :EOF ... d'oh!感谢您的回复。我认为这个错误现在被压扁了。
我有一个脚本,我想在其中滚动一个文本文档,比较文件是否匹配。
脚本在这里:
setlocal enabledelayedexpansion
for /f "tokens=1* delims=\" %%a in (NoMatchA.txt) DO (
set "flag="
for /f "tokens=1* delims=\" %%i in (NoMatchB.txt) do (
IF "%%b"=="%%j" SET flag=1
)
IF DEFINED flag ECHO FLAG DEFINED
IF NOT DEFINED flag ECHO FLAG NOT DEFINED
)
endlocal
组成输入NoMatchA.txt
和NoMatchB.txt
组成示例:
1234567890 \TEMP\ANIMALS\DOGS\FILE1.pdf
0987654321 \TEMP\TREES\I hate willows.docx
1122334455 \TEMP\LINUX ISOS\linustarvolds.iso
1029384756 \COVID\CANSUCk\MYBALLS\prettyflowers.jpg
1231509876 \USERS\HOMERSIMPSON\Doh.wav
1234567890 \TEMP\ANIMALS\DOGS\FILE1.pdf
0987654321 \TEMP\TREES\I hate willows.docx
1029383321 \COVID\CANSUCk\MYBALLS\prettyflowers.jpg
你得到图片。如果我回显,IF "%%b"=="%%j" SET flag=1
我可以清楚地看到它们是相等的,但flag
仍然显示为未定义。
所以基本上,如果文件名匹配,我想以某种方式处理该数据。
我有这个脚本:
for /f "delims=" %%a in (data_A.txt) DO (
set "flag="
for /f "delims=" %%b in (data_B.txt) do (
if "%%a"=="%%b" CALL :flagit
)
if not defined flag >>notmatch.txt echo %%a
)
:flagit
set flag=1
goto :eof
我正在比较两个文本文件之间的每一行以确定不匹配的条目。这些文件包含校验和哈希值和相对路径信息。
它可以工作,但速度很慢。包含 100,000 个条目的文件需要两个半小时以上,我必须这样做两次,因为我必须比较两种方法来捕获 A 上可能不在 B 上但也可能不在 A 上的 B 上的任何条目。数据也不一定是任何特定的排序顺序。
我正在寻找:
前两个我很容易处理(文件不在 A/B 上),因为一旦我得到“不匹配”条目,它们应该很少,并且比较两者上是否存在相对路径应该是直截了当的(我希望)。但最后一个是真正的糟糕。
数据示例:
dd2da0dcb5a54989dd4d2312013ddb12345c0593ed59a6d307461d925d57226d89d24c2e5a95c0d4082b14118cb8766d89ae69e40c4dac1ab5bd718bd7c58d9a \Personal\Pictures\Camera 2019\2019-02-17 15.02.34.jpg
509ebfd1e2c180ccd6bd679204b7c255f3c7abcdefg7660e219fa9eb58658d96a3ef8cec179221acb78be81f8dd78bd3a8b1a3cdaef0cd691725d3402a495b0b \Personal\Pictures\Camera 2019\2019-02-17 15.03.59.jpg
a3180dce7675aeb161f8fe25fcbd39ff2678faf2326d3e2a39fchfasff90a714134bdd22f91103026c494e6ffcfd62d5cb3d46992de9dfff71b49f9a734c0ab9 \Personal\Pictures\Camera 2019\2019-02-17 17.11.41.jpg
b5262c6ce5c4425a4ed737a7a8fdbc040c68003785d67177a25c86d9fb531ce42f74648783aed4bbb3aff7304b00d44b14eaa2a6c728b8802cafd22059570212 \Personal\Pictures\Camera 2019\2019-02-18 18.06.14.jpg
da7e1eb7ec147628a59e702c55159bc32d66f3c540dfb4be436f136137af913a7139640701eba84f34796da4f35c9fasdffae35542f56b1dccf009d1cec30d20 \Personal\Pictures\Camera 2019\2019-02-22 06.18.15.jpg
72c99a6f4394b4f65d4b66b00071de1d40cb717f525863875c36b2bc79dd0a8491ee8854b8b4437bfcfe4aa8379861aa43a7850dfac144d5db5b2c6b75dcf292 \Personal\Pictures\Camera 2019\2019-02-22 06.18.23.jpg
4a8a39e68379b2c671d83935b13dc82dd60d5e8b36a32a8677698a9306876zcvaffaaa4af292d53a8f52df4ee1c7bc701068064f4d28009566e8825abf2ab077 \Personal\Pictures\Camera 2019\2019-02-22 06.20.10.jpg
074103664be0c91664bd4e2e51d0e051c9cf8f27c26511d3a691d0asdfadfa134234808a16bf0679a8500910b09cf24d9e9c88788b4a749a81ec2d15f78cacfd \Personal\Pictures\Camera 2019\2019-02-22 06.27.14.jpg
28dc03a7722b0781caa4dfasdf664w666777068c79456941a159ffefa1d9c34fed83b98858394c1aa471396a0b1a448d8dd89e361c564e6b27e451b2dd701dd7 \Personal\Pictures\Camera 2019\2019-02-23 11.54.34.jpg
for 循环的工作方式是扫描另一个文件,直到找到不匹配的文件,将其输出到日志文件,然后转到下一个文件。似乎应该有一种方法可以在文件匹配或不匹配后将其从搜索中删除。
编辑- 好的,我有点搞乱 PowerShell。比较对象运行良好,但只需要弄清楚如何仅显示 A和B 上都存在的不同文件,并将仅在 A 上的文件和仅在 B 上的文件分开记录...
我正在运行的 PowerShell 脚本的一部分,我希望它完全忽略特定文件夹或路径。
我尝试使用-notmatch
and also-notlike
运算符。但它似乎仍会遍历该文件夹中的每个文件。虽然它不会处理该文件夹中的项目,所以我得到了想要的结果,但该文件夹中仍然有数十万个文件,并且可能需要很长时间才能运行脚本。我只是希望它完全绕过该文件夹。
这是我拥有的脚本的一部分:
$allfiles = Get-ChildItem -path $BaseDirectory -Force -File -Recurse | ? { $_.FullName -notmatch 'DATA\SHARED\GAMES\STEAM\SteamLibrary' } | select-object Name,FullName,Length
我也试过:
Where { $_.FullName -notlike '*\DATA\SHARED\GAMES\STEAM\SteamLibrary\*' }
有没有更好的方法让它完全跳过该文件夹,最好使用相对路径?甚至只是文件夹名称SteamLibrary
谢谢!
我有这个脚本的一部分,用于在文件夹结构中递归地单独加密/压缩文件。
它可以工作,除非它似乎是一个特定的文件夹,它会返回并开始压缩已经压缩的文件。我不太清楚是什么原因造成的。
文件夹中的文件名也都是一致的(它们是图像)。比如“ 2017-08-16 18.16.51.jpg
”。压缩每个文件后,它会命名文件file1.7z
file2.7z
file3.7z
,直到遍历所有子文件夹中的所有文件。
这是代码:
SETLOCAL DISABLEDELAYEDEXPANSION
...
...
<MORE SCRIPT HERE>
...
...
set count=0
for /r "%sourcedir%" %%a in (*) do (
CLS
set /A count+=1
SETLOCAL EnableDelayedExpansion
set fnz=file!count!.7z
ECHO ***
ECHO *** ENCRYPTING "%%a" as "!fnz!"
ECHO ***
ECHO *** FILE NUMBER !count! OUT OF !files!
ECHO ***
ECHO %%a !fnz! >> "!batchdir!7ZIP_FILEREF_!folderzip!.txt"
!batchdir!7z.exe a -mx9 -sdel -p"!password!" -mhe=on "%%~dpa!fnz!" "%%a" >nul
ENDLOCAL
)
...
...
<MORE SCRIPT HERE>
...
...
ENDLOCAL
变量batchdir
和folderzip
较早在脚本中设置。
这是日志从最后一个文件翻转时的一些示例输出,以开始压缩已经压缩的文件file100.7z
。左边的文件/文件夹是被压缩的文件。file###.7z
右边的文件是压缩文件名:
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\2017-08-13 13.24.18.jpg file961.7z
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\2017-08-13 13.25.02.mp4 file962.7z
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\2017-08-14 18.03.02.mp4 file963.7z
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\2017-08-15 12.33.20.jpg file964.7z
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\2017-08-16 18.16.51.jpg file965.7z
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\2017-08-16 18.16.53.jpg file966.7z
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\2017-08-16 18.18.26.jpg file967.7z
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\2017-08-16 18.18.27.jpg file968.7z
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\2017-08-16 18.18.29.jpg file969.7z
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\2017-08-17 13.10.56.jpg file970.7z
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\2017-08-18 06.59.19.jpg file971.7z
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\BMPhoneWallpaper.png file972.7z
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\file100.7z file973.7z
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\file101.7z file974.7z
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\file102.7z file975.7z
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\file103.7z file976.7z
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\file104.7z file977.7z
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\file105.7z file978.7z
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\file106.7z file979.7z
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\file107.7z file980.7z
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\file108.7z file981.7z
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\file109.7z file982.7z
E:\Temp\MDISC\Personal Test C17\Pictures\Camera 2017\file110.7z file983.7z
就像我说的,到目前为止,它只有这个 ONE subfolder Camera 2017
。我有其他像这样的文件夹Camera 2014
Camera 2015
Camera 2016
,zip 完全没有问题。
感叹号是我使用 Windows Batch 的祸根。假设我只想跳过其中包含的文件名!
。
我知道在 for 循环中检查变量中的常规文本,我可以运行:
setlocal enabledelayedexpansion
for /r %%a in (*) do (
set fname=%%~na
if not "!fname!"=="!fname:text=!" ECHO File contains the word "text"
)
但是如何指定感叹号呢?
我试图用 ^ 来逃避它:"!fname:^!=!"
然后我看到使用 enabledelayedexpansion 你需要一个^^!
来转义角色。所以我尝试了没有运气。然后我想可能三个^^^!
两个来逃避延迟扩展,一个在文件名中......
没运气...
有什么建议么?
我遇到问题的部分脚本在这里:
setlocal enabledelayedexpansion
for /r %%a in (*) do (
cd "%%~dpa"
set /A count += 1
set fn=file!count!
%batchdir%\7z.exe a -mx9 -sdel -p"%password%" -mhe=on "!fn!.7z" "%%~nxa"
)
但是文件名变量不能正确处理带有感叹号的文件名。fn
%%~nxa
!
有没有办法解决这个问题?
谢谢。
编辑:改变fn
那%%~nxa
是问题
我有一个 Powershell 脚本(在此人的帮助下,谢谢!)正在将值写入 xml,以便稍后与另一个 xml 进行比较。
重要的命令在这里输出要比较的数据:
'RelativePath' = ($file.fullname.substring($BaseDirectory.Length))
$file 用于在 for 循环中通过递归子目录分析的文件名。
$BaseDirectory 是开始分析的起始文件夹
'RelativePath' 正确解析文件夹路径,如果它是子目录(即 C:\Temp),则以前导“\”开头。但如果它是根路径(即只是 C:),它会存储不带前导“\”的路径。
例如,运行带有$BaseDirectory='T:\'
输出的脚本如下所示(参考“RelativePath”):
-<Obj RefId="2">
<TNRef RefId="0"/>
-<MS>
<S N="Hash">F13B655DEC0C07ACFD9329CB250276A3</S>
<S N="FullPath">T:\20200412_193057\Public\Terraria\Jim's_wolrd.wld</S>
<S N="FileName">Jim's_wolrd.wld</S>
<I64 N="Size">11387570</I64>
<S N="RelativePath">20200412_193057\Public\Terraria\Jim's_wolrd.wld</S>
</MS>
</obj>
但$BaseDirectory='Q:\Archive'
输出看起来像这样(再次参考“RelativePath”):
-<Obj RefId="2">
<TNRef RefId="0"/>
-<MS>
<S N="Hash">F13B655DEC0C07ACFD9329CB250276A3</S>
<S N="FullPath">Q:\Archive\20200412_193057\Public\Terraria\Jim's_wolrd.wld</S>
<S N="FileName">Jim's_wolrd.wld</S>
<I64 N="Size">11387570</I64>
<S N="RelativePath">\20200412_193057\Public\Terraria\Jim's_wolrd.wld</S>
</MS>
</obj>
唯一的区别是“RelativePath”有前导“\”。因此,当我比较两者时,它们不相等,因为前导路径反斜杠(或缺少它)。
在 Windows 批处理文件中,有没有办法检查压缩文件的 7zip 密码是否正确?
我想检查它是否成功,继续执行脚本(使用 call 或 goto 例程),如果不成功,则状态密码不正确,然后将循环返回以再次询问密码。
我知道我可以使用测试标志7z t -p%password% <path>
,但不确定如何读取结果并自动确定它是否正确。
谢谢。
我有以下代码,我系统地检查并单独压缩每个文件。我不在乎文件名是什么,但我希望它或多或少地隐藏起来,所以只会调用每个文件“文件 1”、“文件 2”、“文件 3”等。
但是如何将变量传递fn=file!count!
给 7z.exe 命令行?我添加echo
命令只是为了确保变量正常工作,并且确实如此。但是如何让 fn 在 7z 命令行中解析为实际的“file1”“file2”等?我试过 %, !, %!, !%, %% ...大声笑。它只是给出一个空白文件名或 !fn! 或 %fn% 不是实际的变量值。
代码在这里,并提前感谢任何帮助:
setlocal enableextensions enabledelayedexpansion
cd /d E:\Temp\ziptest\Documents
set /A count=0
for /r %%a in (*) do (
cd "%%~pa"
set /A count += 1
echo !count!
set fn=file!count!
echo !fn!
pause
REM 7z.exe a -mx9 -mmt12 -sdel -pt3st! -mhe=on "!fn!.7z" "%%~nxa"
)
endlocal
输出示例,您可以看到它正确递增并正确解析文件##:
E:\Temp\ziptest>setlocal enableextensions enabledelayedexpansion
E:\Temp\ziptest>cd /d E:\Temp\ziptest\Documents
E:\Temp\ziptest\Documents>set /A count=0
E:\Temp\ziptest\Documents>for /R %a in (*) do (
cd "%~pa"
set /A count += 1
echo !count!
set fn=file!count!
echo !fn!
pause
REM 7z.exe a -mx9 -mmt12 -sdel -pt3st! -mhe=on "!fn!.7z" "%~nxa"
)
E:\Temp\ziptest\Documents>(
cd "\Temp\ziptest\Documents\"
set /A count += 1
echo !count!
set fn=file!count!
echo !fn!
pause
REM 7z.exe a -mx9 -mmt12 -sdel -pt3st! -mhe=on "!fn!.7z" "Book1.xlsx"
)
1
file1
Press any key to continue . . .
E:\Temp\ziptest\Documents>(
cd "\Temp\ziptest\Documents\"
set /A count += 1
echo !count!
set fn=file!count!
echo !fn!
pause
REM 7z.exe a -mx9 -mmt12 -sdel -pt3st! -mhe=on "!fn!.7z" "COVID-19 Oakland County.xlsx"
)
2
file2
Press any key to continue . . .
我真的很想弄清楚这一点,所以请耐心等待,并提前感谢您的帮助。我仍在努力理解正确使用FOR /F
“Delims”和“Tokens”。
编辑:最终我需要/想要做的是包含标志*EXTRA File
或Newer
日志文件中的任何行,以提取文件路径和文件名并使用 ROBOCOPY 将这些文件复制到另一个驱动器,复制的文件在日期和时间戳文件夹。
我有一个看起来像这样的 robocopy 日志文件输出:
-------------------------------------------------------------------------------
ROBOCOPY :: Robust File Copy for Windows
-------------------------------------------------------------------------------
Started : Friday, March 27, 2020 6:04:32 AM
Source : P:\PC_BACKUP\
Dest : X:\PC_BACKUP\
Files : *.*
Options : *.* /TS /FP /TEE /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /NP /MT:1 /R:2 /W:10
------------------------------------------------------------------------------
*EXTRA File 11.2 g 2020/03/25 06:09:27 X:\PC_BACKUP\DellAndrew\75E4FF97EDCDE7C0-09-09.mrimg
*EXTRA File 29.7 g 2020/03/26 07:33:31 X:\PC_BACKUP\DellJordan\DC0297C23493575B-10-10.mrimg
*EXTRA File 27.8 g 2020/03/26 05:10:12 X:\PC_BACKUP\P650HSG\677CFE5FA9EB27B1-10-10.mrimg
Newer 15.2 g 2020/03/27 06:36:52 P:\PC_BACKUP\DellAndrew\75E4FF97EDCDE7C0-10-10.mrimg
New File 2.2 g 2020/03/27 06:41:31 P:\PC_BACKUP\DellAndrew\75E4FF97EDCDE7C0-19-19.mrimg
Newer 31.1 g 2020/03/27 07:36:04 P:\PC_BACKUP\DellJordan\DC0297C23493575B-11-11.mrimg
New File 4.4 g 2020/03/27 07:44:55 P:\PC_BACKUP\DellJordan\DC0297C23493575B-23-23.mrimg
Newer 27.8 g 2020/03/27 05:07:37 P:\PC_BACKUP\P650HSG\677CFE5FA9EB27B1-11-11.mrimg
New File 1.8 g 2020/03/27 05:09:25 P:\PC_BACKUP\P650HSG\677CFE5FA9EB27B1-22-22.mrimg
------------------------------------------------------------------------------
Total Copied Skipped Mismatch FAILED Extras
Dirs : 6 6 6 0 0 0
Files : 74 6 68 0 0 3
Bytes : 2.266 t 82.830 g 2.185 t 0 0 68.862 g
Times : 0:16:49 0:04:12 0:00:00 0:04:12
Speed : 352546983 Bytes/sec.
Speed : 20172.900 MegaBytes/min.
Ended : Friday, March 27, 2020 6:12:56 AM
我已经设法将这个文件缩减为我想要使用的文件的路径和文件名(“Newer”和“*EXTRA File”路径)导出到日志使用:
set logname=%~1
findstr /L /G:extractnewer.txt %logname%.log > extract.log
findstr /L /G:extractextrafile.txt %logname%.log >> extract.log
setlocal DisableDelayedExpansion
for /f "tokens=1* delims=\" %%A in (extract.log) do echo %%B >> trim.log
可能有更好的方法可以做到这一点,但到目前为止它对我有用。所以 trim.log 输出看起来像这样:
PC_BACKUP\DellAndrew\75E4FF97EDCDE7C0-10-10.mrimg
PC_BACKUP\DellJordan\DC0297C23493575B-11-11.mrimg
PC_BACKUP\P650HSG\677CFE5FA9EB27B1-11-11.mrimg
PC_BACKUP\DellAndrew\75E4FF97EDCDE7C0-09-09.mrimg
PC_BACKUP\DellJordan\DC0297C23493575B-10-10.mrimg
PC_BACKUP\P650HSG\677CFE5FA9EB27B1-10-10.mrimg
最终,我需要将文件路径和文件名分开,以便我可以使用它们来进行 robocopy 文件复制。例如,它将遍历 trim.log 中的每一行:
filepath=PC_BACKUP\P650HSG\
filename=677CFE5FA9EB27B1-11-11.mrimg
所以我可以做一个:
robocopy X:\%filepath% T:\%datefolder%\%filepath%\ %filename%
但是我正在努力获得正确FOR /F
的分别提取路径和文件的方法。
感谢您的任何帮助。