2011-12-14 129 views
1

问题简介: 死岛游戏一旦保存文件超过一定的文件大小崩溃。文件是档案,但带有.sav扩展名而不是.zip。 我想制作一个脚本,它将通过* .sav文件循环,将它们复制到具有相同文件名的另一个位置,但是作为* .zip,然后提取它们,检查提取的文件大小,并在文件大小超出限制时通知我。bat文件:通过文件循环并使用结果操作

到目前为止,我得到这个:

@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循环变量分配值,所以我找到了一个解决方案中使用delayedexpansion。

但目前我最大的问题是它只是不会将save_1.sav复制到名称为save_1.zip的另一个位置!

,一旦我得到过去,这,我将深入7zip的拆包和文件大小验证(需要所有其他的东西一起),但是这仅仅是令人沮丧:) 也许我应该在Python做到这一点...

回答

0

如果你想改变的东西文件扩展名,你可以使用%%~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 
) 

(只需在命令行中测试这一点 - 在您使用的%代替%%,如果你想尝试一下 - - 它的工作原理。)

+1

就像一个魅力,一旦我把两条路径都包含在quotemarks中,非常感谢你。 – ch1zra 2011-12-14 14:49:24

0

似乎没人想到这个宝石,但这里是如何利用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

用`start/low“cmd/c”call superrename.bat“%% F”“”`取代`call d:\ superrename.bat %% F``,你就可以拥有一个并行(多进程)循环:) – 2015-12-28 02:53:59