2011-12-14 48 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