Batch file 如何使用批处理文件解压具有动态名称的文件?

Batch file 如何使用批处理文件解压具有动态名称的文件?,batch-file,server,Batch File,Server,我所要做的就是通过批处理文件自动化解压过程,并安排相同的时间,当文件名是静态的(如下所述)时,解压过程也能正常工作 @echo关闭 setlocal cd/d%~dp0 调用:解压文件“D:\QlikSense\Data\OBL\FTP\”D:\QlikSense\Data\OBL\FTP\T56Q\u OBL001\u 20200312111131.zip” 调用:解压文件“D:\QlikSense\Data\OBL\FTP\”D:\QlikSense\Data\OBL\FTP\T56Q\u

我所要做的就是通过批处理文件自动化解压过程,并安排相同的时间,当文件名是静态的(如下所述)时,解压过程也能正常工作

@echo关闭
setlocal
cd/d%~dp0
调用:解压文件“D:\QlikSense\Data\OBL\FTP\”D:\QlikSense\Data\OBL\FTP\T56Q\u OBL001\u 20200312111131.zip”
调用:解压文件“D:\QlikSense\Data\OBL\FTP\”D:\QlikSense\Data\OBL\FTP\T56Q\u OBL002\u 20200312111131.zip”
退出/b
:UnZipFile
设置vbs=“%temp%\\.vbs”
如果存在%vbs%del/f/q%vbs%
>%vbs%echo Set fso=CreateObject(“Scripting.FileSystemObject”)
>>%vbs%echo如果不是fso.FolderExists(%1),则
>>%vbs%echo fso.CreateFolder(%1)
>>%vbs%echo结束,如果
>>%vbs%echo set objShell=CreateObject(“Shell.Application”)
>>%vbs%echo set FilesInZip=objShell.NameSpace(%2)。项
>>%vbs%echo objShell.NameSpace(%1).CopyHere(FilesInZip)
>>%vbs%echo Set fso=无
>>%vbs%echo Set objShell=无
cscript//nologo%vbs%
如果存在%vbs%del/f/q%vbs%
超时20
但是,当使用“*”为动态创建时,同样的方法不起作用(请查找下面的代码)

@echo关闭
setlocal
cd/d%~dp0
调用:解压文件“D:\QlikSense\Data\OBL\FTP\”D:\QlikSense\Data\OBL\FTP\T56Q\u OBL001.*.zip\”
调用:解压文件“D:\QlikSense\Data\OBL\FTP\”D:\QlikSense\Data\OBL\FTP\T56Q\u OBL002.*.zip\”
退出/b
:UnZipFile
设置vbs=“%temp%\\.vbs”
如果存在%vbs%del/f/q%vbs%
>%vbs%echo Set fso=CreateObject(“Scripting.FileSystemObject”)
>>%vbs%echo如果不是fso.FolderExists(%1),则
>>%vbs%echo fso.CreateFolder(%1)
>>%vbs%echo结束,如果
>>%vbs%echo set objShell=CreateObject(“Shell.Application”)
>>%vbs%echo set FilesInZip=objShell.NameSpace(%2)。项
>>%vbs%echo objShell.NameSpace(%1).CopyHere(FilesInZip)
>>%vbs%echo Set fso=无
>>%vbs%echo Set objShell=无
cscript//nologo%vbs%
如果存在%vbs%del/f/q%vbs%
超时20
下面是反映该案例的错误

C:\Users\TECHADMIN\Appdata\Local\Temp\4_u2;vbs(6,1)Microsoft VBScript运行时错误:需要对象:“objShell.NameSpace(…)”

@echo关闭
setlocal
cd/d“%~dp0”
调用:解压文件“D:\QlikSense\Data\OBL\FTP\”D:\QlikSense\Data\OBL\FTP\T56Q\u OBL001.*.zip”
调用:解压文件“D:\QlikSense\Data\OBL\FTP\”D:\QlikSense\Data\OBL\FTP\T56Q\u OBL002.*.zip”
退出/b
:UnZipFile
设置“vbs=%temp%\\.vbs”
如果存在“%vbs%”删除/f/q“%vbs%”
(echo strExtractTo=WScript.Arguments.Item(0^)
echo strNewZipFile=WScript.Arguments.Item(1^)
echo WScript.echo strExtractTo,strNewZipFile
echo set objFSO=CreateObject(“Scripting.FileSystemObject”^)
echo如果不存在objFSO.FolderExists(strExtractTo^),则
echo fso.CreateFolder(strExtractTo^)
回显结束if
echo set objShell=CreateObject(“Shell.Application”^)
echo set FilesInZip=objShell.NameSpace(strNewZipFile^).items
echo objShell.NameSpace(strExtractTo^).CopyHere(FilesInZip^)
回波设置objFSO=无
echo Set objShell=无
)>%vbs%
对于(“%2”)中的%%A,请执行cscript//nologo“%vbs%”~1“%%~A”
如果存在“%vbs%”删除/f/q“%vbs%”
超时20

为VBScript添加了参数处理,并使用
for
循环来处理zip文件名中使用的星号通配符。

它被称为“文件名中的星号”。对不起!我不明白,你能详细说明一下吗?很抱歉,我的评论太快了。这种文件名的正式名称不是“动态的”。它被称为“asterix”。这看起来非常复杂。我可以建议使用PowerShell吗?@JamesZ是的
@echo off
setlocal
cd /d %~dp0
Call :UnZipFile "D:\QlikSense\Data\OBL\FTP\" "D:\QlikSense\Data\OBL\FTP\T56Q_OBL001_20200312111131.zip"
Call :UnZipFile "D:\QlikSense\Data\OBL\FTP\" "D:\QlikSense\Data\OBL\FTP\T56Q_OBL002_20200312111131.zip"

exit /b

:UnZipFile <ExtractTo> <newzipfile>
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%

timeout 20
@echo off
setlocal
cd /d %~dp0
Call :UnZipFile "D:\QlikSense\Data\OBL\FTP\" "D:\QlikSense\Data\OBL\FTP\T56Q_OBL001_*.zip\"
Call :UnZipFile "D:\QlikSense\Data\OBL\FTP\" "D:\QlikSense\Data\OBL\FTP\T56Q_OBL002_*.zip\"

exit /b

:UnZipFile <ExtractTo> <newzipfile>
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%

timeout 20
@echo off
setlocal
cd /d "%~dp0"
Call :UnZipFile "D:\QlikSense\Data\OBL\FTP\" "D:\QlikSense\Data\OBL\FTP\T56Q_OBL001_*.zip"
Call :UnZipFile "D:\QlikSense\Data\OBL\FTP\" "D:\QlikSense\Data\OBL\FTP\T56Q_OBL002_*.zip"

exit /b

:UnZipFile <ExtractTo> <NewZipFile>
set "vbs=%temp%\_.vbs"
if exist "%vbs%" del /f /q "%vbs%"

(   echo strExtractTo = WScript.Arguments.Item(0^)
    echo strNewZipFile = WScript.Arguments.Item(1^)
    echo WScript.echo strExtractTo,  strNewZipFile
    echo set objFSO = CreateObject("Scripting.FileSystemObject"^)
    echo if not objFSO.FolderExists(strExtractTo^) Then
    echo   fso.CreateFolder(strExtractTo^)
    echo end if
    echo set objShell = CreateObject("Shell.Application"^)
    echo set FilesInZip = objShell.NameSpace(strNewZipFile^).items
    echo objShell.NameSpace(strExtractTo^).CopyHere(FilesInZip^)
    echo Set objFSO = Nothing
    echo Set objShell = Nothing
) > "%vbs%"

for %%A in ("%~2") do cscript //nologo "%vbs%" "%~1" "%%~A"
if exist "%vbs%" del /f /q "%vbs%"
timeout 20