iT邦幫忙

0

使用bat或VBA或Perl完成自動檔案壓縮需求

一筆貨有主資料夾, 內容有5層資料夾info, log, MD, stdf, summary

#主資料夾名稱20150618_164_7532_2000-104-958_P517D005_63F6L247.1
@ info 資料夾內容為I_P517D005_025_S11P_20150619094428_X2652B4S22J7_7532
@ log 資料夾內容為 P517D005_025_S11P_20150619094428_X2652B4S202J7_7532.txt
@ MD 資料夾內容為MD_P517D005_025_S11P_X2652B00011_10_031_MBIST_20150619_095006.txt
@ stdf 資料夾內容為P517D005_025_S11P_20150619094428_X2652B4S202J7_7532.std
@ summary 資料夾內容為P517D005_025_S11P_20150619094428_X2652B4S202J7_7532_sum.txt

  1. 各層檔案數目與需求
    @ info 資料夾內容最多25個檔案, 需壓成I_P517D005_025_S11P_20150619094428_X2652B4S22J7_7532.gzip
    @ log 資料夾內容最多25個檔案, 需壓成P517D005_025_S11P_20150619094428_X2652B4S202J7_7532.txt.gzip
    @ MD 資料夾內容最多76252個檔案, 全部檔案壓成一個MD_P517D005_S11P_20150619095006.zip (20150619095006最後一個MD檔案的時間)
    @ stdf 資料夾內容最多25個檔案, 需壓成P517D005_025_S11P_20150619094428_X2652B4S202J7_7532.std.gzip
    @ summary 資料夾內容最多25個檔案, 需壓成P517D005_025_S11P_20150619094428_X2652B4S202J7_7532_sum.txt.gzip

2. 第1步驟完成後, 需要將info* 25個gzip + MD *1個zip + std *25個gzip + summary *25個gzip 壓成一個P517D005_S11P_X2652B4S202J7.tar

3. 第2步驟完成後, 要在壓成一個P517D005_S11P_X2652B4S202J7.tar.gzip

上步驟一筆貨批就完成了, 但同時會有好多筆貨, 請問是否有辦法使用bat執行檔 或是 vba 執行 或是Perl呢? 這是我辦公室電腦目前可以使用的軟體.
目前我都是人工使用7zip一個一個的壓檔案, 壓到手的韌帶都受傷了.
需要各位專家幫忙我嚕落寞

蟹老闆 iT邦大師 1 級 ‧ 2015-06-22 13:08:15 檢舉
log呢?不管它?
每個資料夾中檔案名稱長度是否相同?
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
2
海綿寶寶
iT邦大神 1 級 ‧ 2015-06-21 17:53:33
最佳解答

坦白說
我看不太懂你的問題
所以我只能先猜, 大致做一下
看有什麼不對再改

1.先下載7-Zip

2.然後程式如下

<pre class="c" name="code">
FOR /D %%I IN (I*.*) DO ..\7za a "%%I.zip" "%%I\*.*"
FOR /D %%I IN (P*.*) DO ..\7za a "%%I.zip" "%%I\*.*"
FOR /D %%I IN (MD*.*) DO ..\7za a "%%I.tar" "%%I\*.*"

..\7za a "s01.tar" *.zip *.tar

3.執行結果如下

<pre class="c" name="code">

D:\7z1505-extra\s01>tree /F /A
列出磁碟區 DATA 的資料夾 PATH
磁碟區序號為 2C04-80CD
D:.
|   onedir.bat
|
+---I_info
|       info01.dat
|       info02.dat
|       info03.dat
|       info04.dat
|       info05.dat
|       info06.dat
|       info07.dat
|       info08.dat
|       info09.dat
|       info10.dat
|       info11.dat
|       info12.dat
|       info13.dat
|       info14.dat
|       info15.dat
|       info16.dat
|       info17.dat
|       info18.dat
|       info19.dat
|       info20.dat
|       info21.dat
|       info22.dat
|       info23.dat
|       info24.dat
|       info25.dat
|
+---MD_md
|       mmdd01.dat
|       mmdd02.dat
|       mmdd03.dat
|       mmdd04.dat
|       mmdd05.dat
|       mmdd06.dat
|       mmdd07.dat
|       mmdd08.dat
|       mmdd09.dat
|       mmdd10.dat
|       mmdd11.dat
|       mmdd12.dat
|       mmdd13.dat
|       mmdd14.dat
|       mmdd15.dat
|       mmdd16.dat
|       mmdd17.dat
|       mmdd18.dat
|       mmdd19.dat
|       mmdd20.dat
|       mmdd21.dat
|       mmdd22.dat
|       mmdd23.dat
|       mmdd24.dat
|       mmdd25.dat
|
+---P_stdf
|       stdf01.dat
|       stdf02.dat
|       stdf03.dat
|       stdf04.dat
|       stdf05.dat
|       stdf06.dat
|       stdf07.dat
|       stdf08.dat
|       stdf09.dat
|       stdf10.dat
|       stdf11.dat
|       stdf12.dat
|       stdf13.dat
|       stdf14.dat
|       stdf15.dat
|       stdf16.dat
|       stdf17.dat
|       stdf18.dat
|       stdf19.dat
|       stdf20.dat
|       stdf21.dat
|       stdf22.dat
|       stdf23.dat
|       stdf24.dat
|       stdf25.dat
|
\---P_summary
        sumy01.dat
        sumy02.dat
        sumy03.dat
        sumy04.dat
        sumy05.dat
        sumy06.dat
        sumy07.dat
        sumy08.dat
        sumy09.dat
        sumy10.dat
        sumy11.dat
        sumy12.dat
        sumy13.dat
        sumy14.dat
        sumy15.dat
        sumy16.dat
        sumy17.dat
        sumy18.dat
        sumy19.dat
        sumy20.dat
        sumy21.dat
        sumy22.dat
        sumy23.dat
        sumy24.dat
        sumy25.dat


D:\7z1505-extra\s01>onedir

D:\7z1505-extra\s01>FOR / %I IN (I*.*) DO ..\7za a "%I.zip" "%I\*.*"

D:\7z1505-extra\s01>..\7za a "I_info.zip" "I_info\*.*"

7-Zip (a) [32] 15.05 beta : Copyright (c) 1999-2015 Igor Pavlov : 2015-06-14

Scanning the drive:
25 files, 75 bytes (1 KiB)

Creating archive: I_info.zip

Items to compress: 25


Files read from disk: 25
Archive size: 3747 bytes (4 KiB)
Everything is Ok

D:\7z1505-extra\s01>FOR / %I IN (P*.*) DO ..\7za a "%I.zip" "%I\*.*"

D:\7z1505-extra\s01>..\7za a "P_stdf.zip" "P_stdf\*.*"

7-Zip (a) [32] 15.05 beta : Copyright (c) 1999-2015 Igor Pavlov : 2015-06-14

Scanning the drive:
25 files, 75 bytes (1 KiB)

Creating archive: P_stdf.zip

Items to compress: 25


Files read from disk: 25
Archive size: 3747 bytes (4 KiB)
Everything is Ok

D:\7z1505-extra\s01>..\7za a "P_summary.zip" "P_summary\*.*"

7-Zip (a) [32] 15.05 beta : Copyright (c) 1999-2015 Igor Pavlov : 2015-06-14

Scanning the drive:
25 files, 75 bytes (1 KiB)

Creating archive: P_summary.zip

Items to compress: 25


Files read from disk: 25
Archive size: 3897 bytes (4 KiB)
Everything is Ok

D:\7z1505-extra\s01>FOR / %I IN (MD*.*) DO ..\7za a "%I.tar" "%I\*.*"

D:\7z1505-extra\s01>..\7za a "MD_md.tar" "MD_md\*.*"

7-Zip (a) [32] 15.05 beta : Copyright (c) 1999-2015 Igor Pavlov : 2015-06-14

Scanning the drive:
25 files, 75 bytes (1 KiB)

Creating archive: MD_md.tar

Items to compress: 25


Files read from disk: 25
Archive size: 26624 bytes (26 KiB)
Everything is Ok

D:\7z1505-extra\s01>..\7za a "s01.tar" *.zip *.tar

7-Zip (a) [32] 15.05 beta : Copyright (c) 1999-2015 Igor Pavlov : 2015-06-14

Scanning the drive:
4 files, 38015 bytes (38 KiB)

Creating archive: s01.tar

Items to compress: 4


Files read from disk: 4
Archive size: 41984 bytes (41 KiB)
Everything is Ok

D:\7z1505-extra\s01>dir
 磁碟區 D 中的磁碟是 DATA
 磁碟區序號:  2C04-80CD

 D:\7z1505-extra\s01 的目錄

2015/06/21  下午 05:49    <DIR>          .
2015/06/21  下午 05:49    <DIR>          ..
2015/06/21  下午 05:01    <DIR>          I_info
2015/06/21  下午 05:49             3,747 I_info.zip
2015/06/21  下午 05:03    <DIR>          MD_md
2015/06/21  下午 05:49            26,624 MD_md.tar
2015/06/21  下午 05:45               195 onedir.bat
2015/06/21  下午 05:00    <DIR>          P_stdf
2015/06/21  下午 05:49             3,747 P_stdf.zip
2015/06/21  下午 05:03    <DIR>          P_summary
2015/06/21  下午 05:49             3,897 P_summary.zip
2015/06/21  下午 05:49            41,984 s01.tar
               6 個檔案          80,194 位元組
               6 個目錄  138,564,366,336 位元組可用

D:\7z1505-extra\s01>..\7za l s01.tar

7-Zip (a) [32] 15.05 beta : Copyright (c) 1999-2015 Igor Pavlov : 2015-06-14

Scanning the drive for archives:
1 file, 41984 bytes (41 KiB)

Listing archive: s01.tar

--
Path = s01.tar
Type = tar
Physical Size = 41984
Headers Size = 3072
Code Page = UTF-8

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2015-06-21 17:49:34 .....         3747         4096  I_info.zip
2015-06-21 17:49:34 .....        26624        26624  MD_md.tar
2015-06-21 17:49:34 .....         3747         4096  P_stdf.zip
2015-06-21 17:49:34 .....         3897         4096  P_summary.zip
------------------- ----- ------------ ------------  ------------------------
2015-06-21 17:49:34              38015        38912  4 files

D:\7z1505-extra\s01>

您好, 我目前用7z a -tzip "MD_.zip" "MD*.txt"
可以將所有的MD檔案壓成一個MD_.zip檔.

但檔名不是我要的, 請問要如何選最後一個MD檔名, 然後抓取所需的文字與修改呢?
然後把這一串放入, 我想要壓縮的名稱呢?

MD_P517D005_025_S11P_X2652B00011_10_031_MBIST_20150619_095006.txt
怎麼取出與變成下列字串
MD_P517D005_S11P_20150619095006

nicholasyang提到:
但檔名不是我要的, 請問要如何選最後一個MD檔名, 然後抓取所需的文字與修改呢?
然後把這一串放入, 我想要壓縮的名稱呢?

就我對批次檔的了解來說
三個字:辦不到

可能得由其他高手
或自己寫程式去處理了

wiseguy iT邦超人 1 級 ‧ 2015-06-25 00:39:47 檢舉

在 linux 超簡單,在 windows 的 bat 超難,就是有這種分別 ...

2
wiseguy
iT邦超人 1 級 ‧ 2015-06-21 21:39:21

又是 gzip 又是 tar,我就直接猜你的系統是 Linux 了。
所以你要的 shall script 如下:

  1. cd 到主資料夾

    <pre class="c" name="code">cd 主資料夾

  2. 把 info, log, stdf, summary 裡每個檔案各別壓成 gzip

    <pre class="c" name="code">find info log stdf summary -type f -exec gzip {} ;

  3. 把 MD 所有檔案壓成一個以最後MD檔案的時間為檔名的 zip

    <pre class="c" name="code">cd MD; zip -m 檔名.zip *; cd ..

  4. 再把所有檔案壓成 tar.gzip

    <pre class="c" name="code">tar zcf 檔名.tar.gzip .

看更多先前的回應...收起先前的回應...

使用bat或VBA或Perl完成自動檔案壓縮需求

不公平
人家明明也有提到 bat 和 VBA
抗議

wiseguy iT邦超人 1 級 ‧ 2015-06-22 11:44:11 檢舉

antijava提到:
也有提到 bat 和 VBA

要留給原po自行舉一反三的樂趣嘛XD

幫幫我這一個

我目前用指令 7z a -tzip "MD_.zip" "MD*.txt"
可以將資料夾內所有的MD_*_*_*_*_*_*1_*_*_*.txt檔案只壓成一個MD_.zip檔.

但檔名不是我要的, 需要指定檔名, 請問要如何由MD_*_*_*_*_*_*1_*_*_*.txt檔名, 抓取所需的文字與修改呢?
然後把抓取出來的這一串文字放入, 我想要壓縮的名稱呢?

MD_P517D005_025_S11P_X2652B00011_10_031_MBIST_20150619_095006.txt
怎麼取出與變成下列字串
MD_P517D005_S11P_20150619095006

或是抓取檔名可以使用vba另外執行呢?
各位 哥 姊 我的手腕韌帶靠你們了.

另外, 如何指定壓縮後存檔的路徑呢?

幫幫我這一個

我目前用指令 7z a -tzip "MD_.zip" "MD*.txt"
可以將資料夾內所有的MD_*_*_*_*_*_*1_*_*_*.txt檔案只壓成一個MD_.zip檔.

但檔名不是我要的, 需要指定檔名, 請問要如何由MD_*_*_*_*_*_*1_*_*_*.txt檔名, 抓取所需的文字與修改呢?
然後把抓取出來的這一串文字放入, 我想要壓縮的名稱呢?

MD_P517D005_025_S11P_X2652B00011_10_031_MBIST_20150619_095006.txt
怎麼取出與變成下列字串
MD_P517D005_S11P_20150619095006

或是抓取檔名可以使用vba另外執行呢?
各位 哥 姊 我的手腕韌帶靠你們了.

另外, 如何指定壓縮後存檔的路徑呢?

wiseguy iT邦超人 1 級 ‧ 2015-06-25 00:51:55 檢舉

在 linux 只需要在 MD 目錄下這串指令

&lt;pre class="c" name="code">ls -1 | tail -1 | awk -F_ '{print $1"_"$2"_"$4"_"$9$10}' | sed 's/\.txt$//'

就可得到你要的檔名了。
在 windows 底下,你若要上面的指令可以執行,請去抓 http://unxutils.sourceforge.net/ 來用。

cancelpc iT邦新手 3 級 ‧ 2018-05-07 14:39:09 檢舉

Windows 下 bat(cmd)
'''

for /f "tokens=1-7 delims=_" %a in ("20150618_164_7532_2000-104-958_P517D005_63F6L247.1") do @echo %a %b %c %d %e %f %g

'''
就能拆解檔名上各個 token ,
要怎麼組就怎麼組。

cancelpc iT邦新手 3 級 ‧ 2018-05-07 14:46:52 檢舉

樓主要的:(檔名自行用變數替換,bat 內變數要改雙%,如 %%a)

'''
for /f "tokens=1-10 delims=_." %a in ("MD_P517D005_025_S11P_X2652B00011_10_031_MBIST_20150619_095006.txt") do echo %a %b %c %d %e %f %g %h %i %j

'''

2
andylau
iT邦新手 3 級 ‧ 2015-06-22 12:45:56

我是用 VBS 來產生 bat, 也在VBS中呼叫執行 bat
研究一下VBS 讀取文字檔的方式
再去拆字串
檔名就沒問題囉

backup.vbs

&lt;pre class="c" name="code">
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oFile = oFSO.OpenTextFile("backup.bat",2,true)
cFileName = "XXXXXXXXXXX"

oFile.writeline "@echo off"
oFile.writeline "7za.exe a -tzip -r F:\" & cFileName & ".zip D:\*.*"
oFile.Close

Set oFSO = Nothing

WScript.Sleep 10000

'產生 WSH Shell
Set oShell = WScript.CreateObject("WScript.Shell")
oShell.Run "backup.bat", 1, true

Set oShell = Nothing

用windows 排程定時執行 cscript backup.vbs

我太淺了 我看不懂了 您可以幫忙我嗎
VBS是什麼呢?

2
Andy Chiu
iT邦研究生 3 級 ‧ 2015-06-23 01:08:54

nicholasyang 兄對VBA熟嗎?Excel VBA還是Access VBA?
若熟的話,可以寫程式來處理,我以Excel VBA為範例,講一下您需要的檔案名稱問題:

新增一個Excel檔,放在要壓縮的資料夾內,並新增以下巨集:

&lt;pre class="c" name="code">
Sub CreatFileList()
    Dim objActSht As Object
    Set objActSht = ActiveSheet
    
    On Error Resume Next

    Dim fs As Object
    Dim file As Object
    Dim rng As Range

    
    Dim i As Integer, iRow As Integer
    i = 0
        
    '依照A欄順序的子資料夾列出檔名
    For iRow = 1 To 5
        strSubFolder = Range("A" & iRow)
        Set fs = CreateObject("scripting.filesystemobject")
        For Each file In fs.GetFolder(ThisWorkbook.Path & "\" & strSubFolder).Files
            Range("B" & iRow).Value = file.Name
            Exit For
        Next
    Next iRow
    
    ' 以MD資料夾為例進行切割
    strFileName = Range("B" & 3)
    strFileName = Replace(strFileName, ".txt", "")
    tmp = Split(strFileName, "_")

    Range("C" & 3) = tmp(0) & "_" & tmp(1) & "_" & tmp(3) & "_" & tmp(8) & tmp(9) & ".gzip"

    Debug.Print strTargetFileName
        
End Sub

另外該工作表A欄的1~5列填入:
info
log
MD
stdf
summary

這幾個資料夾的名稱,然後執行該VBA後,會列出第一筆檔案於B欄上
MD那列會在C欄上出現您需要的檔案命名方式,其他列可依照自己需求去新增程式碼來產生檔名
然後在做另一程式去執行7z來壓縮,以這個方向寫下去應該沒什麼問題
您可以試著寫寫看,有問題再跟我說

我要發表回答

立即登入回答