Board logo

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

作者: smss    时间: 2020-12-5 15:03     标题: [已解决]请教powershell提取文本指定字符再替换

本帖最后由 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 "要翻译的部分"
作者: WHY    时间: 2020-12-7 21:13

本帖最后由 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;
复制代码





欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2