использование команд по конвейеру с for / f на окнах (с запросом reg) - PullRequest
3 голосов
/ 07 декабря 2011

Я пытаюсь запросить место установки программы в реестре.Все, что меня интересует, это вывод местоположения.

Этот вопрос имеет частичное решение, но это не совсем помогает.В Windows 7 команда reg выводит глупый заголовок ключа реестра вместе со значением, как показано ниже:

reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\NSIS Unicode" /v InstallLocation

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\NSIS Unicode
InstallLocation    REG_EXPAND_SZ    C:\Program Files\NSIS

Во-первых, есть ли способ отключить заголовок и упростить вывод?

В командной строке я могу изменить приведенное выше значение на

reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\NSIS Unicode" /v InstallLocation | findstr InstallLocation

, чтобы оно возвращало мне только вторую строку.

Теперь, если мне нужно использовать FOR /Fчтобы проанализировать это и получить только значение каталога, команда FOR терпит неудачу, говоря: | was unexpected at this time.

Вот мой командный файл:

@for /f "tokens=2* delims=   " %%k in ('reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\NSIS Unicode" /v InstallLocation | findstr InstallLocation') do @echo %%k

Так, где я иду неправильно?*

Ответы [ 2 ]

8 голосов
/ 07 декабря 2011

Вы должны экранировать символ | с помощью каретки (^).

@echo off
setlocal

set KEY=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\NSIS Unicode
set V=InstallLocation

for /f "tokens=2* delims= " %%k in ('reg query "%KEY%" /v %V% ^| findstr "%V%"') do echo %%k

это вернет REG_SZ на моей машине.

2 голосов
/ 07 декабря 2011

Символ трубы особенный и должен быть экранирован с помощью ^.

@for /f "tokens=2* delims=   " %%k in ('reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\NSIS Unicode" /v InstallLocation <b>^|</b> findstr InstallLocation') do @echo %%k
...