解决方案

解决方案

所以,请耐心等待。这只是我写的第二个批处理文件,也是我在 StackExchange 上的第一篇文章。

我正在编写一个批处理文件,它告诉远程服务器运行 HP 阵列诊断实用程序并将报告拉回我的计算机。我非常兴奋,因为它大部分情况下运行良好。不过我确实有一个小问题。我试图从来自远程服务器的 zip 文件夹内的文本文件中提取序列号。当我从不在压缩文件夹中的测试文本文件中提取信息时,这部分代码可以正常工作。但是,当文本文件位于 zip 文件夹中时,它不起作用。有没有办法让它工作?

以下是有问题的代码部分:

FOR /f "tokens=1-4 delims= " %%A IN ("%userprofile%\Desktop\report.zip\report.txt") DO (
 IF %%A ==Chassis (
    SET "sn=%%D"
    ECHO %sn%
 )
)

谢谢。

答案1

解决方案

尽管 Windows 将档案显示为压缩文件夹,但实际上.zip它们并非真实的文件夹。这意味着您无法直接访问压缩内容,除非将其解压到某个位置。

Windows 不提供命令行实用程序来提取(或创建)压缩档案。不过,使用一些 VBScript,您可以绕过此限制:

REM^ &@echo off
REM^ &if not exist "%~f1" exit /b 2
REM^ &md "%temp%\%~nx1" 2>nul
REM^ &cscript /nologo /e:vbscript "%~f0" "%~f1" "%temp%\%~nx1"
REM^ &exit /b

Set sa = CreateObject("Shell.Application")
Set files = sa.NameSpace(WScript.Arguments(0)).Items
Set target = sa.NameSpace(WScript.Arguments(1))

For Each file In files
target.CopyHere file, 1556
Next

怎么运行的

上述脚本是混合脚本(感谢 dbenham 和 jeb 的想法),并且在单个文件中包含常规批处理和 VBScript 命令。

该脚本只接受一个参数,即存档路径。首先,脚本检查指定的文件是否确实存在,然后在内置的临时文件夹中创建一个以存档命名的子文件夹。

然后执行 VBScript 代码。存档中的每个文件都会被复制(提取)到目标文件夹。选项值为1556,对应于4 + 16 + 512 + 1024并且是使整个操作无人值守所必需的,方法是跳过确认提示(有关更多详细信息,请参阅下面的链接)。

示例用法

@echo off
setlocal

set archive=report.zip
call UnzipHelper.cmd "%userprofile%\Desktop\%archive%" >nul
pushd "%temp%\%archive%"

REM your code here

popd
rd /s /q "%temp%\%archive%" 2>nul

pause
endlocal & exit /b

进一步阅读

相关内容