所以,请耐心等待。这只是我写的第二个批处理文件,也是我在 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