2013-01-03 85 views
0

甚至不知道這是否可能,但我想我會試一試。批處理文件找到所有圖像並複製到一個文件夾

所以這是我的問題。我需要爲所有圖像搜索多個大硬盤(1TB和更大)並將它們移動到一個文件夾。我遇到的問題是不管我用什麼語言寫這篇文章,我似乎無法找出答案。我要麼是不使用robocopy命令,而要使用vbs或bat。我的一些驅動器都是不同的格式,如fat32和ntfs。我用批處理文件試過的幾個腳本的問題是我的文件名太長。所以我需要它做的主要功能是找到圖像,複製它們,如果它們存在,用_001 _002重命名它們,計算有多少文件被移動,然後最後刪除它們或將它們移動到單獨的文件夾以刪除(a在我眼中更安全)。任何幫助將不勝感激,因爲我完全沉迷於此。

這是我正在處理的一個腳本,但剛剛停止。問題在於它複製了文件,但由於某種原因沒有保留擴展名。這是我在網上找到的,並修改了一些代碼。我對代碼非常熟悉,但由於某種原因似乎無法弄清楚這一點。

@echo off 
SETLOCAL ENABLEDELAYEDEXPANSION 
set TESTFOLDER=allpictures 
md "%TESTFOLDER%" 


set /a counter=0 
FOR /F "tokens=*" %%i IN ('DIR /S /B /A-D C:\Users\user1\Desktop\*.jpg') DO FOR /F "tokens=*" %%j IN ('DIR /B "%%i"') DO IF EXIST ".\%TESTFOLDER%\%%j" (
     set /a counter=!counter!+1 
     echo folder: %TESTFOLDER% 
     copy "%%i" ".\%TESTFOLDER%\%%j_!counter!" 
    ) ELSE copy /B "%%i" ".\%TESTFOLDER%\%%j" 
:eof 

編輯: VBScript代碼下面

Set fso = CreateObject("Scripting.FileSystemObject") 

testfolder = ".\allpictures" 
'fso.CreateFolder(testfolder) 

CopyFiles fso.GetFolder("E:\") 

Sub CopyFiles(fldr) 
    For Each f In fldr.Files 
    basename = fso.GetBaseName(f) 
    extension = fso.GetExtensionName(f) 
    If LCase(extension) = "jpg" Then 
     dest = fso.BuildPath(testfolder, f.Name) 
     count = 0 
     Do While fso.FileExists(dest) 
     count = count + 1 
     dest = fso.BuildPath(testfolder, basename & "_" & count & "." _ 
      & extension) 
     Loop 
     f.Copy dest 
    End If 
    Next 

    For Each sf In fldr.SubFolders 
    CopyFiles sf 
    Next 
End Sub 
+1

你嘗試過什麼?爲什麼不使用Perl?我們是否知道文件的所有擴展名(.jpg,.gif等)? –

+0

從來沒有真正想過使用Perl來說實話。這對我來說會是更好的選擇嗎?至於文件擴展名是,我正在尋找所有jpg擴展名。最終我想用這個備份來幫助組織我的文件,這是我幫助我保持文件有序的主要目標。例如,如果我想在以後搜索mov文件。 – dkrider471

+0

我在原始問題中添加了我正在處理的代碼。 – dkrider471

回答

-2

如果利用Perl中,你可以全部glob的文件在一個特定的目錄中把它們放在一個陣列。 my @Files = glob '<directory>\*.jpg';

貫穿每一個文件去與環foreach $file (@Files){ ... }

每個.JPG將在循環中被稱爲$file。您可以通過 my ($originalfilename) = $file;獲取文件名並添加所需的任何擴展名,然後將其複製/移動到您需要的任何其他目錄。此外,在該循環中,您可以增加計數器循環或僅獲取數組的標量值。

HERE上有很多關於perl文檔和教程的內容。如果文件操作將是常見的,那麼值得學習一些基本的perl。

+3

-1要求一個人學習一種新的編程語言來解決手頭的問題。 –

+0

@bwtrent:如果我提出針對perl問題的批處理解決方案,您認爲Batch over perl的某些優勢如何?在我看來,批處理文件解決方案比其他語言解決方案具有更少的價值或優點... – Aacini

+0

我想你會嘗試提供幫助。通過提供另一種語言的概念,它可能會幫助我朝正確的方向發展。這是我的錯誤,我向社區道歉。學過的知識。不會再發生。感謝@ Ekkehard.Horner回答這個問題,提供更多信息和幫助。 –

3

你不應該做什麼:不要讓你被忽悠

  1. 生產代碼你明白在全問題之前有關於該過程的詳細計劃。 (沒有人喜歡「給我一個程序來解決我的問題」類型的問題,有時一個代碼片段可能會澄清一個問題,但要求人們嘗試他們承認不能做的事情是糟糕的教誨。)
  2. 開始於新的語言來解決手頭的問題(計劃或沒有計劃)。 (如果你被卡住寫在你的母語情書,有什麼辦法得到它的權利與語法和外國一個的詞彙的可能性有多大?)

你應該做的

  1. 想想你的問題,關注最終目標:組織你的圖片(如果我正確理解你的評論)。那看起來怎麼樣?當然不是一個文件夾中有數千個文件名稱不一致的文件。我會努力結束包含一個文件夾樹。擁有像樣的名字的jpgs,或者是一個有關我的圖片(視頻?)的合適元數據庫的數據庫,以及緩存到他們的存儲,甚至上傳到某些雲存儲。從最終的目標來看,後面的工作是:在上一步中你需要什麼。

  2. 我假設,第一步是列出所有的.jpgs。什麼是 - 給你的知識,技能和工具 - 獲得這份清單的最簡單方法是什麼?可能是dir /s [/b] c:\*.jpg > jpglist.txt的一些變化。對於稍後出現的許多驅動器或其他擴展,可以將許多這樣的行組合在一個.cmd文件(>/>>)中。這個列表和一個文本編輯器或一些過濾和電子表格可以爲您提供有關您的任務的有價值的信息:多少個文件?所有尺寸的總和?重複的文件名稱?可能的分類?

  3. 購買新的外置驅動器(您現在知道尺寸)。通過這種方式,您可以在向精彩的受衆展示精美的有組織的收藏集之後,推遲刪除步驟。 [這最後的任務將是微不足道的:只要養活你jpglist.txt通「刪除」過濾器的腳本或使用搜索和替換文本編輯器的工具把"del /Q "在行的開頭。]

  4. 根據根據您的需求和技能,您可以將基本的jpglist.txt轉換爲帶有相關信息的新.csv文件,可以通過電子表格程序手動掃描/檢查和/或以編程方式用於生成文件或文件夾名稱(附加數字應該是最後的回退)。如果你想要一些JPG元數據,但不知道如何,你可以在這裏詢問(甚至顯示你用來獲取這些文件大小或日期的代碼)。

  5. 使每個步驟都可重複且儘可能無破壞性(例如,在完成所有操作之前,請勿移動或刪除無法使用一個命令重新創建的文件)。使用你認識的技術/工具;這絕對排除了「在互聯網上找到的代碼」);如果你想要學習新的東西/更有趣的東西,那就在玩具項目中做。

1

安裝一個新的腳本解釋器用於某些操作系統附帶的腳本解釋器可以輕鬆處理的腳本解釋器是矯枉過正的。

您的腳本不保留擴展名的原因是因爲您在文件名末尾添加了計數器變量的內容,所以foo.jpg對於計數器值爲1變爲foo.jpg1。您必須使用修飾符爲了避免這一點:%%~nj給你的只是文件的名稱(沒有路徑和擴展名),%%~xj只是擴展名。此外,您可能不希望所有文件都有一個計數器,但每個重複文件名只需一個計數器。

@echo off 

setlocal EnableDelayedExpansion 

set TESTFOLDER=allpictures 
md "%TESTFOLDER%" 

for /f "tokens=*" %%i in ('dir /s /b /a-d C:\Users\user1\Desktop\*.jpg') do (
    call :copyfile "%%~i" 
) 

goto :eof 

:copyfile 
set fname=%~nx1 
set counter=0 

if not exist ".\%dest%\!fname!" goto docopy 

:recheck 
if exist ".\%dest%\%~n1_!counter!%~x1" (
    set /a counter+=1 
    goto recheck 
) 
set fname=%~n1_!counter!%~x1 

:docopy 
copy "%~1" ".\%dest%\!fname!" 

goto :eof 

endlocal 

在VBScript中,你可以做這樣的事情:

Set fso = CreateObject("Scripting.FileSystemObject") 

testfolder = ".\allpictures" 
fso.CreateFolder(testfolder) 

CopyFiles fso.GetFolder("C:\Users\user1\Desktop") 

Sub CopyFiles(fldr) 
    For Each f In fldr.Files 
    basename = fso.GetBaseName(f) 
    extension = fso.GetExtensionName(f) 
    If LCase(extension) = "jpg" Then 
     dest = fso.BuildPath(testfolder, f.Name) 
     count = 0 
     Do While fso.FileExists(dest) 
     count = count + 1 
     dest = fso.BuildPath(testfolder, basename & "_" & count & "." _ 
      & extension) 
     Loop 
     f.Copy dest 
    End If 
    Next 

    For Each sf In fldr.SubFolders 
    CopyFiles sf 
    Next 
End Sub 
+0

這真的很好,但現在我有另一個問題。我決定爲此使用vbscript,因爲批處理文件仍然出現文件名太長。另外我認爲vb的工作更好一點。我現在的問題是不使用c:\​​ users \ etc ...我需要從E:Drive和所有子文件夾中提取所有圖像,但是我遇到了代碼問題。我知道代碼被編程爲抓取foldres,並且它的事情非常小,我需要改變才能使其工作,但是我不知道VB腳本足以解決這個問題。有什麼建議麼? – dkrider471

+0

FSO設置=的CreateObject( 「Scripting.FileSystemObject的」) testfolder = 「\ allpictures。」 「fso.CreateFolder(testfolder) CopyFiles fso.GetFolder( 「E:\」) 子CopyFiles(FLDR) 對於fldr.Folder.Files中的每個f basename = fso.GetBaseName(f) extension = fso.GetExtensionName(f) 如果LCase(擴展名)=「jpg」則 dest = fso.BuildPath(testfolder,f.Name ) count = 0 Do雖然fso.FileExists(dest) count = count + 1 dest = fso.BuildPath(testfolder,basename&「_」&count &_ &擴展) 環路 f.Copy什特 結束如果 接着 – dkrider471

+0

對於每個SF在fldr.SubFolders CopyFiles SF 接着 結束子 – dkrider471

相關問題