gpt4 book ai didi

batch-file - 如何使用 .bat 文件从 PATH 环境变量中删除特定标记?

转载 作者:行者123 更新时间:2023-12-02 21:00:19 25 4
gpt4 key购买 nike

我正在编写卸载脚本,因此我想“撤消”安装对系统所做的修改。为了实现这个目标,我想解析 PATH 变量,并删除安装添加到 PATH 的任何值。


为此,我开发了以下伪代码 -

  • PATH的内容保存到临时变量
  • 使用 ; 字符作为分隔符将 PATH 拆分为标记,并循环遍历每个标记
  • (循环中)识别当前 token 是否是安装添加的 token
  • (循环中)如果安装时未添加当前 token ,请将其保存以添加到更新的 PATH(在临时变量中)
  • 保存更新的PATH

我预计这会相对简单地实现。


第一步,存储PATH很简单。

SET TEMP_PATH=%PATH% 

但是,当我尝试循环遍历每个 token 时,它不会按我的预期工作。

FOR /F "delims=;" %%A IN (%TEMP_PATH%) DO ECHO %%A 

此命令仅输出第一个 token ,不会回显后续 token 。


所以,我有两个问题 -

  • 如何循环访问未知数量的 token 并使用每个 token ?
  • 是否有其他更简单的方法可以实现相同的目标?

谢谢。

最佳答案

下面的批处理代码使用 PathToRemove1PathToRemove2、... 删除脚本顶部定义的一个或多个文件夹路径

  • 存储在 Windows 注册表项下的当前用户帐户的用户 PATH
    HKEY_CURRENT_USER\Environment
  • 系统 PATH 存储在 Windows 注册表项下
    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment

系统PATH的更新需要管理员权限,这意味着如果执行批处理文件的用户帐户未禁用用户帐户控制(UAC),则必须以管理员身份执行批处理文件,该用户帐户也属于本地管理员组。

Windows command SETX 默认情况下在 Windows Vista 和更高版本的 Windows 上可用。它在 Windows XP 甚至以前版本的 Windows 上不可用。请阅读有关 SetX 的 SS64 文章和 Microsoft 的 SetX 文档,了解有关命令 SETX 可用性的更多信息。

有关 Windows XP 与更高版本的 Windows 版本上的 reg.exe 输出差异,请参阅 Rob van der Woude 的 Reading NT's Registry with REG Query 。下面的批处理代码考虑了 reg.exe 的不同输出。

要了解为什么不使用当前在执行批处理文件时定义的本地PATH,请阅读问题、答案和评论

注释批处理代码,用于从用户和系统中删除文件夹路径PATH:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "PathToRemove1=C:\Temp\Test"
set "PathToRemove2=C:\Temp"

rem Get directly from Windows registry the system PATH variable value.
for /F "skip=2 tokens=1,2*" %%G in ('%SystemRoot%\System32\reg.exe query "HKLM\System\CurrentControlSet\Control\Session Manager\Environment" /v "Path" 2^>nul') do (
if /I "%%G" == "Path" (
set "SystemPath=%%I"
if defined SystemPath goto CheckSystemPath
)
)
echo Error: System environment variable PATH not found with a value in Windows registry.
echo(
goto UserPath

:CheckSystemPath
setlocal EnableDelayedExpansion
rem Does the system PATH not end with a semicolon, append one temporarily.
if not "!SystemPath:~-1!" == ";" set "SystemPath=!SystemPath!;"
rem System PATH should contain only backslashes and not slashes.
set "SystemPath=!SystemPath:/=\!"

rem Check case-insensitive for the folder paths to remove as defined at top
rem of this batch script and remove them if indeed found in system PATH.
set "PathModified=0"
for /F "tokens=1* delims==" %%I in ('set PathToRemove') do (
if not "!SystemPath:%%J;=!" == "!SystemPath!" (
set "SystemPath=!SystemPath:%%J;=!"
set "PathModified=1"
) else if not "!SystemPath:%%J\;=!" == "!SystemPath!" (
set "SystemPath=!SystemPath:%%J\;=!"
set "PathModified=1"
)
)

rem Replace all two or more ; in series by just one ; in system path.
:CleanSystem
if not "!SystemPath:;;=;!" == "!SystemPath!" set "SystemPath=!SystemPath:;;=;!" & goto CleanSystem

rem Remove the semicolon at end of system PATH if there is one.
if "!SystemPath:~-1!" == ";" set "SystemPath=!SystemPath:~0,-1!"
rem Remove a backslash at end of system PATH if there is one.
if "!SystemPath:~-1!" == "\" set "SystemPath=!SystemPath:~0,-1!"

rem Update system PATH using command SETX which requires administrator
rem privileges if the system PATH needs to be modified at all. SETX is
rem by default not installed on Windows XP and truncates string values
rem longer than 1024 characters to 1024 characters. So use alternatively
rem command REG to add system PATH if command SETX cannot be used or is
rem not available at all.
if %PathModified% == 1 (
set "UseSetx=1"
if not "!SystemPath:~1024,1!" == "" set "UseSetx="
if not exist %SystemRoot%\System32\setx.exe set "UseSetx="
if defined UseSetx (
%SystemRoot%\System32\setx.exe Path "!SystemPath!" /M >nul
) else (
set "ValueType=REG_EXPAND_SZ"
if "!SystemPath:%%=!" == "!SystemPath!" set "ValueType=REG_SZ"
%SystemRoot%\System32\reg.exe ADD "HKLM\System\CurrentControlSet\Control\Session Manager\Environment" /f /v Path /t !ValueType! /d "!SystemPath!" >nul
)
)
endlocal

:UserPath
rem Get directly from Windows registry the user PATH variable value.
for /F "skip=2 tokens=1,2*" %%G in ('%SystemRoot%\System32\reg.exe query "HKCU\Environment" /v "Path" 2^>nul') do (
if /I "%%G" == "Path" (
set "UserPath=%%I"
if defined UserPath goto CheckUserPath
rem User PATH exists, but with no value, delete user PATH.
goto DeleteUserPath
)
)
rem This PATH variable does often not exist and therefore nothing to do here.
goto PathUpdateDone

:CheckUserPath
setlocal EnableDelayedExpansion
rem Does the user PATH not end with a semicolon, append one temporarily.
if not "!UserPath:~-1!" == ";" set "UserPath=!UserPath!;"

rem Check case-insensitive for the folder paths to remove as defined at top
rem of this batch script and remove them if indeed found in user PATH.
set "PathModified=0"
for /F "tokens=1* delims==" %%I in ('set PathToRemove') do (
if not "!UserPath:%%J;=!" == "!UserPath!" (
set "UserPath=!UserPath:%%J;=!"
set "PathModified=1"
if not defined UserPath goto DeleteUserPath
) else if not "!UserPath:%%J\;=!" == "!UserPath!" (
set "UserPath=!UserPath:%%J\;=!"
set "PathModified=1"
if not defined UserPath goto DeleteUserPath
)
)

rem Replace all two or more ; in series by just one ; in user path.
:CleanUser
if not "!UserPath:;;=;!" == "!UserPath!" set "UserPath=!UserPath:;;=;!" & goto CleanUser

rem Remove the semicolon at end of user PATH if there is one.
if "!UserPath:~-1!" == ";" set "UserPath=!UserPath:~0,-1!"
if not defined UserPath goto DeleteUserPath

rem Update user PATH using command SETX which does not require administrator
rem privileges if the user PATH needs to be modified at all. SETX is
rem by default not installed on Windows XP and truncates string values
rem longer than 1024 characters to 1024 characters. So use alternatively
rem command REG to add user PATH if command SETX cannot be used or is
rem not available at all.
if %PathModified% == 1 (
set "UseSetx=1"
if not "!UserPath:~1024,1!" == "" set "UseSetx="
if not exist %SystemRoot%\System32\setx.exe set "UseSetx="
if defined UseSetx (
%SystemRoot%\System32\setx.exe Path "!UserPath!" /M >nul
) else (
set "ValueType=REG_EXPAND_SZ"
if "!UserPath:%%=!" == "!UserPath!" set "ValueType=REG_SZ"
%SystemRoot%\System32\reg.exe ADD "HKCU\Environment" /f /v Path /t !ValueType! /d "!UserPath!" >nul
)
)
goto PathUpdateDone

:DeleteUserPath
rem Delete the user PATH as it contains only folder paths to remove.
%SystemRoot%\System32\reg.exe delete "HKCU\Environment" /v "Path" /f >nul

:PathUpdateDone
rem Other code could be inserted here.
endlocal
endlocal

上面的批处理代码使用简单的不区分大小写的字符串替换和区分大小写的字符串比较来检查要删除的当前路径是否存在于用户或系统PATH中。仅当众所周知文件夹路径之前是如何添加的并且用户在此期间没有修改它们时,此方法才有效。有关检查 PATH 是否包含文件夹路径的更安全方法,请参阅 How to check if directory exists in %PATH%? 编写的 dbenham 上的答案。

注意:此批处理代码并非旨在处理系统用户 PATH 的非常罕见的用例> 包含一个文件夹路径,路径字符串中包含一个或多个分号,并用双引号引起来获取 ; 由 Windows 将双引号文件夹路径字符串中的解释为文字字符,而不是文件夹路径之间的分隔符。

要了解所使用的命令及其工作原理,请打开 command prompt 窗口,在其中执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。

  • 回显/?
  • endlocal/?
  • 对于/?
  • 转到/?
  • 如果/?
  • reg/?
  • reg 添加/?
  • reg 删除/?
  • reg 查询/?
  • 雷姆/?
  • 设置/?
  • setlocal/?
  • setx/?

另请参阅 Microsoft 关于 Using command redirection operators 的文章,了解 >nul2>nul 的说明,其中重定向运算符 > 使用 进行转义^ 在执行 reg.exe 时使用重定向,而不是将 2>nul 解释为命令 FOR 的错误位置,这会导致由于语法错误,Windows 命令处理器退出批处理。

关于batch-file - 如何使用 .bat 文件从 PATH 环境变量中删除特定标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38656375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com