Как обрабатывать закрывающую скобку в именах путей в цикле for?

У меня есть длинный путь к программе, которую я должен запустить в for / f, который включает закрывающую круглую скобку ")", и из которого мне нужно проанализировать вывод:

for /f "tokens=1" %%G in ('"C:\Documents and Settings\myaccount\Desktop\Test_release (x86)\program.exe" list') do (echo Will do something with %%G)

... где 'list' - параметр, переданный моей программе. Я получаю сообщение об ошибке "'C: \ Documents 'не распознается как внутренняя или внешняя команда, действующая программа или пакетный файл. "

Я знаю проблема в том, что закрывающая скобка фактически закрывает блок" for ", поэтому конечные двойные кавычки не являются "замечено", поэтому длинное имя пути больше не заключено в двойные кавычки. Я не понимаю , почему это происходит, поскольку мой путь заключен в двойные кавычки? Я также попробовал опцию usebackq :

for /f "usebackq tokens=1" %%G in (`"C:\Documents and Settings\myaccount\Desktop\Test_release (x86)\program.exe" list`) do (echo Will do something with %%G)

... без лучших результатов. Я пытался сбежать вот так «^)» или вот так «^^)», делать нечего. Пробовал удваивать двойные кавычки:

for /f "tokens=1" %%G in ('""C:\Documents and Settings\myaccount\Desktop\Test_release (x86)\program.exe"" list') do (echo Will do something with %%G)

По-прежнему не работает.

Кроме того, я фактически использую переменную, которая содержит путь, который заранее не известен (построенный из% CD%), и активируется EnableDelayedExpansion . Я попробовал отложенное расширение (которое устранило аналогичные проблемы в других ситуациях), чтобы предотвратить расширение переменной во время чтения и отложить его во время выполнения:

setlocal EnableDelayedExpansion
set _var=%CD%\program.exe
@REM _var now contains C:\Documents and Settings\myaccount\Desktop\Test_release (x86)\program.exe
for /f "tokens=1" %%G in ('"!_var!" list') do (echo %%G)
endlocal

По-прежнему не работает, не понимаю, почему.

Но , удвоение двойных кавычек с отложенным раскрытием в приведенном выше коде:

for /f "tokens=1" %%G in ('""!_var!"" list') do (echo %%G)

действительно работает! ... зачем ... зачем это делать ??? Какой эффект от этого? Я не понимаю. Я также боюсь, что это может вызвать проблемы при определенных обстоятельствах ...

Есть идеи?

5
задан Alec Alameddine 24 April 2019 в 14:48
поделиться