Пакетные разделители цикла FOR не работают

Я пытаюсь вернуть место установки программы, используя REG QUERY внутри цикла FOR. Моя команда выглядит следующим образом:

FOR /F "TOKENS=2 DELIMS=REG_SZ" %%a IN ('REG QUERY "HKLM\SOFTWARE\Wow6432Node\TeamSpeak 3 Client" /V "" 2^>NUL') DO SET TSLOC=%%a

Теперь REG QUERY сам по себе возвращает:

    (Default)    REG_SZ    C:\Program Files\TeamSpeak 3 Client

Но использование разделителя REG_SZ возвращает:

C:\Users\Jake\Desktop>FOR /F "TOKENS=2 DELIMS=REG_SZ" %a IN ('REG QUERY "HKLM\SOFTWARE\Wow6432Node\TeamSpeak 3 Client" /V "" 2>NUL') DO SET TSLOC=%a
C:\Users\Jake\Desktop>SET TSLOC=Y
C:\Users\Jake\Desktop>SET TSLOC=    C:\Program Files (x86)\Team

Так что, очевидно, я добираюсь до \Team только в конце. Я понятия не имею, откуда он берет «Y» или почему разделитель заставляет его разделяться на \Team. Если я изменю свой токен # на 3, он вернет:

peak 3 Client

Так что каким-то образом он должен интерпретировать «s» как мой разделитель, верно?

Мой вопрос в том, почему (или, если нет, что он делает?) и как я могу заставить его дать мне все это. Что я делаю не так?


person BlankedyBlank    schedule 12.05.2014    source источник


Ответы (3)


Если REG QUERY возвращает приведенную ниже строку (включая пробелы):

    (Default)    REG_SZ    C:\Program Files\TeamSpeak 3 Client

... тогда вы хотите, чтобы токен после второго был разделен пробелами (это разделитель токенов по умолчанию), то есть:

FOR /F "TOKENS=2*" %%a IN ('REG QUERY "HKLM\SOFTWARE\Wow6432Node\TeamSpeak 3 Client" /V "" 2^>NUL') DO SET TSLOC=%%b
person Aacini    schedule 12.05.2014
comment
Превосходно! В моем усталом состоянии я даже не думал об использовании подстановочного знака. Благодарю вас! - person BlankedyBlank; 12.05.2014

DELIMS — это набор символов, а не отдельная строка. Поэтому любой символ из R, E, G, _, S или Z будет действовать как разделитель.

person Blorgbeard    schedule 12.05.2014
comment
Добро. Я не понял - есть ли способ заставить его действовать как одну строку? В противном случае мне придется сделать это «Z» или «_» и надеяться, что они не имеют его в своем пути установки. В любом случае, вы и ученый, и джентльмен; Я сердечно благодарю вас. - person BlankedyBlank; 12.05.2014
comment
Я не могу придумать простой способ сделать это, просто используя пакетные и стандартные программы Windows. Можете ли вы установить/использовать какой-либо другой язык сценариев? Или даже unxutils.sourceforge.net сделает это намного проще. - person Blorgbeard; 12.05.2014
comment
К сожалению нет; Я буду рассылать его со своего сервера примерно 90 конечным пользователям, так что это должно быть делом «нажми и готово» (следовательно, в первую очередь пакетным). Я думаю, что я просто буду использовать Z и перечислю это как предостережение. Ни у кого нет буквы «Z» в каталогах программ по умолчанию, верно? - person BlankedyBlank; 12.05.2014
comment
Кажется маловероятным. en.wikipedia.org/wiki/Program_Files не показывает локализованных версий с 'z ' в них. - person Blorgbeard; 12.05.2014

SET "tsloc=    (Default)    REG_SZ    C:\Program Files\TeamSpeak 3 Client"
SET "tsloc=%tsloc:*REG_SZ    =%"
ECHO +%tsloc%+

Поскольку REG QUERY сам по себе возвращает:

(Default)    REG_SZ    C:\Program Files\TeamSpeak 3 Client

приведенная выше команда SET удалит ненужные данные. Результат показан между +, чтобы продемонстрировать отсутствие пробелов.

Формула: set var=%somevar:*string1=string2%

присвоит var значение somevar, при этом все символы до string1 будут заменены на string2. Окружающие кавычки в команде set гарантируют, что любые лишние пробелы в конце строки не включены в назначенное значение.

person Magoo    schedule 12.05.2014
comment
Это хороший ответ, спасибо. Однако я выбрал вариант от Aacini, так как мне нужно (или я не вижу другого способа) использовать цикл for для установки вывода REG QUERY в качестве переменной. Если бы я собирался сделать это таким образом, хороший разделитель гарантировал бы, что всегда будет получена вся строка, поэтому лучше всего использовать символ, не разрешенный в папках Windows (например, ? и : среди прочих). - person BlankedyBlank; 12.05.2014
comment
Набор разделителей по умолчанию — пробел и табуляция. Любые символы, находящиеся между = и " во фразе delims, назначаются в качестве разделителей, переопределяя значение по умолчанию. Чтобы получить всю строку, отключите разделители с помощью delims=" - person Magoo; 12.05.2014