您可能是碰上了,我已經見過很多次在我自己的腳本一個共同的問題:沒想到在文件路徑的空間
的MYDIR環境的價值變量可能有一個空格,當路徑中有空格時,大多數命令會將它看作空格以後的多個參數用於分離參數。所以,你的情況,如果MYDIR是C:\Documents and Settings\Jim\My Documents
那麼你的腳本將嘗試在幾個參數進行目錄列表:
在命令提示嘗試這種情況:
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
命令做了兩兩件事:
- 確保您設置或腳本中更改任何環境變量不會影響到調用環境。
- 確保啓用命令擴展。命令擴展是好的
如果你想通過批量編寫複雜的和有用的腳本(即在同一時間被認爲是不可能完成的任務)來打動你的朋友,請仔細閱讀和格羅克有關每個嵌入文檔命令:
你將不得不利用這些命令必須提供的每一個技巧和細節來編寫非常好的腳本。
舉個例子:set
命令可用於許多任務:
簡單賦值:
set myDir=C:\Foo
執行數學:
set /a myCount=myCount + 1
提示輸入:
set /p myColor=What is favorite color
提取子:
set myCentury=%myYear:~0,2%
這裏是我會寫腳本
@echo off
setlocal EnableExtensions
if exist "%MyDir%\tmp" (
echo Folder exists
) else (
echo Folder does not exist
)
好運和快樂的狩獵。
工作很好!謝謝! –