2014-02-06 134 views
0

我所試圖做的事:使用FOR循環將文件移動到另一個目錄

  1. 提示用戶輸入帳號。
  2. 帳號是他們的文件夾。
  3. 然後提示用戶選擇另一個目錄(其時間戳文件夾)。
  4. 該腳本將啓動一個可執行文件。
  5. 然後將在日誌文件中解析findstr
  6. 如果字符串回來存在,那麼腳本會通過goto:move子例程嘗試recursively通過用戶選擇的「時間戳」目錄來移動所有「* .ARC」文件到他們的「Media1」文件夾。

我遇到的問題是,在「子程序」 :move運行for循環命令的最後一步是輸出以下錯誤:

The filename, directory name, or volume label syntax is incorrect.

The filename, directory name, or volume label syntax is incorrect.

我我不知道這裏發生了什麼,因爲我可以將它輸入到命令提示符(沒有!variables!)並使其工作。但是,使用這些變量似乎不起作用。

另一個有趣的一點是,我基本上在:string「子程序」下使用相同的!variables!,它確切地找到了我所要求的。所以,我認爲!variables!沒有錯?

我在這裏錯過了什麼嗎?

:main 

    cls 
    echo. 
    set /P acct=Please type the 9 digit account number you would like to restore: 
    set acctDir=x:\!acct! 
    set acctDir2=media1\Setup\setup.exe /cd 
    set log=c:\log.txt 


    echo. Starting on !date! !time! on !Computername! >> !log! 
    echo. 
    echo The account number you selected is: !acct! 
    echo. 

    goto :user 

:user 

    set /p answer=Is this correct (Y/N)? 
    echo. 

    if /i !answer!==y goto :yes (
    ) else ( 
     echo. 
     echo Ok. Let's try again^^! 
     echo. 
     pause 
     cls 
     goto :main 
     ) 
    ) 

:yes 

    set c=0 
    For /f %%a in ('dir !acctDir! /B /A:D') do (
    set /a c+=1 
    echo !c! %%a 
    set dir!c!=%%a 
    ) 

    echo. 
    set /p userIn="Select a directory [1-!c!]: " 
    set userDir=!dir%userIn%! 

    echo. 
    echo You selected !userDir! for your data retrieval. 
    echo. 
    goto :string 

:execute 

    echo. 
    echo The Data Protector Program will now be initialized... 
    start !acctdir!\!userDir!\!acctDir2! 

    goto :string 


:string 

    set sumLog=!acctdir!\!userDir!\SummaryLog.txt 
    set succ=finished 
    set acctDir3=media1 
    set x=x:\!acct!\!userDir! 

    findstr " .*!succ!" !sumLog! 
    if exist errorlevel 0 (
     pause 
     goto :move 
    ) else (
     goto :eof 
    ) 

:move 


    for /r "!acctdir!\!userDir!\" %%g in (*.ARC) do echo move "%%g" "!acctdir!\!userdir!\!acctdir3!\" 
    if exist errorlevel 1 (
     echo Cannot move files. Error occurred. 
     pause 
    ) 


endlocal 
goto :eof 
+0

任何人都可以看到這種情況? – mjaestewart

+0

嘗試在for循環之前回顯延遲的擴展變量。 'echo!acctdir!\!userDir!' - 這會告訴你變量是否擴展到正確的值。 – unclemeat

+0

好點!因此,我使用以下x:\ 101004357 \ Jan_20_2014_6_56_55_953PM \ media1 \獲得了正確的路徑,使用'!acctdir!\!userDir!\!acctdir3!\'。所以,這告訴我路徑是正確的。那麼,我怎麼知道'FOR'循環的語法是否正確工作? – mjaestewart

回答

0

這是測試變量的另一個方法。

:move標籤後面添加下面四行並運行批處理文件。
如果有任何空格或非法字符,您會在第一次暫停前看到它們。

:move 

    echo "!acctdir!" 
    echo "!userDir!" 
    echo "!acctdir3!" 
    pause 

     for /r "!acctdir!\!userDir!\" %%g in (*.ARC) do echo move "%%g" "!acctdir!\!userdir!\!acctdir3!\" 
     pause 
+0

我無法在這個子程序中將這些變量定義爲新變量的原因是因爲'acctDir'和'userDir'是最終用戶的輸入變量。它們在前面的子程序中由最終用戶輸入信息定義,然後將該輸入值分配給變量。這樣做可以選擇任何帳戶文件夾和子文件夾。如果你不明白,我可以嘗試更深入地解釋。感謝您的注意! – mjaestewart

+0

我明白了。但是你告訴我們for命令不起作用。這將會證明命令有效或沒有。 – foxidrive

+0

所以如果你在我的主要問題中檢查代碼,我在'FOR'循環後面添加了一個'IF'語句。這是告訴我,有一個錯誤,但不知道確切的錯誤是什麼.....這是令人難以置信的,因爲它應該是如此簡單!哎呀!!!! – mjaestewart

相關問題