2014-12-01 83 views
0

目標是在MYFOLDER中顯示目錄名稱。 MY.exe存在於該文件夾中,但好奇的是,沒有通配符在... \ desktemp *中,「@echo Showing子文件夾」從不顯示,但「@echo G正在工作」是。但是,移到其中一個子文件夾時永遠不會找到MY.exe。迭代目錄與批處理

OTOH當前代碼永遠不會發現MY.exe永不顯示「@echo G的工作」,但正確地列出每個子文件夾:「@echo顯示子文件夾」。

另一個問題是在所述塊的端部的停頓是從來沒有達到過。

代內對於

cd \Users\%USERNAME%\Desktop 
for /D /r %%G in ("desktemp*") do (

基本上得到相同的結果。如果移動到desktemp的其中一個子文件夾,找不到My.exe。

Setlocal EnableDelayedExpansion 
set CURRDRIVE=C 
SET MYFOLDER= 
:SEARCHDRIVES 


REM BLOCK 

for %%B in (C) do (
if exist %%B: (

PUSHD %%B:\ 
if NOT DEFINED MYFOLDER (
ECHO "%CD%" 
REM This always displays path batch is run from. 
REM The above Pushd doesn't change to C:\ 

for /f "tokens=*" %%G in ('dir /b /s /a:d "%%B:\Users\%USERNAME%\Desktop\desktemp*" ^| find "\"') do (
@echo Showing subfolders 
@echo %%G 
pause 
if exist "%%G\MY.exe" (
call set MYFOLDER=%%G 
@echo %%G 
@echo G is working 
call echo %MYFOLDER% 
pause 
GOTO GOTMYFOLDER 
) 
) 
) 

) 
REM Exist Drive 
) 
REM Drives Loop 


:GOTMYFOLDER 
cd /d %CURRDRIVE%:\ 
echo %MYFOLDER% 
cd %MYFOLDER% 
pause 

上面的是從較大的代碼塊削成塊:該最終目的是獲得文件夾名稱「\ Users \用戶新\桌面\ desktemp」到經由提示的變量。 嵌套塊中的轉義字符,分隔符和引號是否正確執行?

+0

在'Bat'文件中,您必須加倍'FOR'變量的'%'。 (對於(c)中的%% B做(如果存在%% B ......' – SachaDee 2014-12-02 00:50:02

+0

是的,我將它們保存爲單數以獲取錯誤消息。我有日誌記錄設置,但沒有捕獲重要的東西。有一個很好的資源上一批錯誤日誌地方? – 2014-12-02 03:39:43

+0

有這麼多的錯誤,就很難取得進展。最根本的問題是,如果你嘗試使用它作爲一個metavariable'%x'會產生一個語法錯誤,因爲你已經明白了,無論你想要得到錯誤信息,直到這些錯誤得到糾正,批處理將不會運行。沒有必要去追趕轉義字符等等,直到你這樣做 - 基本的'for'您使用的是行不通的結構。 – Magoo 2014-12-02 06:32:08

回答

0

答案逃脫這個可憐的小腦袋,直到它棉田到什麼是「DIR」和「/ d/R」是真正達到。尋求的是增加了一個新的「For/D」(no/R)。

該第一(額外)「爲了/ d」確定的文件夾的名稱從進行迭代。 (具體什麼,但Windows目錄中,我們遇到了與> 260名的問題。)

這地方所處的MY.exe文件中的用戶文件夾(更精確地在任何根文件夾帶U開頭):

Setlocal EnableDelayedExpansion 
set CURRDRIVE=C 
SET MYFOLDER= 
:SEARCHDRIVES 


REM BLOCK 

for %%B in (C) do (
if exist %%B: (

PUSHD %%B:\ 
if NOT DEFINED MYFOLDER (
ECHO "%CD%" 
REM This always displays path batch is run from. 
REM The above Pushd doesn't change to C:\ 
for /D %%Z in (U*) do (

cd \%%Z 
for /D /r %%G in ("*") do (

if exist "%%G\MY.exe" (
call set MYFOLDER=%%G 
@echo %%G 
@echo G is working 
call echo %MYFOLDER% 
pause 
GOTO GOTMYFOLDER 
) 
) 
) 
) 

) 
REM Exist Drive 
) 
REM Drives Loop 


:GOTMYFOLDER 
cd /d %CURRDRIVE%:\ 
echo %MYFOLDER% 
cd %MYFOLDER% 
pause 

編輯:

在下面的評論的誤差垃圾的來源是此命令:

Insert batch code to elevate UAC privileges [code][1] from TanisDL 
Setlocal EnableDelayedExpansion & pushd "%CD%" & CD /D "%~dp0" 
set CURRDRIVE=C 

FOR/F「 usebackq delims ==「%% G IN(dir %CURRDRIVE%:\ /A:D /O:G /S /B ^| FIND /I "myString")DO(設置」foundMyString = %%〜pG「)

+0

對於諸如「C:\ Users \ New \ AppData \ Local \ Microsoft \ VisualStudio \ 10.0 \ Extensions \ Sam Harwell \ ANTLR Language Support \ 1.2.1 \〜IC」這樣的項目,這會吐出「目錄名太長」 \的ItemTemplate \ CSHARP \ ANTLR \ 1033" 。現在這隻有143個字符,但不知何故,它在\ Users \ New之後用「本地設置\應用程序數據\應用程序數據\應用程序數據\應用程序數據\應用程序數據\應用程序數據」隱藏了dir字符串的第一部分,哪個「本地設置」或「應用程序數據」存在!只有Appdata(家庭高級版) – 2014-12-03 13:35:06

+0

Er,上述錯誤只發生在腳本中的「爲特權升級調用UAC」時:Set UAC = CreateObject ^(「Shell.Application」^)>「%temp%\ OEgetPrivileges.vbs」主題methinks。 – 2014-12-03 13:56:35

+0

忘掉上面的兩條評論。 UAC的錯誤發生在______FOR/F「usebackq delims ==」%% G IN('dir%CURRDRIVE%:\/A:D/O:G/S/B^| FIND/I「myString」')DO (設置「foundMyString = %%〜pG」)_______ – 2014-12-06 11:27:27