2015-09-16 6 views
1

Когда пользователь в Windows 7 входит в систему и профиль поврежден, он получает пустой профиль. Я могу исправить достаточно легко, перейдя в реестр и удалив временный профиль, установив значения refcount и state. Я застрял в своей партии, так как извлечение из реестра добавляет 2 пробела к имени ключа реестра, как только я вызову его в пакете. Если я повторяю% SID%, он возвращает правильное значение без видимого пространства. Реестра имеет% SID% и% SID% .bakПереименование/удаление ключей в реестре с помощью пакетного cmd

@echo off 
setlocal ENABLEDELAYEDEXPANSION 
for /F "skip=1 delims=" %%j in ('wmic useraccount where name^="%username%" get SID') do (
    set SID=%%j 
    goto :DONE 
) 
:DONE 
echo SID=%SID% 

reg delete "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\%SID%.bak" 
pause 

результат партии:

SID=S-1-5-21-1559011707-81249799-2450556423-1000 
Permanently delete the registry key HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Window 
s NT\CurrentVersion\ProfileList\S-1-5-21-1559011707-81249799-2450556423-1000 .b 
ak (Yes/No)? y 
ERROR: The system was unable to find the specified registry key or value. 
Press any key to continue . . . 

Как вы можете видеть выход положить 2 пробела после SID & расширение файла

Любые идеи?

+0

'echo SID =% SID% foo'. посмотрите, существуют ли пробелы. если да, то они присутствуют в wmic-выходе. –

ответ

0

Просто добавьте это:

set SID=!SID: =! 

это удалит все пространство!

1

Результаты запроса WMI кодируются в UCS-2 LE, а не ANSI. При захвате вывода wmic я считаю, что иногда полезно добавить одноразовый столбец в запрос и использовать /format:csv, чтобы сохранить форматирование.

@echo off 
setlocal 

for /f "tokens=2 delims=," %%I in (
    'wmic useraccount where "name='%username%'" get SID^,Status /format:csv' 
) do set "SID=%%I" 

rem // echo result 
set SID 
1

MarcB прав, то вар неверен потому, что пространство в конце.
Вы можете проверить Пробельные с кавычками в echo и решить ее с delims= "

@echo off 
setlocal ENABLEDELAYEDEXPANSION 
for /F "skip=1 delims= " %%j in ('wmic useraccount where name^="%username%" get SID') do (
    set SID=%%j 
    goto :DONE 
) 
:DONE 
echo SID = '%SID%' 
pause 
reg delete "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\%SID%.bak" 
pause