bat文件:循环文件并使用结果进行操作

时间:2011-12-14 00:35:11

标签: variables for-loop batch-file copy

问题介绍: 死岛游戏崩溃一旦保存文件超过一定的文件大小。文件是档案,但扩展名为.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循环中为变量赋值时遇到问题,所以我找到了使用delayedexpansion的解决方案。

但目前我最大的问题是它不会将save_1.sav复制到名为save_1.zip的其他位置!

一旦我越过这个,我将深入研究7zip解包和文件大小验证(以及所需的所有其他东西),但这只是令人沮丧:) 也许我应该在python中这样做...

2 个答案:

答案 0 :(得分: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 :(得分:0)

似乎没有人想过这个gem,但是这里是如何在FOR循环中使用%variable%而不是%%变量,这样你就可以操作它。

将其放入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命令中使用常规变量操作(没有延迟扩展)。我打算用重命名删除文件名的前几个字符(在本例中为六个字符)。必须设置在外部,否则如果在echo之前,echo的输出将滞后一次执行FOR。

&#34;我们发现xntimer.ini将成为FRENr.ini&#34;

限制: 请注意,如果%% F包含空格,则会将多个参数传递给批处理文件(%2,%3等等)。如果尝试引用,则CALL将无法正常工作,此时不会预期[第二个字]。

解决这个问题的方法是在上面的两个地方指定%*而不是%1。

第二个限制:使用FOR命令。它会看到一些重命名的文件并再次执行!最好将副本用于另一个目录等。 (问题可能与https://superuser.com/questions/475874中的错误有关...在我的情况下,我有大约8个随机项目来修复超过100个文件。)

快乐的编码!