2012-07-12 35 views
0

在這裏找到了同樣的問題..我想使用代碼,但我的數據。我絕不是程序員..然而,我可以採取幾乎任何代碼,並使其適用於我。批處理文件找到文件夾中的最新文件,然後複製並重命名爲另一個文件夾

How to code a batch file to copy and rename the most recently dated file?

這裏是我的

@echo on 
setLocal DisableDelayedExpansion 
pushd N:\ 
setLocal EnableDelayedExpansion 

for /f "tokens=* delims= " %%G in ('dir/b/od') do (set newest=%%G) 

copy %newest% G:\Server_Files\AMI_DATA\TEXT_FILES\NewFile.csv 

PAUSE 
POPD 

而結果...

C:\Documents and Settings\belcherj\Desktop\AMI_BATCH>setLocal DisableDelayedExpa 
nsion 

C:\Documents and Settings\belcherj\Desktop\AMI_BATCH>pushd N:\ 

N:\>setLocal EnableDelayedExpansion 

N:\>for /F "tokens=* delims= " %G in ('dir/b/od') do (set newest=%G) 

N:\>(set newest=System Blink Count__2012-06-27 01_00_46.csv) 

N:\>(set newest=System Blink Count__2012-06-28 01_00_32.csv) 

N:\>(set newest=System Blink Count__2012-06-29 01_00_33.csv) 

N:\>(set newest=System Blink Count__2012-06-30 01_00_42.csv) 

N:\>(set newest=System Blink Count__2012-07-01 01_00_32.csv) 

N:\>(set newest=System Blink Count__2012-07-02 01_00_31.csv) 

N:\>(set newest=System Blink Count__2012-07-03 01_00_29.csv) 

N:\>(set newest=System Blink Count__2012-07-04 01_00_39.csv) 

N:\>(set newest=System Blink Count__2012-07-05 01_00_34.csv) 

N:\>(set newest=System Blink Count__2012-07-06 01_00_31.csv) 

N:\>(set newest=System Blink Count__2012-07-07 01_00_32.csv) 

N:\>(set newest=System Blink Count__2012-07-08 01_00_30.csv) 

N:\>(set newest=System Blink Count__2012-07-09 01_00_40.csv) 

N:\>(set newest=System Blink Count__2012-07-10 01_00_29.csv) 

N:\>(set newest=System Blink Count__2012-07-11 01_00_44.csv) 

N:\>(set newest=System Blink Count__2012-07-12 01_00_34.csv) 

N:\>copy System Blink Count__2012-07-12 01_00_34.csv G:\Server_Files\AMI_DATA\TE 
XT_FILES\NewFile.csv 
The system cannot find the file specified. 

N:\>PAUSE 
Press any key to continue . . . 

我認爲這是與在文件名中的空格..我嘗試了一些我發現的代碼,它給出了相同的結果。我接近只需要一點點推動。 感謝您的時間和幫助。

回答

5

這應該工作

@echo off 
cd /d N:\ 
for /f "tokens=*" %%a in ('dir /b /od') do set newest=%%a 
echo f| xcopy "%newest%" G:\Server_Files\AMI_DATA\TEXT_FILES\NewFile.csv 
+0

訣竅!看起來像光盤讓它打開映射的網絡驅動器是什麼讓它的工作..我可能是錯誤的:) ..感謝您的幫助@ dbnham和巴厘島C – jestexman 2012-07-13 16:00:21

0

你是對的,你的直接問題是文件名中的空格。您可以通過添加引號來解決該問題:copy "%newest%" "G:\Server_Files\AMI_DATA\TEXT_FILES\NewFile.csv"

但還有其他問題。 FOR選項應該是「eol =:delims =」。如果文件名以空格或分號開頭,則您現有的選項將會失敗。

如果文件名包含感嘆號,您的代碼也可能會失敗,因爲您在使用FOR %% G變量時啓用了延遲epansion。您啓用延遲擴展,但您不使用它。

如果列出的最後一個「文件」碰巧是一個目錄而不是文件,那麼您的代碼也會失敗。您需要DIR /A-D選項來過濾目錄名稱。

糟糕!我的原始發佈代碼不起作用,因爲PUSHD已被刪除,DIR/B在輸出中不包含路徑信息。

下面是避免潛在問題的解決方案,並且還增加了一些額外的錯誤檢查:

@echo on 
setlocal disableDelayedExpansion 
set "quit=pause & exit /b" 
pushd N:\ || %quit% 
set "newest=" 
for /f "eol=: delims=" %%F in ('dir /b /od /a-d') do set "newest=%%F" 
if defined newest copy "%newest%" G:\Server_Files\AMI_DATA\TEXT_FILES\NewFile.csv 
%quit% 

禁用延遲擴展可能是沒有必要的,因爲它是在大多數安裝的默認狀態。但它不能傷害。

由於使用SETLOCAL,一旦腳本結束,對環境的任何更改都將丟失。 (一旦腳本結束,就有一個隱含的ENDLOCAL)。 ENDLOCAL(隱式或顯式)也解除了PUSHD的結果,這就是爲什麼POPD不是必需的。

我定義了一個退出「宏」,以便使用相同的兩個命令始終退出腳本:PAUSE,然後是EXIT/B。腳本最後不需要EXIT/B,但它不會受傷。

通過按降序排列文件列出文件並使用GOTO在第一個文件後跳出循環,可以使腳本更加高效。

@echo on 
setlocal disableDelayedExpansion 
set "quit=pause & exit /b" 
pushd N:\ || %quit% 
set "newest=" 
for /f "eol=: delims=" %%F in ('dir /b /o-d /a-d') do set "newest=%%F" & goto :break 
:break 
if defined newest copy "%newest%" G:\Server_Files\AMI_DATA\TEXT_FILES\NewFile.csv 
%quit% 

或文件可以在循環中沒有定義的環境變量被複制,此時該腳本可以立即結束:

@echo on 
setlocal disableDelayedExpansion 
set "quit=pause & exit /b" 
pushd N:\ || %quit% 
for /f "eol=: delims=" %%F in ('dir /b /o-d /a-d') do (
    copy "%%F" G:\Server_Files\AMI_DATA\TEXT_FILES\NewFile.csv 
    %quit% 
) 
%quit% 
+0

謝謝你答覆,但你的解決方案似乎沒有做任何事情。我添加了引號..並收到了相同的消息。我用你提供的代碼創建了一個新的bat文件,它不給我任何消息。我是否應該將它添加到我的第一個bat文件中?我很抱歉,因爲對此感到陌生。我們的文件名將如系統閃爍計數_2012-07-12 01_00_34.csv – jestexman 2012-07-12 22:13:22

+0

@jestexman - 引號確實應該修復您的原始代碼。我不確定你出錯的地方。我已經修復了我的代碼,存在重大問題。 – dbenham 2012-07-13 00:09:17

+0

我真的很感激你爲我尋找這個。我仍然沒有得到任何結果。 N和G是映射的網絡驅動器。這可能會導致批處理不工作?我在這個批處理文件的東西方式新。我嘗試了所有三個文件。我將文本複製到一個空白的txt文件中,然後重命名爲amirname.bat,然後從那裏運行它。 dos窗口彈出半秒鐘然後關閉。這就是我得到的。再次感謝你的時間。 – jestexman 2012-07-13 13:26:40

相關問題