2014-12-01 2 views
0

Целью является отображение имени каталога в MYFOLDER. MY.exe существует в папке, но с любопытством, без шаблона в ... \ desktemp *, «@echo Showing subfolders» никогда не отображается, но «@echo G работает». Однако MY.exe никогда не обнаруживается при перемещении в одну из подпапок.Каталоги Iterate с пакетом

OTOH в текущем коде никогда не находит MY.exe и никогда не отображает «@echo G работает», но правильно перечисляет каждую подпапку: «@echo Показывает подпапки».

Другая проблема заключается в том, что паузы в конце блока никогда не достигаются.

Подставив внутренний Ибо

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

получает по существу, один и тот же результат. My.exe не найден, если он перемещен в одну из подпапок desktemp.

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 \ New \ Desktop \ desktemp» в переменный через строку. Являются ли символы Escape, разделители и котировки во вложенных блоках правильно реализованы?

+0

В файле' Bat' вам нужно удвоить '%' переменных 'FOR'. 'For %% B in (c) do (если существует %% B ......' – SachaDee

+0

Да, я сохранил их как синглы, чтобы получить сообщения об ошибках. У меня есть настройка ведения журнала, но не фиксируется важный материал Есть ли хороший ресурс в любом месте регистрации журналов ошибок? –

+0

Существует так много ошибок, трудно добиться успеха. Основная проблема заключается в том, что '% x' будет генерировать синтаксическую ошибку, если вы попытаетесь использовать ее как метапеременная, как вам уже известно. Независимо от вашего желания получать сообщения об ошибках, до тех пор, пока эти ошибки не будут исправлены, пакет просто не будет запущен. Нет смысла преследовать escape-символы и т. д., пока вы это не сделаете - базовый 'for' структура, которую вы используете, не будет работать. – Magoo

ответ

0

Ответ сбежал от этого бедного головного мозга, пока он не похлопал по «DIR» и «For/D/R» на самом деле. То, к чему стремилось, заключалось в добавлении нового «For/D» (no/R).

Это первое (дополнительное) «For/D» определяет имена папок для итерации. (конкретно ничего, кроме директории Windows, где мы столкнулись с проблемами с> 260 имен файлов.)

Это находит файл MY.exe где-то в папке Users (точнее, в любой корневой папке, начиная с 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 

Edit:

источник спама ошибки в комментариях ниже эта команда:

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

дЛЯ/F " usebackq delims == "%% G IN (dir %CURRDRIVE%:\ /A:D /O:G /S /B ^| FIND /I "myString") DO (set" foundMyString = %% ~ pG ")

+0

Это выливает «Имя каталога слишком длинное» для таких элементов, как: «C: \ Users \ New \ AppData \ Local \ Microsoft \ VisualStudio \ 10.0 \ Extensions \ Sam Harwell \ ANTLR Language Support \ 1.2.1 \ ~ IC \ ItemTemplates \ CSharp \ ANTLR \ 1033" . Теперь это всего лишь 143 символа, но каким-то образом он муфтирует первую часть строки dir после \ Users \ New с «Локальными настройками \ Прикладными данными \ Прикладными данными \ Прикладными данными \ Прикладными данными \ Прикладными данными \ Прикладными данными", ни одна из которые «Локальные настройки» или «Данные приложения» существуют! Только Appdata (домашняя премия) –

+0

Er, приведенные выше ошибки возникают только в том случае, если «Invoking UAC for Privilege Escalation» в скрипте: Set UAC = CreateObject^(«Shell.Application» ^)> «% temp% \ OEgetPrivilesges.vbs» Другой тема. –

+0

Забудьте обо всех двух комментариях. Ошибка с UAC происходит с ______FOR/F "usebackq delims ==" %% G IN ('dir% CURRDRIVE%: \/A: D/O: G/S/B^| FIND/I" myString "') DO (установите «foundMyString = %% ~ pG») _______ –