Dark Ange1 |
07-09-2010 14:35 1490317 |
Как получить значение параметра из реестра, добавить значение в текстовый файл etc.?
Доброе время суток!
Подскажите пожалуйста, как получить ТОЛЬКО значение одного параметра из реестра и скопировать его в буфер обмена и/или в текстовый файл?
Например, мне нужно скопировать и записать в текстовый файл(с перезаписью) значение параметра dword Wallpaper_0_FileName из пути реестра HKEY_CURRENT_USER\Software\Binary Fortress Software\DisplayFusion\Wallpaper
|
Как-то так:
Код:
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 надо ставить чтобы правильно копировалась кириллица.
И как нужно модифицировать код, чтобы значение не заменялось а добавлялось в конец файла?
|
Цитата:
Цитата 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
блин, не поверишь - только что сам вспомнил и хотел сюда написать:)
Отлично. Теперь я могу получить текстовый файл со списком путей к файлу, включая имя файла в столбик типа этого:
Код:
D:\Wallpapers\Dir1\file1.jpg
D:\Wallpapers\Dir2\file2.jpg
D:\Wallpapers\Dir1\file55.jpg
...
D:\Wallpapers\Dir678\file2098.jpg
...
А вот как теперь копировать/переместить/удалить файлы по путям из того списка?
|
Код:
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
...
|
Пытаюсь разобраться с присвоением переменных. Подскажите, почему не работает скрипт?
Код:
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
|
Цитата:
Цитата sov44
Код:
For /F "UseBackQ Tokens=2*" %%I In (`Reg Query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\"^|Find /I "BuildLab"`) Do set /a Build=%%a
»
|
Удалите во всех строках выделенное цветом.
|
Цитата:
Цитата gora
Удалите во всех строках выделенное цветом. »
|
удалил, результат:
расчитывал получить
Код:
Microsoft Windows XP
Service Pack 3
2600.xpsp_sp3_qfe.100216-1510
|
А так?
Код:
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
|
Скрипт заработал. Пишет первую и последнюю переменную, среднюю %Version% писать не хочет:
Код:
Microsoft Windows XP
2600.xpsp_sp3_qfe.100216-1510
|
Цитата:
Цитата sov44
среднюю %Version% писать не хочет: »
|
Там в конце "3" стоит, вот об нее и спотыкается. Исправьте последние строки так:
Код:
>>txt.txt echo %Product%
>>txt.txt echo %Version%
>>txt.txt echo %Build%
|
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
|
Цитата:
Цитата SharkyEXE
в Windows 2000 отсутствует файл reg.exe »
|
А команда ver там работает или ее результат тоже не устраивает?
Код:
Microsoft Windows XP [Версия 5.1.2600]
-----------------------------------------
Microsoft Windows [Version 6.1.7601]
-----------------------------------------
Microsoft Windows [Version 10.0.9926]
|
Цитата:
Цитата gora
команда ver там работает »
|
В Windows 2000 команда ver работает.
Скрытый текст
Код:
Microsoft Windows 2000 [Версия 5.00.2195]
Но моя затея, если это возможно, чтобы вывести содержимое параметра ProductName из ключа HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion в Windows 2000
|
SharkyEXE, используйте WSH.
|
Мне надо, чтобы работало от Windows 2000 (можно даже более ранние выпуски Windows) до Windows 8.1
Если WSH удовлетворяет этому требованию - пожалуйста, напишите мне готовый код, чтобы вывести содержимое параметра ProductName из ключа HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion
Спасибо.
|
Цитата:
Цитата 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 для зоны Локальный компьютер — это проверяйте на практике.
|
Цитата:
Цитата 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 скрипты...
|
Цитата:
Цитата 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.
|
Цитата:
Цитата Iska
«Тащить» дополнительно ничего не надо. Никаких внешних зависимостей нет. »
|
Да нет, есть гемморой, что это не заработает, так как Вы мне писали
Скрытый текст
Цитата:
Цитата Iska
но могут быть проблемы в новых ОС в случае, если там были заблокированы использованные объекты Automation в IE для зоны Локальный компьютер — это проверяйте на практике. »
|
Одним словом пусть будет так, как Вы скажите, хотя, кончено, очень бы хотелось только средствами cmd реализовать, но для этого надо, походу дела, в Windows 2000 положить файл reg.exe
|
SharkyEXE, я написал «могут быть». Но это не значит, что «обязательно будут». Ваше дело проверить и отписаться по результатам.
|
Цитата:
Цитата Iska
SharkyEXE, я написал «могут быть». Но это не значит, что «обязательно будут». Ваше дело проверить и отписаться по результатам. »
|
Большое Вам спасибо за помощь, за готовый рабочий пример, но поймите меня, пожалуйста, правильно, хочется готовую конфетку - запустил на любой ОС и получил результат.
Если на какой-либо ОС что-то не сработает из-за каких-то ограничений mshta.exe - у меня нет желания и времени разбираться, почему не сработало на какой-либо ОС, лезть в настройки IE и снижать уровень безопасности и прочее
Поэтому мне проще отказаться от того, что я хотел, буду пользоваться выводом команды ver
|
SharkyEXE, поймите и меня правильно: это требуется Вам, но Вы не хотите даже просто проверить работоспособность. У меня в этом случае тем более не возникнет желания проделывать данную работу — искать, загружать, устанавливать разнообразные ОС и проверять под ними пакетный файл — вместо Вас.
|
Попробовал ваш вариант скрипта - спасибо . правда не разобрался в параметре %%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
|
Откуда берется ??
|
еще вариант . но как бы "выкусить лишнее"
Цитата:
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:
|
|
А так не вариант?
Код:
@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.
© OSzone.net 2001-