无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 331|回复: 22
打印 上一主题 下一主题

[求助] 批处理命令修改指定的内容

[复制链接]
跳转到指定楼层
1#
发表于 前天 22:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

已知001.bat和002.bat位于同一个目录

我想运行001.bat自动把002.bat里面的“%SYSDRV%”修改为“E”

恳请大侠写一个001.bat

不胜感激!谢谢了!!!


2#
发表于 前天 22:42 | 只看该作者
本帖最后由 wangyibin 于 2024-11-21 13:25 编辑

方法一 (更新)
以下是一个简单的 001.bat 脚本,它会自动将 002.bat 文件中的 %SYSDRV% 替换为 E:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "target_file=002.bat"
  4. set "temp_file=002.tmp"

  5. REM 创建备份文件
  6. copy "%target_file%" "002.bak" >nul

  7. REM 创建临时文件并逐行替换
  8. (for /f "delims=" %%i in ('type "%target_file%"') do (
  9.     set "line=%%i"
  10.     set "line=!line:%%SysDrv%%=E!"
  11.     echo !line!
  12. )) > "%temp_file%"

  13. REM 用替换后的内容覆盖原文件
  14. move /y "%temp_file%" "%target_file%" >nul

  15. echo 替换完成.
  16. pause
复制代码
请将这个脚本 使用ANSI编码 保存为 001.bat 并将其与 002.bat 放在同一个目录下,然后运行 001.bat。这个脚本会创建一个临时文件来保存修改后的内容,然后备份原来的 002.bat 为002.bak 文件并将临时文件重命名为 002.bat。这样就能实现自动替换 %SYSDRV% 为 E 的功能。


方法二(推荐)使用文本编辑器
打开002.bat文件:用你喜欢的文本编辑器打开这个批处理文件,例如Notepad++、VS Code或Windows自带的记事本。
查找和替换:
在编辑器中,按 Ctrl+H 或找到“替换”选项。
在“查找内容”框中输入 %SYSDRV%。
在“替换为”框中输入 E。
确保“区分大小写”和“正则表达式”选项未勾选(除非你需要这些选项)。
点击“全部替换”或“替换所有”来替换所有匹配项。
保存文件:完成替换后,保存文件。


方法三 使用命令行工具(适用于Windows)(完美适配)
可以使用powershell的命令行工具来进行替换
运行 powershell 通过 cd 命令进入 002.bat 文件的文件夹 再运行下面命令
  1. Copy-Item -Path "002.bat" -Destination "002.bak"; (Get-Content -Path "002.bat") | ForEach-Object { $_ -replace '%SYSDRV%', 'E' } | Set-Content -Path "002.bat"
复制代码
这个命令首先执行Copy-Item命令来备份文件,然后使用分号(;)来分隔两个命令,之后进行文件内容的读取和替换操作。

点评

非常感谢坛友的热心回复!由于是在PE环境调用批处理文件执行自动化操作,绝大部分PE又没有集成powershell组件,因此只能寻求BAT命令解决。 根据您的回复进行修正,已经不会吃掉002.bat中的"!",但是存在以下缺陷:  详情 回复 发表于 昨天 11:09
源文件中有!符号时 会被清除掉 怎么优化下脚本不清除!  详情 回复 发表于 昨天 01:41
助人为乐  详情 回复 发表于 前天 22:47

评分

参与人数 1无忧币 +3 收起 理由
yyz2191958 + 3

查看全部评分

回复

使用道具 举报

3#
发表于 前天 22:47 | 只看该作者
wangyibin 发表于 2024-11-20 22:42
以下是一个简单的 001.bat 脚本,它会自动将 002.bat 文件中的 %SYSDRV% 替换为 E:

助人为乐
回复

使用道具 举报

4#
发表于 昨天 00:50 | 只看该作者
学习了 应该不要删除原文件  只用对原文件重命名做个备份比较好

点评

好建议  发表于 昨天 01:19
回复

使用道具 举报

5#
发表于 昨天 01:41 | 只看该作者
本帖最后由 1G空间100元 于 2024-11-21 01:52 编辑
wangyibin 发表于 2024-11-20 22:42
以下是一个简单的 001.bat 脚本,它会自动将 002.bat 文件中的 %SYSDRV% 替换为 E:

源文件中有!符号时 会被清除掉 比如<!--这样的,会被清理掉!符号,怎么优化下脚本不清除!符号

点评

已经优化  发表于 昨天 02:47
回复

使用道具 举报

6#
发表于 昨天 04:10 | 只看该作者
谢谢2楼分享
回复

使用道具 举报

7#
 楼主| 发表于 昨天 11:09 | 只看该作者
本帖最后由 香国妙手 于 2024-11-21 11:12 编辑
wangyibin 发表于 2024-11-20 22:42
方法一 (废弃)
以下是一个简单的 001.bat 脚本,它会自动将 002.bat 文件中的 %SYSDRV% 替换为 E:
请 ...

非常感谢坛友的热心回复!由于是在PE环境调用批处理文件执行自动化操作,绝大部分PE又没有集成powershell组件,因此只能寻求BAT命令解决。
根据您的脚本进行修正,已经不会吃掉002.bat中的"!",但是存在以下缺陷:

如果"%SysDrv%"前面没有空格就可以替换,
比如applydir:E:\%SysDrv%就成功替换。

如果"%SysDrv%"前面有空格就不能替换,
比如“Format %SysDrv%: ”就没有替换。

请高手帮我优化一下,解决出现空格就不能替换的问题。谢谢!

@echo off
setlocal DisableDelayedExpansion

REM 定义要查找和替换的字符串
set "search=%%SysDrv%%"
set "replace=E"

REM 创建一个临时文件
set "tempFile=002_temp.bat"

REM 读取002.bat内容并替换字符串
for /f "usebackq delims=" %%a in ("002.bat") do (
    set "line=%%a"

    REM 仅在当前行包含要查找的字符串时才进行替换操作
    echo %%a|findstr /c:"%search%" >nul
    if not errorlevel 1 (
        setlocal EnableDelayedExpansion
        set "line=!line:%search%=%replace%!"
        echo.!line!>>"%tempFile%"
        endlocal
    ) else (
        echo %%a>>"%tempFile%"
    )
)

del /s /q 002.bat

REM 重命名临时文件为002.bat
ren "%tempFile%" "002.bat"

endlocal

点评

好人  详情 回复 发表于 昨天 12:55
要想完美适配 提供 002.bat代码来测试  详情 回复 发表于 昨天 12:09
方法二 最适用 而且不用代码 查找替换  发表于 昨天 11:58

评分

参与人数 1无忧币 +3 收起 理由
yyz2191958 + 3

查看全部评分

回复

使用道具 举报

8#
发表于 昨天 12:09 | 只看该作者
香国妙手 发表于 2024-11-21 11:09
非常感谢坛友的热心回复!由于是在PE环境调用批处理文件执行自动化操作,绝大部分PE又没有集成powershell ...

要想完美适配 提供 002.bat代码来测试

点评

002.bat(非完整代码,但不影响测试) @echo off wmic LogicalDisk where "DeviceID='%SysDrv%:'" assoc:value /resultclass:Win32_DiskPartition Format %SysDrv%: /q /x /y >nul 只要这两处能成功替换,那  详情 回复 发表于 昨天 12:41
回复

使用道具 举报

9#
 楼主| 发表于 昨天 12:41 | 只看该作者
wangyibin 发表于 2024-11-21 12:09
要想完美适配 提供 002.bat代码来测试

002.bat(非完整代码,但不影响测试)

@echo off
wmic LogicalDisk where "DeviceID='%SysDrv%:'" assoc:value /resultclass:Win32_DiskPartition
Format %SysDrv%: /q /x /y >nul

只要这两处能成功替换,那就OK

点评

已更新  发表于 昨天 13:26
回复

使用道具 举报

10#
发表于 昨天 12:55 | 只看该作者
香国妙手 发表于 2024-11-21 11:09
非常感谢坛友的热心回复!由于是在PE环境调用批处理文件执行自动化操作,绝大部分PE又没有集成powershell ...

好人
回复

使用道具 举报

11#
发表于 昨天 13:36 | 只看该作者
001里写set SysDrv=E,然后直接调用002
002里改成 wmic LogicalDisk where DeviceID='%SysDrv%:' assoc:value /resultclass:Win32_DiskPartition

点评

wmic命令在有些PE中没有 另外WIN2025已经没有wmic命令了  详情 回复 发表于 昨天 16:55
能直接改002就把%SysDrv%查找替换成E 还要001干什么  详情 回复 发表于 昨天 15:36
回复

使用道具 举报

12#
发表于 昨天 15:36 | 只看该作者
szwp 发表于 2024-11-21 13:36
001里写set SysDrv=E,然后直接调用002
002里改成 wmic LogicalDisk where DeviceID='%SysDrv%:' assoc:va ...

能直接改002就把%SysDrv%查找替换成E 还要001干什么

点评

改001只需改一处,也可以是用户在001里选择了E,再给sysdrv变量  详情 回复 发表于 昨天 15:58
回复

使用道具 举报

13#
发表于 昨天 15:58 来自手机 | 只看该作者
直接参数调用不行吗?何必这么费劲

call或start 002.bat E:
回复

使用道具 举报

14#
发表于 昨天 15:58 | 只看该作者
wangyibin 发表于 2024-11-21 15:36
能直接改002就把%SysDrv%查找替换成E 还要001干什么

改001只需改一处,也可以是用户在001里选择了E,再给sysdrv变量
回复

使用道具 举报

15#
发表于 昨天 16:55 | 只看该作者
szwp 发表于 2024-11-21 13:36
001里写set SysDrv=E,然后直接调用002
002里改成 wmic LogicalDisk where DeviceID='%SysDrv%:' assoc:va ...

wmic命令在有些PE中没有 另外WIN2025已经没有wmic命令了

点评

楼主没说pe和2025吧  详情 回复 发表于 昨天 17:56
回复

使用道具 举报

16#
发表于 昨天 17:01 | 只看该作者
长见识了。
回复

使用道具 举报

17#
发表于 昨天 17:56 | 只看该作者
1G空间100元 发表于 2024-11-21 16:55
wmic命令在有些PE中没有 另外WIN2025已经没有wmic命令了

楼主没说pe和2025吧

点评

香国妙手 在7楼有说明 是在PE环境调用批处理文件执行自动化操作 就算不是在PE或Win2025中执行脚本 那也是需要考虑脚本的通用性 你说呢  详情 回复 发表于 2 小时前
回复

使用道具 举报

18#
发表于 2 小时前 | 只看该作者
szwp 发表于 2024-11-21 17:56
楼主没说pe和2025吧

香国妙手 在7楼有说明 是在PE环境调用批处理文件执行自动化操作
就算不是在PE或Win2025中执行脚本 那也是需要考虑脚本的通用性
你说呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-22 03:46

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表