2010-10-01 84 views
0

我在Windows上編寫了一個批處理文件,它獲取一個參數:一個使用7-zip創建的zip文件名。需要編寫批處理文件的幫助

這個文件裏面包含一個MySQL備份文件,比如backup.sql

我想恢復給定此zip文件的數據庫。

所以,首先我把它解壓到這樣一個臨時目錄:

path_to_7zip\7z e "%~1" -otemp_dir 

現在是我的問題:我怎麼知道所提取的文件(即backup.sql)的名字?

我想編寫這樣的事:

path_to_mysql\mysql < extracted_file_name 

(其中extracted_file_name應該backup.sql

我應該寫的,而不是extracted_file_name如果我不知道里面的文件名壓縮文件?

回答

1

你可以在一個空目錄中提取文件,在那裏你可以確定它是唯一的當前文件。然後,您可以使用for指令在變量中收集這樣的名稱,並根據您的喜好使用它。

FOR /F "tokens=*" %%F IN ('dir /b *.sql') DO path_to_mysql\mysql < %%F 

請注意,如果存檔中有多個SQL文件,則會處理它們中的所有文件。我認爲這可能是一個獎金,但這是不可取的,我想你可以跳出FORGOTO


編輯:使用/F形式的FOR我忘了,「正常」 FOR已經做我們所需要的工作。

FOR %%F IN (*.sql) DO path_to_mysql\mysql < %%F 

請注意,所有這些東西只適用於當前目錄是提取目錄,否則您必須相應地更改括號中的表達式。

紅利鏈接:FORFOR /F的參考 - 唯一批量操作有用的命令 - 而且顯然有不可能的語法。 :D

+0

我應該如何在變量中收集名稱? – 2010-10-01 13:07:06

+0

如果臨時目錄最初爲空,只需使用'for'命令對該目錄中的每個文件執行mysql命令。我不知道確切的語法,但它就像(%tempdir/*)do mysql <%s'中的'for/f%s。 – 2010-10-01 13:16:49

+0

添加示例,請參閱原始答案。 – 2010-10-01 13:18:00

0

我認爲7z有一個「l」命令列出檔案的內容。管這個輸出到MySQL。

+0

'l'選項很不錯,但除文件名本身外,它還打印了很多信息。你確定我可以將所有這些輸出傳遞給'mysql'嗎? – 2010-10-01 13:05:37

+0

不,當然你需要解析它或找到適當的選項。是不是7z命令行記錄? – Benoit 2010-10-01 13:16:54

+0

如果你需要解析我們回到原點,因爲無論如何我們需要使用FOR/F。 – 2010-10-01 13:22:36