2014-12-01 84 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