1 (изменено: saturn, 2011-08-09 19:33:25)

Тема: CMD/BAT: Смена переменных окружения всем пользователям

Написал следующий скрипт, которым хочу на ПК с WinXP и наличием раздела D переписать на него пользовательские и системные темпы:

setlocal enableDelayedExpansion
@echo off
IF EXIST d:\.. (
    for /f "skip=4 delims=" %%u in ('Reg Query "HKEY_USERS" ^| findstr /v Classes') do (
        for /f "skip=2 tokens=3" %%e in ('Reg Query "%%u\Environment" /v TMP ^| findstr /i /v D:\Temp') do (
            reg add "%%u\Environment" /v TMP /t REG_EXPAND_SZ /d D:\Temp /f
        )
        for /f "skip=2 tokens=3" %%e in ('Reg Query "%%u\Environment" /v TEMP ^| findstr /i /v D:\Temp') do (
            reg add "%%u\Environment" /v TEMP /t REG_EXPAND_SZ /d D:\Temp /f
        )
    )

    for /f "skip=2 tokens=3" %%a in ('Reg Query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v TMP ^| findstr /i /v D:\Temp') do (
        reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment /v TMP /t REG_SZ /d D:\Temp /f
    )
    for /f "skip=2 tokens=3" %%a in ('Reg Query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v TEMP ^| findstr /i /v D:\Temp') do (
        reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment /v TEMP /t REG_SZ /d D:\Temp /f
    )
)

Вложенные циклы использовал для того, чтобы не перезаписывать уже исправленные ключи.
Но при выполнении скрипт выдаёт следующее:

Не удается найти файл 'Reg Query HKEY_USERS\.DEFAULT\Environment /v TMP | findstr /i /v D:\Temp'.
Не удается найти файл 'Reg Query "HKEY_USERS\.DEFAULT\Environment" /v TEMP | findstr /i /v D:\Temp'.
Не удается найти файл 'Reg Query HKEY_USERS\S-1-5-19\Environment /v TMP | findstr /i /v D:\Temp'.
Не удается найти файл 'Reg Query "HKEY_USERS\S-1-5-19\Environment" /v TEMP | findstr /i /v D:\Temp'.
Не удается найти файл 'Reg Query HKEY_USERS\S-1-5-20\Environment /v TMP | findstr /i /v D:\Temp'.
Не удается найти файл 'Reg Query "HKEY_USERS\S-1-5-20\Environment" /v TEMP | findstr /i /v D:\Temp'.
Не удается найти файл 'Reg Query HKEY_USERS\S-1-5-21-117609710-725345543-1801674531-500\Environment /v TMP | findstr /i /v D:\Temp'.
Не удается найти файл 'Reg Query "HKEY_USERS\S-1-5-21-117609710-725345543-1801674531-500\Environment" /v TEMP | findstr /i /v D:\Temp'.
Не удается найти файл 'Reg Query HKEY_USERS\S-1-5-18\Environment /v TMP | findstr /i /v D:\Temp'.
Не удается найти файл 'Reg Query "HKEY_USERS\S-1-5-18\Environment" /v TEMP | findstr /i /v D:\Temp'.

Игрался с кавычками - не помогло, больше ничего придумать не могу!
В чём моя ошибка?

И ещё вопрос: нет ли более корректного в cmd способа проверки существования логического диска?
Потому как при использовании "IF EXIST d:\..", если будет вставлена флешка или диск в привод с этой буквой, то условие выполнится, а нужно - чтобы срабатывало только на локальные логические диски!

2

Re: CMD/BAT: Смена переменных окружения всем пользователям

не просче ли задать в групповых политиках ?
и как бесправные пользователи будут менять ключи не своего реестра ?
И классический вопрос - Зачем ? (с)

Я конечно далек от мысли... (с)

3 (изменено: saturn, 2011-08-10 13:48:09)

Re: CMD/BAT: Смена переменных окружения всем пользователям

не просче ли задать в групповых политиках ?

Нет. В GP нет смены переменных сред!

и как бесправные пользователи будут менять ключи не своего реестра ?

Скрипт будет выполняться при старте машины через GP , и значит - от имени System, у которого хватит прав!

И классический вопрос - Зачем ?

Что зачем? Зачем менять расположение темпов?
А разве ответ не очевиден? Чтобы не забивать темпами место на системном разделе!

4

Re: CMD/BAT: Смена переменных окружения всем пользователям

OFF:

saturn пишет:

Нет. В GP нет смены переменных сред!

saturn, речь явно не про GP, а про GPP: Group Policy Preferences Overview - Microsoft.

5

Re: CMD/BAT: Смена переменных окружения всем пользователям

Именно речь о групповых политиках - берем шаблон "перенаправляемые папки" и видоизменив применяем его

а "очевидности" не вижу, только другой вопрос возникает - почему системный раздел мал и для каких целей разбиты диски ?

по сабжу если это "безобразие" в пределах сети организации то вполне можно справиться выполнением на сервере (если конечно таковой присутствует) команды  setx

Я конечно далек от мысли... (с)

6

Re: CMD/BAT: Смена переменных окружения всем пользователям

smaharbA пишет:

…берем шаблон "перенаправляемые папки" и видоизменив применяем его

Опишите подробнее.

7

Re: CMD/BAT: Смена переменных окружения всем пользователям

вкратце, начало тут
http://support.microsoft.com/kb/323639/ru

Я конечно далек от мысли... (с)

8

Re: CMD/BAT: Смена переменных окружения всем пользователям

Именно речь о групповых политиках - берем шаблон "перенаправляемые папки" и видоизменив применяем его

при таком варианте я не смогу проверить - "а есть ли на машине реально локальный диск D ?"

только другой вопрос возникает - почему системный раздел мал и для каких целей разбиты диски ?

Я не говорил, что системный раздел мал! Но, несмотря на это, мне абсолютно не нужны на нём темпы!
Диски разбиты для целей удобного резервного копирования путём снятия образа раздела.

по сабжу если это "безобразие" в пределах сети организации то вполне можно справиться выполнением на сервере (если конечно таковой присутствует) команды  setx

Безобразие оно может для Вас, но не для всех! А вот за setx - большое спасибо, помоему то, что может полностью заменить приведённый скрипт, кроме проверки на наличие раздела!

Кто-нибудь по первоначальным вопросам может что-нибудь подсказать?

9

Re: CMD/BAT: Смена переменных окружения всем пользователям

smaharbA, я не про то речь веду, а про суть вопроса.

Я понимаю, Вы предлагали просто создать шаблон неуправляемой политики для параметров реестра TMP и TEMP в разделе:

HKEY_CURRENT_USER\Environment

Так?

OFF:

saturn пишет:

Я не говорил, что системный раздел мал! Но, несмотря на это, мне абсолютно не нужны на нём темпы!

Просто их нужно время от времени чистить .

10

Re: CMD/BAT: Смена переменных окружения всем пользователям

Да, вот только вопрос "Зачем ? (с)" - остается открытый, так понимаю и для автора
следующим шагом будет перенос и разбиение подкачки, а потом вопрос - "куда пропал дамп ?"

Я конечно далек от мысли... (с)

11

Re: CMD/BAT: Смена переменных окружения всем пользователям

smaharbA пишет:

Да…

Спасибо, ясно.
OFF:

smaharbA пишет:

…вот только вопрос "Зачем ? (с)" - остается открытый, так понимаю и для автора

следующим шагом будет перенос и разбиение подкачки, а потом вопрос - "куда пропал дамп ?"

В этом согласен с Вами. Вопрос «Зачем?» чаще всего отнюдь не праздный.

12

Re: CMD/BAT: Смена переменных окружения всем пользователям

по сабжу - странно появление "Не удается найти файл ", максимум должно быть "Ошибка: Имеются дополнительные данные" для reg_expand_sz
автору можно попробовать
for /f "usebackq ..." %%in (`команда`) do ...

Я конечно далек от мысли... (с)

13

Re: CMD/BAT: Смена переменных окружения всем пользователям

Попробовал скрипт на других машинах - ошибок не выдаёт!
А может кто-нибудь подсказать по следующему вопросу?

И ещё вопрос: нет ли более корректного в cmd способа проверки существования логического диска?
Потому как при использовании "IF EXIST d:\..", если будет вставлена флешка или диск в привод с этой буквой, то условие выполнится, а нужно - чтобы срабатывало только на локальные логические диски!

14 (изменено: smaharbA, 2011-08-11 20:16:02)

Re: CMD/BAT: Смена переменных окружения всем пользователям

echo list volume | diskpart
mountvol d: /l && echo Есть Д || echo Нету Д
wmic volume where 'driveletter="d:" and drivetype=3' get name

saturn - как Вы собираетесь в случае сабжевого метода разбираться с правами ?

да, извращенный вариант забыл

echo off
mshta "javascript:window.close();new ActiveXObject('scripting.filesystemobject').GetStandardStream(1).WriteLine(GetObject('winmgmts:win32_logicaldisk.deviceid="d:"').drivetype);" | find "3"

И еще извращеннее

echo off
set drive=d:
set "comm="javascript:^
s=GetObject('winmgmts:');^
x=new ActiveXObject('wscript.shell').exec('rundll32 kernel32,Sleep');^
x=s.Get('win32_process.handle='+x.processid);^
pid=x.parentprocessid;x.terminate();x=0;^
try{x=s.Get('win32_logicaldisk.deviceid="%drive%"').drivetype}catch(e){}^
s.Get('win32_process.handle='+pid).terminate(x)""
mshta %comm%
echo %errorlevel%
Я конечно далек от мысли... (с)

15

Re: CMD/BAT: Смена переменных окружения всем пользователям

спасибо за код, пока сделал wmi через vbs с вызовом cmd , но ваш вариант больше нравится ввиду того, что всё можно в одном cmd разместить!

saturn - как Вы собираетесь в случае сабжевого метода разбираться с правами ?

На этот вопрос я ответил ещё в посте #3 (под второй цитатой).