带空格的 .ZIP 文件名无法正确创建和解压缩批处理

.ZIP filenames with spaces not working correctly with creation and unzipping batch

我已经完成了一个简短的批处理脚本的编写,它会自动解压缩并删除下载文件夹中的所有压缩文件。

除了名称中包含 space 的 zip 文件外,我工作得很好。

我不能确定问题出在哪里,所以我会把整个脚本放在这里,因为它很短。

@echo off
setlocal
cd C:\Users\%username%\Downloads\
del /q search_result.txt


for /r %%i in (*.zip) do (
echo %%~nxi >> search_result.txt
)
for /f %%i in ("search_result.txt") do set asdf=%%~zi
if %asdf% gtr 0 (
goto unzipAgain
)
end
:unzipAgain
set /p zippedFile=< search_result.txt

Call :UnZipFile "C:\Users\%username%\Downloads\%zippedFile:~0,-4%" "C:\Users\%username%\Downloads\%zippedFile%"
exit /b

:UnZipFile <ExtractTo> <newzipfile>
cd /d %~dp0
set vbs="%temp%\_.vbs"
if exist %vbs% del /f /q %vbs%
>%vbs%  echo Set fso = CreateObject("Scripting.FileSystemObject")
>>%vbs% echo If NOT fso.FolderExists(%1) Then
>>%vbs% echo fso.CreateFolder(%1)
>>%vbs% echo End If
>>%vbs% echo set objShell = CreateObject("Shell.Application")
>>%vbs% echo set FilesInZip=objShell.NameSpace(%2).items
>>%vbs% echo objShell.NameSpace(%1).CopyHere(FilesInZip)
>>%vbs% echo Set fso = Nothing
>>%vbs% echo Set objShell = Nothing
cscript //nologo %vbs%
if exist %vbs% del /f /q %vbs%

del C:\Users\%username%\Downloads\%zippedFile%
cd C:\Users\%username%\Downloads\
findstr /V %zippedFile% search_result.txt > newfile.txt
xcopy newfile.txt search_result.txt /y >nul
del newfile.txt /f /q >nul

for /f %%i in ("search_result.txt") do set asdf=%%~zi
if %asdf% gtr 0 (
goto unzipAgain
)

del search_result.txt 

TIA,艾文

n.b VBScript 不是我的,我不知道它是如何工作的,我只是结合我自己的代码使用它

老实说,我做梦也不敢说我会像你那样编写代码。你真的把鼹鼠山变成了一座山。你不可能让自己变得更难。我想一旦您看到这三个代码示例,您就会明白为什么要遵守 K.I.S.S。原理.

您拥有的 Vbscript 代码可以完美地处理空格。可能是您的批处理文件代码中的某些东西搞砸了。您可以使用一个 FOR 命令大大简化您的代码,并且只需创建一次 Vbscript。我更改了 VBscript 以接受命令行参数。

@echo off
set "source=C:\Batch\unzip"
CD /D "%source%"
call :createVBS "unzip.vbs"

FOR %%G IN (*.zip) DO (
    cscript //nologo "%vbs%" "%source%\%%~nG" "%source%\%%~G"
    del "%%~G"
)
del "%vbs%" 2>nul
exit /b

:CreateVBS
set "vbs=%~1"
del "%vbs%" 2>nul
>%vbs%  echo Set fso = CreateObject("Scripting.FileSystemObject")
>>%vbs% echo Set objArgs = WScript.Arguments
>>%vbs% echo If NOT fso.FolderExists(objArgs(0)) Then
>>%vbs% echo fso.CreateFolder(objArgs(0))
>>%vbs% echo End If
>>%vbs% echo set objShell = CreateObject("Shell.Application")
>>%vbs% echo set FilesInZip=objShell.NameSpace(objArgs(1)).items
>>%vbs% echo objShell.NameSpace(objArgs(0)).CopyHere(FilesInZip)
>>%vbs% echo Set fso = Nothing
>>%vbs% echo Set objShell = Nothing

Powershell 已经问世大约 10 年了。从那时起,就出现了几种在 Powershell 中解压缩文件的方法。如果您使用的是版本 5 之前的 Powershell 版本,则第一个版本可以使用。

@echo off
set "source=C:\Batch\unzip"
CD /D "%source%"

for %%G in (*.zip) do (
    powershell -command "Add-Type -AssemblyName System.IO.Compression.FileSystem;[System.IO.Compression.ZipFile]::ExtractToDirectory('%%~G', '.\%%~nG')"
    del "%%~G"
)

在 Powershell 版本 5 中,使用新的 cmdlet 大大简化了代码。

@echo off
set "source=C:\Batch\unzip"
CD /D "%source%"

for %%G in (*.zip) do (
    powershell Expand-Archive '%%~G' -DestinationPath '.\%%~nG'
    del "%%~G"
)

因此您可以看到如何调用 Powershell 大大减少了批处理文件中所需的代码量。