bat файл: перебирать файлы и манипулировать результатами - PullRequest
1 голос
/ 14 декабря 2011

введение проблемы: Игра Dead Island вылетает, когда размер файла сохранения превышает определенный размер. Файлы являются архивами, но с расширением .sav, а не .zip. Я хочу создать скрипт, который будет циклически перебирать файлы * .sav, копировать их в другое место с тем же именем файла, но с именем * .zip, затем извлекать их, проверять размер извлеченных файлов и сообщать мне, если размер файла превышает ограничение.

Пока я получил это:

@ECHO OFF
setlocal enableextensions enabledelayedexpansion
FOR %%i IN ("D:\Games\Dead Island\out\save\"*.sav) DO (
set str=
set str=!str!%%i
set str=!str:.sav=.zip!
echo !str!
copy %%i !str!
)
PAUSE

по некоторым причинам в файлах bat возникают проблемы с присвоением значений переменным внутри циклов FOR, поэтому я нашел решение использовать задержку расширения.

но в настоящее время моя самая большая проблема заключается в том, что он просто не копирует save_1.sav в другое место с именем save_1.zip!

как только я преодолею это, я погрузлюсь в распаковку 7zip и проверку размера файла (вместе со всеми другими необходимыми вещами), но это просто расстраивает :) может быть, я должен просто сделать это в Python ...

Ответы [ 2 ]

0 голосов
/ 24 августа 2014

Кажется, никто не думал об этом геме, но вот как использовать% variable% внутри цикла FOR вместо переменной %%, чтобы вы могли манипулировать им.

поместите это в D: \ superrename.bat:

@echo off
set CURRFILE=%1
set CURRFILE=%CURRFILE:~6%
set CURRFILE=FREN%CURRFILE%
if "%1" == "" (
for %%F in (*) do call d:\superrename.bat %%F
) else (
echo we found %1 which will become %CURRFILE%
)

Это позволяет вам использовать обычные манипуляции с переменными внутри команды FOR (БЕЗ отложенного расширения). Я намерен удалить первые несколько символов имен файлов (в данном случае шесть символов) с переименованием. Должно быть установлено на внешней стороне, если в противном случае, если перед эхо, выход эхо будет отставать от одного выполнения FOR.

"мы нашли xntimer.ini, который станет FRENr.ini"

ограничения: обратите внимание, что если %% F содержит пробел, то в пакетный файл передаются несколько параметров (% 2,% 3 и т. д. используются). Если кавычки пробуются, то CALL не будет работать правильно, говоря, что [второе слово] в настоящее время не ожидается.

Способ обойти это - указать% * вместо% 1 в обоих местах выше.

Второе ограничение: с командой FOR. он увидит некоторые из переименованных файлов и сделает их снова !!! Лучше всего использовать копию в другой каталог или тому подобное. (проблема может быть связана с ошибкой в ​​https://superuser.com/questions/475874 ... в моем случае у меня было около 8 случайных элементов для исправления более 100 файлов.)

Удачного кодирования!

0 голосов
/ 14 декабря 2011

Если вы хотите изменить расширение файла чего-либо, вы можете использовать %%~n<variable> для получения основы, как показано ниже (взято из одного из моих пакетных файлов):

FOR %%f IN (*.ebr) DO (
    hcsg -c %%f %%~nf.cg1
    hbsp -c %%~nf.cg1 nohints %%~nf.ct1
    hportal -c %%~nf.ct1 %%~nf.cp
    hflood -c %%~nf.ct1 %%~nf.cp %%~nf.cg2
    hbsp -c %%~nf.cg2 nohints %%~nf.ct2
)

Это может быть полезно:

http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/percent.mspx?mfr=true

В вашем случае, я думаю, вы могли бы просто сделать что-то вроде:

FOR %%f IN (*.sav) DO (
    copy %%f %%~nf.zip
)

(только что проверил это в командной строке - где вы используете% вместо %%, если вы хотите попробовать - и это работает.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...