一筆貨有主資料夾, 內容有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
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一個一個的壓檔案, 壓到手的韌帶都受傷了.
需要各位專家幫忙我嚕
坦白說
我看不太懂你的問題
所以我只能先猜, 大致做一下
看有什麼不對再改
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檔名, 然後抓取所需的文字與修改呢?
然後把這一串放入, 我想要壓縮的名稱呢?
就我對批次檔的了解來說
三個字:辦不到
可能得由其他高手
或自己寫程式去處理了
在 linux 超簡單,在 windows 的 bat 超難,就是有這種分別 ...
又是 gzip 又是 tar,我就直接猜你的系統是 Linux 了。
所以你要的 shall script 如下:
cd 到主資料夾
<pre class="c" name="code">cd 主資料夾
把 info, log, stdf, summary 裡每個檔案各別壓成 gzip
<pre class="c" name="code">find info log stdf summary -type f -exec gzip {} ;
把 MD 所有檔案壓成一個以最後MD檔案的時間為檔名的 zip
<pre class="c" name="code">cd MD; zip -m 檔名.zip *; cd ..
再把所有檔案壓成 tar.gzip
<pre class="c" name="code">tar zcf 檔名.tar.gzip .
使用bat或VBA或Perl完成自動檔案壓縮需求
不公平
人家明明也有提到 bat 和 VBA
antijava提到:
也有提到 bat 和 VBA
要留給原po自行舉一反三的樂趣嘛
幫幫我這一個
我目前用指令 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另外執行呢?
各位 哥 姊 我的手腕韌帶靠你們了.
另外, 如何指定壓縮後存檔的路徑呢?
在 linux 只需要在 MD 目錄下這串指令
<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/ 來用。
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 ,
要怎麼組就怎麼組。
樓主要的:(檔名自行用變數替換,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
'''
我是用 VBS 來產生 bat, 也在VBS中呼叫執行 bat
研究一下VBS 讀取文字檔的方式
再去拆字串
檔名就沒問題囉
backup.vbs
<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
nicholasyang 兄對VBA熟嗎?Excel VBA還是Access VBA?
若熟的話,可以寫程式來處理,我以Excel VBA為範例,講一下您需要的檔案名稱問題:
新增一個Excel檔,放在要壓縮的資料夾內,並新增以下巨集:
<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來壓縮,以這個方向寫下去應該沒什麼問題
您可以試著寫寫看,有問題再跟我說