我在繞過批處理文件中的變量時遇到了一些困難。當我認爲我已經失敗了,我發現一個例子,它不工作,因爲我期望,我覺得我一直在這個圈子...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文件夾。
謝謝。
Endoro有問題,但有一些評論:你看到''%〜nxf''作爲'VariableTemp'的值的事實表明以前的運行已經將'VariableTemp'設置爲這個值。與大多數語言不同,批處理繼承之前的程序中的變量在相同的'cmd'會話中運行。批處理程序所做的任何更改都會保留,直到再次進行特別更改 - 除非在setlocal和endlocal(或文件結束/程序)之間進行更改,此時環境恢復到其狀態當'setlocal'被執行時。 – Magoo
下一個問題是一個風格問題。 'IF NOT EXIST'dirname「'當然可以,但是'md'dirname」2> nul'會創建一個不存在的目錄,'2> nul'會轉儲'it already exists'消息。將這個'INSIDE'放在循環中是沒有意義的,因爲目標目錄名稱在循環中不會改變。 'md' /'mkdir'(它們是同義詞)應該移到循環之外 - 在FOR之前 - 完成一次,而不是(可能)多次。最後,'IF EXIST/R'不是名義上有效的語法。它打算做什麼? – Magoo
感謝您的提示!我添加/ R的原因是因爲如果沒有它,腳本似乎不會遍歷子文件夾 - 「重複」文件夾是使用/ R創建的,但如果刪除它,則不會。說實話,我已經使用反覆試驗來構建這些,而不是正確的理解,所以這些答案都很棒。謝謝! – Ekins86