Поэтому, пожалуйста, потерпите меня. Это всего лишь второй пакетный файл, который я когда-либо написал, и мой первый пост в StackExchange.

Я пишу командный файл, который сообщает удаленному серверу, чтобы он запускал программу HP Array Diagnostic Utility и возвращал отчет на мой компьютер. Я чрезвычайно взволнован, потому что это работает очень хорошо, по большей части. У меня есть одна небольшая проблема, хотя. Я пытаюсь извлечь серийный номер из текстового файла в папке 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 ответ1

0

Решение

Несмотря на то, что 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

дальнейшее чтение

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .