如果reg键和值存在批处理

问题描述:

如何检查批处理文件中是否存在reg键和值,如果存在,则更改该值。以下是我想用英语做的事情。如果reg键和值存在批处理

HKCU\Software\App

IF "Directory" = "c:\users\%username%\AppData" THEN change to "Directory" = "%userprofile%\AppData" ELSE do nothing

见这是否工作:

@echo off & setlocal 

reg query HKCU\Software\App /v Directory 2>NUL || (
    reg add HKCU\Software\App /v Directory /t REG_EXPAND_SZ /d "%%userprofile%%\AppData" 
) 

reg query /?reg add /?在CMD控制台语法的全部细节。


编辑:限制,只有当它存在并包含特定位置的REG价值的创造需要多一点的逻辑。如果注册表中包含的路径包含尾部反斜杠或内联点或扩展或未扩展,则可能会导致简单的字符串匹配失败。比较路径时,最好将cdpushd放入目录中,以确保其格式统一,所有相关目录均已解析,所有变量展开,尾部斜线被剥离等。通过使用for循环比较短文件名+ %%~sI或类似的是另一种选择,但pushd方法具有测试目录是否存在并且可被访问的附加好处。

@echo off & setlocal 

rem // proceed only if the App key exists in the registry 
reg query HKCU\Software\App >NUL 2>NUL && (

    for /f "skip=2 tokens=2*" %%I in (
     'reg query HKCU\Software\App /v Directory 2^>NUL' 
    ) do call pushd "%%~J" 2>NUL && (
     rem // call pushd "%%~J" ensures the dir exists and the location is normalized 

     setlocal enabledelayedexpansion 
     if /i "!CD!"=="C:\Users\%username%\AppData" call :regupdate 
     endlocal 

     popd 

    rem // if pushd failed, the path is invalid. Update it. 
    ) || call :regupdate 
) 

exit /b 

:regupdate 
reg add HKCU\Software\App /v Directory /t REG_EXPAND_SZ /d "%%userprofile%%\AppData" /f 

另外一个注意:根据你打算用一次检索的值做什么%appdata%%localappdata%可能是最好%userprofile%\AppDataSee this page获取Windows环境变量的完整列表。

+0

唯一的问题是如果它不存在,它将创建密钥和值。如果它不存在,我需要它不做任何事情。如果该特定键和值存在,我只想更改该值。不过谢谢。任何其他想法? :) – Adam

+0

@Adam请参阅编辑。 – rojo

+0

太棒了!这工作!谢谢@rojo – Adam