2012-06-16 14 views
1

我測試的文件夾的存在,並且根據它的存在,我想運行不同的命令:重定向命令行輸出,以保持從指令窗口顯示錯誤消息

DIR %MYDIR%\tmp > test.txt 
IF ERRORLEVEL 1 (
     echo/FOLDER DOES NOT EXIST 
) else (
     echo/FOLDER EXISTS 
    ) 

的問題是,如果該文件夾不存在我得到除了這個錯誤到標準輸出:

The system cannot find the file specified. 

我想沒有收到錯誤,以顯示正確的輸出。

回答

3

這樣如何:

DIR %MYDIR%\tmp > nul 2>&1 

「> NUL」 是指標準輸出重定向到文件NUL(比特桶)。

「2>」用於重定向標準錯誤(描述符2)。因此,「2> & 1」用於將標準錯誤重定向到意味着標準輸出(描述符1 - 因此「> null和1> null」是相同的)或者可以使用「2> nul」

+0

工作很好!謝謝! –

0

使用exist代替:

@echo off 
if exist %MYDIR%\tmp (
    dir %MYDIR%\tmp > test.txt 
    goto EndIt 
) 
echo %MYDIR%\tmp not found > test.txt 
:EndIt 
2

您可能是碰上了,我已經見過很多次在我自己的腳本一個共同的問題:沒想到在文件路徑的空間

的MYDIR環境的價值變量可能有一個空格,當路徑中有空格時,大多數命令會將它看作空格以後的多個參數用於分離參數。所以,你的情況,如果MYDIR是C:\Documents and Settings\Jim\My Documents那麼你的腳本將嘗試在幾個參數進行目錄列表:

  • C:\文件
  • 設置\吉姆\我
  • 文件

在命令提示嘗試這種情況:

C:\> mkdir learn 

C:\> cd learn 

C:\> mkdir peas and carrots 

C:\learn> dir 

Volume in drive C is OS 
Volume Serial Number is 7199-C950 

Directory of C:\learn 

10/03/2012 07:26 PM <DIR>   . 
10/03/2012 07:26 PM <DIR>   .. 
10/03/2012 07:26 PM <DIR>   and 
10/03/2012 07:26 PM <DIR>   carrots 
10/03/2012 07:26 PM <DIR>   peas 

嗯,三個名爲「豌豆」,「和」,「胡蘿蔔」的文件夾,但按字母順序排列,這是我對dir命令的偏好。要解決這個問題,你需要周圍有空格的任何路徑參數報價:

C:\learn> mkdir "peas and carrots" 

C:\learn> dir 

Volume in drive C is OS 
Volume Serial Number is 7199-C950 

Directory of C:\learn 

10/03/2012 08:10 PM <DIR>   . 
10/03/2012 08:10 PM <DIR>   .. 
10/03/2012 07:26 PM <DIR>   and 
10/03/2012 07:26 PM <DIR>   carrots 
10/03/2012 07:26 PM <DIR>   peas 
10/03/2012 07:29 PM <DIR>   peas and carrots 
       0 File(s)    0 bytes 
       6 Dir(s) 49,670,320,128 bytes free 

要糾正你的情況這個問題,周圍的文件/文件夾的路徑添加引號:

DIR "%MYDIR%\tmp" > test.txt 

那即使文件確實存在存在的問題,也消除system cannot find the file specified

不幸的是,如果文件/文件夾真的不存在,您將得到相同的錯誤消息。如果您堅持使用DIR命令完成此操作,則必須重定向stderr流。您已使用>重定向運算符重定向stdout。重定向stderr到同一個文件,你的命令應該是這樣的:

DIR "%MYDIR%\tmp" > test.txt 2>&1 

基於批處理文件的輸出消息,我假設你只有在確定%MYDIR%\ tmp中存在興趣,並您實際上並不希望將%MYDIR%\ tmp的目錄列表保留在當前工作目錄中名爲test.txt的文件中。如果您只是檢查文件/文件夾是否存在,那麼使用DIR命令是一個非常糟糕的選擇。如果%MYDIR%\ tmp是一個文件夾,那麼腳本會浪費時間檢索該文件夾中每個文件的目錄信息。如果該文件夾中有數千個文件,則可能會導致明顯的延遲。另外,你已經在當前工作目錄中存放了一個名爲test.txt的文件,在腳本退出之前你應該刪除它......你知道......假設你並不是真的想要這個文件。

如果您只是想知道文件夾或文件是否存在,那麼有更好的選擇:if exist命令非常適合您的需求。要了解更多關於if命令,在Windows命令提示符窗口中,鍵入:if /?

例子:

C:\> if /? 
Performs conditional processing in batch programs. 

IF [NOT] ERRORLEVEL number command 
IF [NOT] string1==string2 command 
IF [NOT] EXIST filename command 

乍一看文檔意味着if exist作品只有文件,但放心它與文件夾以及文件一起工作。

在閱讀if命令的文檔時,可能會遇到「如果命令擴展已啓用...」這樣的短語在大多數系統中,命令擴展默認情況下處於啓用狀態,但我仍然希望將第二行任何腳本setlocal EnableExtensions。第一行是@echo off,在我完成調試之前,該行很快會更改爲rem @echo off

setlocal EnableExtensions命令做了兩兩件事:

  1. 確保您設置或腳本中更改任何環境變量不會影響到調用環境。
  2. 確保啓用命令擴展。命令擴展是好的

如果你想通過批量編寫複雜的和有用的腳本(即在同一時間被認爲是不可能完成的任務)來打動你的朋友,請仔細閱讀和格羅克有關每個嵌入文檔命令:

  • 如果
  • 設置
  • 呼叫
  • CMD

你將不得不利用這些命令必須提供的每一個技巧和細節來編寫非常好的腳本。

舉個例子:set命令可用於許多任務:

  1. 簡單賦值:
    set myDir=C:\Foo

  2. 執行數學:
    set /a myCount=myCount + 1

  3. 提示輸入:
    set /p myColor=What is favorite color

  4. 提取子:
    set myCentury=%myYear:~0,2%

這裏是我會寫腳本

@echo off 
setlocal EnableExtensions 

if exist "%MyDir%\tmp" (
    echo Folder exists 
) else (
    echo Folder does not exist 
) 

好運和快樂的狩獵。