找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 15498|回复: 1

[问题求助] [已解决]请教powershell提取文本指定字符再替换

[复制链接]
发表于 2020-12-5 15:03:41 | 显示全部楼层 |阅读模式
本帖最后由 smss 于 2020-12-8 13:17 编辑

文本A
  1. # Enable automatic restart after Windows Update installation
  2. Function EnableUpdateRestart {
  3.         Write-Output "Enabling Windows Update automatic restart..."
  4.         Remove-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\MusNotification.exe" -Name "Debugger" -ErrorAction SilentlyContinue
  5. }
  6. # Disable nightly wake-up for Automatic Maintenance and Windows Updates
  7. Function DisableMaintenanceWakeUp {
  8.         Write-Output "Disabling nightly wake-up for Automatic Maintenance..."
  9.         If (!(Test-Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU")) {
  10.                 New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Force | Out-Null
  11.         }
  12.         Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "AUPowerManagement" -Type DWord -Value 0
  13.         Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\Maintenance" -Name "WakeUp" -Type DWord -Value 0
  14. }
  15. #不多还有500条BUG...
复制代码
提取Write-Output "之间的字符" 我的方法不好 正则表达式太难了
生成文本B
  1. powershell "(Gc A.txt) -match 'Write-Output "(.+?)"'>B.txt;"
复制代码
  1. powershell "if(((Gc A.txt) -join "`r`n") -match 'Write-Output "(.+?)"'){$matches[1]>3.txt};"
复制代码
为什么只有一条 都说ps真香好用 无奈只能用BAT

生成文本C
  1. (for /f "tokens=1,2 delims=-" %%a in (B.txt)do set n=%%b&Echo !n:~8,-1!)>C.txt
复制代码
  1. Enabling Windows Update automatic restart...
  2. Disabling nightly wake-up for Automatic Maintenance...
复制代码
翻译文本C得到文本D
  1. 正在启用Windows Update自动重启...
  2. 禁用夜间唤醒以进行自动维护...
复制代码
文本D替换掉文本A Write-Output "要翻译的部分"
发表于 2020-12-7 21:13:50 | 显示全部楼层
本帖最后由 WHY 于 2020-12-8 10:30 编辑

1.提取 a.txt 文本 Write-Output "之间的字符"到 b.txt
  1. $arr = (gc a.txt -ReadCount 0) -match 'Write-Output +"(?>[^"]+)"' | forEach {$_.Split('"')[1]};
  2. sc b.txt -Value $arr;
复制代码
2.文本 b.txt 翻译后保存到 c.txt
3.文本 c.txt 替换 a.txt 对应文字,写入 d.txt
  1. $global:n = 0;
  2. $arr = (gc c.txt -ReadCount 0) -notmatch '^\s*$';
  3. $str = (gc a.txt -ReadCount 0) -join "`r`n";
  4. $str = [regex]::Replace($str, '(?<=(?i)Write-Output +")(?>[^"]+)(?=")', {$arr[$global:n++]});
  5. sc d.txt -Value $str;
复制代码

评分

参与人数 1技术 +1 收起 理由
smss + 1 感激涕零

查看全部评分

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

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 01:37 , Processed in 0.018727 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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