Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Как получить значение параметра из реестра, добавить значение в текстовый файл etc.? (http://forum.oszone.net/showthread.php?t=184844)

Dark Ange1 07-09-2010 14:35 1490317

Как получить значение параметра из реестра, добавить значение в текстовый файл etc.?
 
Доброе время суток!

Подскажите пожалуйста, как получить ТОЛЬКО значение одного параметра из реестра и скопировать его в буфер обмена и/или в текстовый файл?
Например, мне нужно скопировать и записать в текстовый файл(с перезаписью) значение параметра dword Wallpaper_0_FileName из пути реестра HKEY_CURRENT_USER\Software\Binary Fortress Software\DisplayFusion\Wallpaper

gora 09-09-2010 11:09 1491622

Как-то так:
Код:

For /F "UseBackQ Tokens=2*" %%I In (`Reg Query "HKCU\Software\Binary Fortress Software\DisplayFusion\Wallpaper"^|Find /I "Wallpaper_0_FileName"`) Do Echo %%J>text.txt

Dark Ange1 08-10-2010 21:41 1514634

Спасибо, супер, работает! Осталось только добавить, что в начале батника/cmd надо ставить
Код:

CHCP 1251
чтобы правильно копировалась кириллица.

И как нужно модифицировать код, чтобы значение не заменялось а добавлялось в конец файла?

gora 08-10-2010 22:07 1514644

Цитата:

Цитата Dark Ange1
добавлялось в конец файла? »

Добавить еще один ">"
Код:

For /F "UseBackQ Tokens=2*" %%I In (`Reg Query "HKCU\Software\Binary Fortress Software\DisplayFusion\Wallpaper"^|Find /I "Wallpaper_0_FileName"`) Do Echo %%J>>text.txt

Dark Ange1 08-10-2010 22:13 1514649

И еще: если
Код:

For /F "UseBackQ Tokens=2*" %%I In (`Reg Query "HKCU\Software\Binary Fortress Software\DisplayFusion\Wallpaper"^|Find /I "Wallpaper_0_FileName"`) Do Echo %%J|clip
, то как потом в этой же консоли вставить значение буфера обмена. Например, для использования с командой move

Цитата:

Цитата gora
Добавить еще один ">" »

блин, не поверишь - только что сам вспомнил и хотел сюда написать:)

Отлично. Теперь я могу получить текстовый файл со списком путей к файлу, включая имя файла в столбик типа этого:
Код:

D:\Wallpapers\Dir1\file1.jpg
D:\Wallpapers\Dir2\file2.jpg
D:\Wallpapers\Dir1\file55.jpg
...
D:\Wallpapers\Dir678\file2098.jpg
...

А вот как теперь копировать/переместить/удалить файлы по путям из того списка?

gora 08-10-2010 22:48 1514682

Код:

For /F "tokens=* delims=" %%i In (names.txt) Do Echo %%i
names.txt - файл со списком путей
Echo - замените на: копировать/переместить/удалить

Dark Ange1 08-10-2010 23:10 1514709

А если пути файлов в names.txt содержат пробелы?

Dark Ange1 08-10-2010 23:45 1514722

Спасибо. Заработало. Но для xcopy заработало только после того, как поменял
Код:

Do xcopy %%i  C:\Walls\ /y
на
Код:

Do xcopy "%%i" C:\Walls\ /y
, т.е. %%i взял в кавычки.

Я немного некорректно сообщил условия
Цитата:

Отлично. Теперь я могу получить текстовый файл со списком путей к файлу, включая имя файла в столбик типа этого:
Код:

D:\Wallpapers\Dir1\file1.jpg
D:\Wallpapers\Dir2\file2.jpg
D:\Wallpapers\Dir1\file55.jpg
...
D:\Wallpapers\Dir678\file2098.jpg

...
На самом деле в списке присутствовала кириллица в кодировке CHCP 1251 и пробелы:
Код:

D:\Обои на удаление\Папка 1\файл1.jpg
D:\Обои на удаление\Папка 2\файл2.jpg
D:\Обои на удаление\Папка 1\файл_42.jpg
...
D:\Обои на удаление\-=Папка 546=-\файл_222.jpg
...


sov44 24-03-2011 20:14 1643105

Пытаюсь разобраться с присвоением переменных. Подскажите, почему не работает скрипт?
Код:

For /F "UseBackQ Tokens=2*" %%I In (`Reg Query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\"^|Find /I "BuildLab"`) Do set /a Build=%%a
For /F "UseBackQ Tokens=2*" %%I In (`Reg Query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\"^|Find /I "CSDVersion"`) Do set /a Version=%%b
For /F "UseBackQ Tokens=2*" %%I In (`Reg Query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\"^|Find /I "ProductName"`) Do set /a Product=%%c
CHCP 1251 >Nul
echo %Product%>>txt.txt
echo %Version%>>txt.txt
echo %Build%>>txt.txt


gora 24-03-2011 20:35 1643115

Цитата:

Цитата sov44
Код:

For /F "UseBackQ Tokens=2*" %%I In (`Reg Query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\"^|Find /I "BuildLab"`) Do set /a Build=%%a
»

Удалите во всех строках выделенное цветом.

sov44 24-03-2011 20:56 1643134

Цитата:

Цитата gora
Удалите во всех строках выделенное цветом. »

удалил, результат:
Код:

%c
%b
%a

расчитывал получить
Код:

Microsoft Windows XP
Service Pack 3
2600.xpsp_sp3_qfe.100216-1510


gora 24-03-2011 21:07 1643146

А так?
Код:

For /F "UseBackQ Tokens=2*" %%I In (`Reg Query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion"^|Find /I "BuildLab"`) Do set Build=%%J
For /F "UseBackQ Tokens=2*" %%I In (`Reg Query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion"^|Find /I "CSDVersion"`) Do set Version=%%J
For /F "UseBackQ Tokens=2*" %%I In (`Reg Query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion"^|Find /I "ProductName"`) Do set Product=%%J
CHCP 1251 >Nul
echo %Product%>>txt.txt
echo %Version%>>txt.txt
echo %Build%>>txt.txt


sov44 24-03-2011 21:45 1643198

Цитата:

Цитата gora
А так? »

Скрипт заработал. Пишет первую и последнюю переменную, среднюю %Version% писать не хочет:
Код:

Microsoft Windows XP
2600.xpsp_sp3_qfe.100216-1510


gora 24-03-2011 21:53 1643206

Цитата:

Цитата sov44
среднюю %Version% писать не хочет: »

Там в конце "3" стоит, вот об нее и спотыкается. Исправьте последние строки так:
Код:

>>txt.txt echo %Product%
>>txt.txt echo %Version%
>>txt.txt echo %Build%


SharkyEXE 24-01-2015 11:32 2460569

2 all
Подниму тему

Есть 100%но рабочий вариант, файл 1.cmd
Скрытый текст
Код:

@Echo Off

Rem http://forum.oszone.net/post-1132000-6.html

For /F "Tokens=2* Delims=        " %%A In ('Reg Query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /V ProductName^|Find "REG_SZ"') Do Set OS1=%%B
@Echo %OS1%
Pause
Exit

Но этот вариант не работает на Windows 2000, потому что в Windows 2000 отсутствует файл reg.exe

Пожалуйста, напишите мне 100%но рабочий вариант файла 1.cmd, чтобы работало в Windows 2000

gora 24-01-2015 11:52 2460574

Цитата:

Цитата SharkyEXE
в Windows 2000 отсутствует файл reg.exe »

А команда ver там работает или ее результат тоже не устраивает?
Код:

Microsoft Windows XP [Версия 5.1.2600]
-----------------------------------------
Microsoft Windows [Version 6.1.7601]
-----------------------------------------
Microsoft Windows [Version 10.0.9926]


SharkyEXE 24-01-2015 18:37 2460717

Цитата:

Цитата gora
команда ver там работает »

В Windows 2000 команда ver работает.
Скрытый текст
Код:

Microsoft Windows 2000 [Версия 5.00.2195]
Но моя затея, если это возможно, чтобы вывести содержимое параметра ProductName из ключа HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion в Windows 2000

Iska 24-01-2015 18:56 2460723

SharkyEXE, используйте WSH.

SharkyEXE 24-01-2015 19:11 2460733

Цитата:

Цитата Iska
используйте WSH »

Мне надо, чтобы работало от Windows 2000 (можно даже более ранние выпуски Windows) до Windows 8.1

Если WSH удовлетворяет этому требованию - пожалуйста, напишите мне готовый код, чтобы вывести содержимое параметра ProductName из ключа HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion

Спасибо.

Iska 24-01-2015 19:43 2460744

Цитата:

Цитата SharkyEXE
Мне надо, чтобы работало от Windows 2000 … до Windows 8.1
Если WSH удовлетворяет этому требованию »

Удовлетворяет.

Цитата:

Цитата SharkyEXE
можно даже более ранние выпуски Windows »

У Вас ещё есть где-то NT 4.0?!

Код:

WScript.Echo WScript.CreateObject("WScript.Shell").RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName")
Можете попробовать использовать напрямую в пакетных файлах посредством «mshta.exe» в виде:
Скрытый текст
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

for /f "usebackq delims=" %%i in (
        `@"%systemroot%\system32\mshta.exe" "javascript:try {new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(new ActiveXObject('WScript.Shell').RegRead('HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProductName'))};catch (e){};close();"`
) do set sProductName=%%i

if defined sProductName (
        echo [%sProductName%]
) else (
        echo Can't find [ProductName] parameter in [HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion].
)

endlocal
exit /b 0


но могут быть проблемы в новых ОС в случае, если там были заблокированы использованные объекты Automation в IE для зоны Локальный компьютер — это проверяйте на практике.

SharkyEXE 24-01-2015 21:42 2460788

Цитата:

Цитата Iska
У Вас ещё есть где-то NT 4.0?! »

Нет.
Просто нужна универсальность, чтобы одно и тоже работало как можно на большем количестве версий Windows

Цитата:

Цитата Iska
Можете попробовать использовать напрямую в пакетных файлах посредством «mshta.exe» в виде: »

А нельзя ли в пакетный файл вложить как-то только одну эту строку:
Скрытый текст
Код:

WScript.Echo WScript.CreateObject("WScript.Shell").RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName")

Просто чем больше строк, чем больше зависимостей - тем хуже.
Вот я поэтому искал способ, чтобы только средствами cmd обойтись, чтобы не тащить vbs, wsh скрипты...

Iska 25-01-2015 05:32 2460868

Цитата:

Цитата SharkyEXE
А нельзя ли в пакетный файл вложить как-то только одну эту строку: »

Можно. Именно эта строка и «вложена» в пакетный файл во втором коде (только не на VBScript, а на JScript) из моего предыдущего поста. Могу повторить:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

for /f "usebackq delims=" %%i in (
        `@"%systemroot%\system32\mshta.exe" "javascript:try {new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(new ActiveXObject('WScript.Shell').RegRead('HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProductName'))};catch (e){};close();"`
) do set sProductName=%%i

if defined sProductName (
        echo [%sProductName%]
) else (
        echo Can't find [ProductName] parameter in [HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion].
)

endlocal
exit /b 0

Весь остальной «обвес» предназначен для запуска «mshta.exe» с передачей ему кода из его командной сроки, разбора полученного вывода от «mshta.exe» посредством «for /f», определения успешности исполнения кода в «mshta.exe» и вывода полученного результата. «Тащить» дополнительно ничего не надо. Никаких внешних зависимостей нет.

Цитата:

Цитата SharkyEXE
Просто нужна универсальность, чтобы одно и тоже работало как можно на большем количестве версий Windows »

Тогда нужно забыть про пакетные файлы и пользовать исключительно WSH.

SharkyEXE 25-01-2015 09:41 2460896

Цитата:

Цитата Iska
«Тащить» дополнительно ничего не надо. Никаких внешних зависимостей нет. »

Да нет, есть гемморой, что это не заработает, так как Вы мне писали
Скрытый текст
Цитата:

Цитата Iska
но могут быть проблемы в новых ОС в случае, если там были заблокированы использованные объекты Automation в IE для зоны Локальный компьютер — это проверяйте на практике. »

Одним словом пусть будет так, как Вы скажите, хотя, кончено, очень бы хотелось только средствами cmd реализовать, но для этого надо, походу дела, в Windows 2000 положить файл reg.exe

Iska 25-01-2015 10:41 2460909

SharkyEXE, я написал «могут быть». Но это не значит, что «обязательно будут». Ваше дело проверить и отписаться по результатам.

SharkyEXE 26-01-2015 07:34 2461392

Цитата:

Цитата Iska
SharkyEXE, я написал «могут быть». Но это не значит, что «обязательно будут». Ваше дело проверить и отписаться по результатам. »

Большое Вам спасибо за помощь, за готовый рабочий пример, но поймите меня, пожалуйста, правильно, хочется готовую конфетку - запустил на любой ОС и получил результат.

Если на какой-либо ОС что-то не сработает из-за каких-то ограничений mshta.exe - у меня нет желания и времени разбираться, почему не сработало на какой-либо ОС, лезть в настройки IE и снижать уровень безопасности и прочее

Поэтому мне проще отказаться от того, что я хотел, буду пользоваться выводом команды ver

Iska 26-01-2015 07:58 2461396

SharkyEXE, поймите и меня правильно: это требуется Вам, но Вы не хотите даже просто проверить работоспособность. У меня в этом случае тем более не возникнет желания проделывать данную работу — искать, загружать, устанавливать разнообразные ОС и проверять под ними пакетный файл — вместо Вас.

djoniAg 22-06-2022 09:00 2987073

Попробовал ваш вариант скрипта - спасибо . правда не разобрался в параметре %%J
Цитата:

For /F "UseBackQ Tokens=2*" %%I In (`Reg Query "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows"^|Find /I "Device"`) Do set Device=%%J
CHCP 1251 >Nul
echo %Device%>>txt.txt
pause
пытаюсь получить принтер.
в консоли видно что имя полученно . но 2 я команда затирает его
Цитата:

d:\ADMIN\SSS>For /F "UseBackQ Tokens=2*" %I In (`Reg Query "HKCU\SOFTWARE\Micros
oft\Windows NT\CurrentVersion\Windows"|Find /I "Device"`) Do set Device=%J

d:\ADMIN\SSS>set Device=HP LaserJet P2015 Series PCL 6,winspool,Ne00:

d:\ADMIN\SSS>set Device=

d:\ADMIN\SSS>CHCP 1251 1>Nul

d:\ADMIN\SSS>echo 1>>txt.txt

d:\ADMIN\SSS>pause
Откуда берется
Цитата:

set Device=
??

djoniAg 22-06-2022 13:47 2987093

еще вариант . но как бы "выкусить лишнее"
Цитата:

REG QUERY "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" /v device
вот результат
Цитата:

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows
device REG_SZ HP LaserJet 400 M401 PCL 6,winspool,Ne01:

NickM 22-06-2022 14:37 2987095

А так не вариант?
Код:

@echo off
SetLocal EnableExtensions

for /f "tokens=2*" %%i in ('reg query "HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows" /v "Device"  2^> nul') do set device=%%j
for /f "tokens=1 delims=," %%i in ("%device%") do echo."%%i"



Время: 00:39.

Время: 00:39.
© OSzone.net 2001-