带空格的.ZIP文件名在创建和解压缩批处理时无法正常工作

时间:2018-10-26 01:07:31

标签: batch-file vbscript zip

我已经完成了一个简短的批处理脚本,该脚本将自动解压缩并删除downloads文件夹中的所有压缩文件。

除显示带有名称中包含空格的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,Evyn

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

1 个答案:

答案 0 :(得分:1)

老实说,我无法说出我梦wild以求的代码。从字面上看,你是用mole鼠山做成的。您不可能让自己变得更加艰难。我认为,一旦您看到了这三个代码示例,您就会明白为什么要坚持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如何大大减少了批处理文件中所需的代码量。