2013-08-06 84 views
0

我在繞過批處理文件中的變量時遇到了一些困難。當我認爲我已經失敗了,我發現一個例子,它不工作,因爲我期望,我覺得我一直在這個圈子...for循環中的批處理文件變量

我已經寫了我的整個批量代碼它有所不同,基本上我有一個存檔文件夾與許多子文件夾,我想檢查我的上傳數據(將被移動到存檔文件夾在腳本的末尾 - 當我得到這部分工作要寫)有已經被處理。如果是這樣,移動到Duplicates文件夾與日期:

@echo off 

for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set localDT=%%j 
set localYYYY=%localDT:~0,4% 
set localMM=%localDT:~4,2% 
set localDD=%localDT:~6,2% 
set localDate=%localYYYY%-%localMM%-%localDD% 
set localTime=%localDT:~8,2%:%localDT:~10,2% 

for %%f in ("C:\Test\837Store\*.837") DO if exist /R "C:\Test\Archive\%%~nxf" (
    set VariableTemp=%%~nxf 
    echo %VariableTemp% 
    IF NOT EXIST "C:\Test\Archive\Duplicates" mkdir "C:\Test\Archive\Duplicates" 
    IF NOT EXIST "C:\Test\Archive\Duplicates\%localYYYY%" mkdir "C:\Test\Archive\Duplicates\%localYYYY%" 
    IF NOT EXIST "C:\Test\Archive\Duplicates\%localYYYY%\%localMM%" mkdir "C:\Test\Archive\Duplicates\%localYYYY%\%localMM%" 
    copy "%%~nxf" "C:\Test\Archive\Duplicates\%localYYYY%\%localMM%" 
    echo %localDate% %localTime%  Duplicate claims file: %%~dpnxf File moved to archive  >> "C:\Test\Log\Error.log" 
) 
pause 

我的問題是,變量%% f似乎並沒有通過循環設置。運行mkdir命令,但當我們到達副本時,出現「文件未找到」錯誤。爲了試着看看發生了什麼,我包含了VariableTemp並根據代碼進行了設置,期望看到文件的名稱和擴展名。相反,我的回聲是打印「%〜nxf」

任何人都可以幫我理解這些變量是如何工作的?爲什麼我沒有看到來自我的837Store的文件名?

只是爲了更多的信息,我有以下2個文件在C:\測試\ 837Store:

1.837 2.837

我在C相同的2個文件:\測試\存檔\ 2013 \ 08,所以會期望它們從837Store移動到相關的Duplicates文件夾。

謝謝。

+0

Endoro有問題,但有一些評論:你看到''%〜nxf''作爲'VariableTemp'的值的事實表明以前的運行已經將'VariableTemp'設置爲這個值。與大多數語言不同,批處理繼承之前的程序中的變量在相同的'cmd'會話中運行。批處理程序所做的任何更改都會保留,直到再次進行特別更改 - 除非在setlocal和endlocal(或文件結束/程序)之間進行更改,此時環境恢復到其狀態當'setlocal'被執行時。 – Magoo

+0

下一個問題是一個風格問題。 'IF NOT EXIST'dirname「'當然可以,但是'md'dirname」2> nul'會創建一個不存在的目錄,'2> nul'會轉儲'it already exists'消息。將這個'INSIDE'放在循環中是沒有意義的,因爲目標目錄名稱在循環中不會改變。 'md' /'mkdir'(它們是同義詞)應該移到循環之外 - 在FOR之前 - 完成一次,而不是(可能)多次。最後,'IF EXIST/R'不是名義上有效的語法。它打算做什麼? – Magoo

+0

感謝您的提示!我添加/ R的原因是因爲如果沒有它,腳本似乎不會遍歷子文件夾 - 「重複」文件夾是使用/ R創建的,但如果刪除它,則不會。說實話,我已經使用反覆試驗來構建這些,而不是正確的理解,所以這些答案都很棒。謝謝! – Ekins86

回答

1
@ECHO OFF 
SETLOCAL 

for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set localDT=%%j 
set localYYYY=%localDT:~0,4% 
set localMM=%localDT:~4,2% 
set localDD=%localDT:~6,2% 
set localDate=%localYYYY%-%localMM%-%localDD% 
set localTime=%localDT:~8,2%:%localDT:~10,2% 

mkdir "U:\Test\Archive\Duplicates\%localYYYY%\%localMM%" 2>nul 


for /R U:\Test\837Store %%f in (*.837) DO ECHO processing %%~ff&if exist "U:\Test\Archive\%%~nxf" (
IF EXIST "u:\Test\Archive\Duplicates\%localYYYY%\%localMM%\%%~nxf" (
    echo %localDate% %localTime%  Duplicate claims file: %%~dpnxf File ALREADY DUPLICATED >> "u:\Error.log" 
) ELSE (
    MOVE "%%~ff" "u:\Test\Archive\Duplicates\%localYYYY%\%localMM%" 
    echo %localDate% %localTime%  Duplicate claims file: %%~dpnxf File moved to archive  >> "u:\Error.log" 
) 
) 
rmdir "U:\Test\Archive\Duplicates\%localYYYY%\%localMM%" 2>nul 
rmdir "U:\Test\Archive\Duplicates\%localYYYY%" 2>nul 
rmdir "U:\Test\Archive\Duplicates" 2>nul 
GOTO :EOF 

這是我的解釋。

我已經使用我的RAMdrive進行測試,所以驅動器號將需要更改,並且還需要錯誤日誌位置。

我已經添加了一個額外的測試重複已存在 - 只是報告這種情況。

我已將您的COPY更改爲MOVE以符合您的敘述。無論採用哪種方式,追加到該命令的>nul都應該禁止'1文件複製/移動'消息,如果您想禁止它。

MD/MKDIR將在目標上方創建任何必需的子目錄。

最後三個'rmdir/RD`的目的是刪除任何空目錄名稱的子目錄。

+0

再次感謝Peter的幫助!不幸的是,我仍然遇到了「無法找到指定文件」的錯誤。 Duplicates文件夾被創建,然後被刪除,因爲.837文件不被複制。事實上,error.log文件打印的行是「重複索賠文件:%〜dpnxf文件移動到歸檔」 - 對我來說,就好像變量沒有按照我原來的問題設置,否則我們應該得到文件路徑和名稱,對嗎? 是否有可能存在某種安全或許可問題? – Ekins86

+0

只是一個額外的評論,該變量在for循環的第一行工作,只是似乎沒有出於某種原因。我在終端上得到的輸出是: 「處理C:\ Test \ 837Store \ 1.837」 「正在處理C:\ Test \ 837Store \ 2.837」 「系統找不到指定的文件」 – Ekins86

+0

Ouch!這非常令人費解。我提供的代碼直接從我的測試設置中粘貼,它看起來很完美。也許有幾個基本問​​題 - 批次對佈局和空間位置有些敏感。像'NOTEPAD'這樣的編輯有時會嘗試以一種奇怪的方式重新格式化批量。最好複製粘貼到像[editplus](http://www.editplus.com/)這樣的適當編輯器中。批處理在很大程度上不區分大小寫**主除了**是'for'循環元變量'%% f'(在你的情況下)。最後,你確定你已經正確地修改了所有'u:'實例嗎? – Magoo

相關問題