2012-02-03 60 views
0

幫助如果%DataLoc%中的文件少於20個,則嘗試使用代碼將文件移動到30個塊中。我修改了代碼Prior question。問題出在文件的FMove部分。無論我把什麼放在線上,都會給我一個錯誤。 我希望它具有%HoldLoc%值,但是由於出現錯誤而導致硬編碼。Windows批處理文件將文件夾中的X個文件移動到文件夾

環境是Windows 2008 R2服務器。

變化我已經嘗試了下面的那些以及括號中的引號和引號。

FOR%F IN(%HoldLoc%) FOR%F IN(%% HOLDLOCK%) FOR%F IN(C:\播放\暫停* .TMP)

我的代碼:

SETLOCAL ENABLEEXTENSIONS 
SETLOCAL ENABLEDELAYEDEXPANSION 

echo on 
set DataMax=20 
set DataLoc=C:\Play\Data 
Set HoldLoc=C:\Play\Hold 
set count=0 
FOR /F %%a in ('DIR /B %DataLoc%\*.tmp') do set /A count=count+1 
if %count% GEQ %DataMax% (Goto Exit) else (GOTO FMove) 
:FMove 
Echo Gather Top 30 files 
set SrcCount=0 
set SrcMax=30 
echo %HoldLoc% 
FOR %F IN (c:\Play\hold\*.tmp) DO IF !SrcCount! LSS %SrcMax% (
    SET /A SrcCount += 1 
    move /y %F "%DataLoc%" 
    ) 

問題是我在輸出窗口中得到了這個,爲什麼不能看到C?

C:>set /A count=count+1 

C:>if 19 GEQ 20 (Goto Exit) else (GOTO FMove) 

C:>Echo Gather Top 30 files 
Gather Top 30 files 

C:>set SrcCount=0 

C:>set SrcMax=30 

C:>echo C:\Play\Hold 
C:\Play\Hold 
\Play\hold\*.tmp) was unexpected at this time. 

C:>FOR \Play\hold\*.tmp) DO IF !SrcCount! LSS 30 (

C:> 

>

回答

0

你的腳本使用不正確的語法在兩個循環的一個循環變量:

FOR %F IN (c:\Play\hold\*.tmp) DO … 

剛剛嘗試改變%F%%F。單一百分號+字母是直接從命令提示符運行循環時循環變量的語法。在批處理腳本中,您應該始終使用循環變量的雙百分比引用,就像在FOR /F %%a循環中一樣。

+0

我試過,但它不工作。我更新了文本,因爲我需要在路徑中包含空格,但試圖將其縮小到最簡單的位置以查找錯誤。我相信這是一件簡單的事情,但我沒有看到它。與此更新環路返回的錯誤: 組SrcCount = 0 組SrcMax = 30 回波%HoldLoc% FOR %% G IN(C:\數據\ ** TMP)DO IF SrcCount! LSS%SrcMax%( \t SET/A SrcCount + = 1 \t移動/ Y%G 「%DataLoc%」 \t) 現在是: FOR%F IN(C:\播放\保持\ *。 tmp)DO IF!SrcCount! LSS%SrcMax%( – John 2012-02-03 11:42:47

+0

OK,對不起,這是代碼和DID幫助,但我仍然錯過了一些東西 FOR/F %% G IN('DIR/B%HoldLoc%\ *。tmp')DO IF!SrcCount!LSS%SrcMax%( \t SET/A SrcCount + = 1 \t移動/ Y%G %% DataLoc% \t) 轉到退出 ,但它是不給出的路徑的源: C: \ Play \ Ho ld> set SrcMax = 30 C:\ Play \ Ho ld> FOR/F%G IN('DIR/BC:\ play \ H old \ *。tmp')DO IF!SrcCount! LSS 30( SET/A SrcCount + = 1 move/y C:\ play \ D ata ) 系統找不到指定的文件。 C:\ Play \ Ho ld> REM echo!SrcCount!移動/ y DataLoc「 C:\ Play \ Ho ld> goto退出 – John 2012-02-03 11:52:30

+0

@John:1)用''/'%'GIN('DIR/B')將'%HoldLoc%*。 2)在'move'命令所在行:2.1)將'%G'改爲'%% G'; 2.2)將'%% G'改爲double引號2.3)在'%% DataLoc%'開頭刪除一個額外的'%'; 2.4)用''DataLoc%''在雙引號中括起來,結果命令爲:'move/y'%% G「」%DataLoc %「'。 – 2012-02-03 14:51:04

0

我更新了代碼,並通過改變一些東西來使它工作。感謝Andy提供的提示,但是我無法使用這些建議 - 如果我不遵循這些建議,我不會感到驚訝,這是我的一面,而不是你的。

FOR /F %%G IN ('DIR /B "%HoldLoc%"\*.tmp') DO IF !SrcCount! LSS %SrcMax% (
    SET /A SrcCount += 1 
    Echo "%HoldLoc%" 
    Echo "%%G%" 
    Echo "%SrcCount% 
    move /y "%HoldLoc%"\"%%G" "%DataLoc%" 

這裏是我結束了 - 不再,但仍功能:

SETLOCAL ENABLEEXTENSIONS 
SETLOCAL ENABLEDELAYEDEXPANSION 

echo on 
set DataMax=50 
set DataLoc=C:\Test Data (x86) 
Set HoldLoc=C:\Test Hold 
set count=0 
FOR /F %%a in ('DIR /B "%DataLoc%"\*.tmp') do set /A count=count+1 
if %count% GEQ %DataMax% (Goto Exit) else (GOTO FMove) 
:FMove 
Echo Gather Top 30 files 
set SrcCount=0 
set SrcMax=30 
FOR /F "TOKENS=*" %%a IN ('dir /A-D /O-D /B "%HoldLoc%"\*.tmp') DO (
     SET /A SrcCount += 1 
     if !SrcCount! LEQ %SrcMax% (
     MOVE /y "%HoldLoc%\%%a" "%DataLoc%" 
     ) 
    ) 
goto Exit 
:Exit 
close 
1
@echo off 

set Source=C:\perl\Drift_Bat\IN 
set Target=C:\perl\Drift_Bat\OUT 

set MaxLimit=20 

for /f "tokens=1* delims=[]" %%G in ('dir /A-D /B "%Source%\*.*" ^| find /v /n ""') do (
    move /y "%Source%\%%~nxH" "%Target%" 
    if %%G==%MaxLimit% exit /b 0 
) 
+1

雖然此代碼可能會回答問題,請添加一些說明。 – pinepain 2014-07-06 20:46:13

相關問題