簡體   English   中英

Windows批處理文件用新字符串替換第n行或提取第n行並在變量中存儲字符串

[英]Windows batch file to replace nth line with new string or extract nth line and store string in variable

請幫我構建一個Windows批處理文件來替換文件的第n行。 或者,或者提取第n行並將其存儲在變量中。 這將用於自動安裝Mozilla擴展。

我知道如何在Linux中使用SED執行此操作,但我缺乏用於字符串操作的批處理技能。

例如,我使用此批處理腳本為Microsoft Windows機器安裝Mozilla Thunderbird Enigmail擴展:

if %PROCESSOR_ARCHITECTURE% equ x86 (
  set SOFTWARE=SOFTWARE
  set PROGRAMFILES=C:\Program Files       
) else (
  set SOFTWARE=SOFTWARE\Wow6432Node
  set PROGRAMFILES=C:\Program Files ^(x86^)
)
wget --no-check-certificate https://addons.mozilla.org/en-US/thunderbird/downloads/file/219050/enigmail-1.5.2-tb+sm.xpi -O %TEMP%\enigmail.xpi
mkdir "%PROGRAMFILES%\Mozilla Thunderbird\extensions\enigmail"
unzip -o %TEMP%\enigmail.xpi -d "%PROGRAMFILES%\Mozilla Thunderbird\extensions\enigmail"
reg add HKLM\%SOFTWARE%\Mozilla\Thunderbird\Extensions /v enigmail@example.com ^
  /t REG_SZ /d "%PROGRAMFILES%\Mozilla Thunderbird\extensions\enigmail" /f

我遇到的問題是我需要使用匹配的注冊表項更新Mozilla擴展的%PROGRAMFILES%\\ Mozilla Thunderbird \\ extensions \\ enigmail \\ install.rdf清單以獲取要安裝的擴展。 以下安裝清單包含多個Mozilla ID(例如, <em:id>{GUID}</em:id> )。

<?xml version="1.0"?>

<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
     xmlns:em="http://www.mozilla.org/2004/em-rdf#">

  <Description about="urn:mozilla:install-manifest">
    <em:id>{daf44bf7-a45e-4450-979c-91cf07434c3d}</em:id>
    <em:version>1.0</em:version>
    <em:type>2</em:type>

    <!-- Target Application this extension can install into, 
         with minimum and maximum supported versions. --> 
    <em:targetApplication>
      <Description>
        <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
        <em:minVersion>1.5</em:minVersion>
        <em:maxVersion>4.0.*</em:maxVersion>
      </Description>
    </em:targetApplication>

    <!-- Front End MetaData -->
    <em:name>sample</em:name>
    <em:description>A test extension</em:description>
    <em:creator>Your Name Here</em:creator>
    <em:homepageURL>http://www.example.com/</em:homepageURL>
  </Description>      
</RDF>

我需要用<em:id>enigmail@example.com</em:id>替換此install.rdf的第一個<em:id> <em:id>enigmail@example.com</em:id> 或者,或者我需要通過刪除周圍的“ <em:id></em:id> ”並將ID與大括號一起存儲來提取第一個GUID“{daf44bf7-a45e-4450-979c-91cf07434c3d}”在%GUID%變量中,並使用該變量作為注冊表項的名稱(例如,reg add HKLM \\ SOFTWARE \\ Wow6432Node \\ Mozilla \\ Thunderbird \\ Extensions / v%GUID%)。

有關詳細信息,請參閱https://developer.mozilla.org/en-US/docs/Adding_Extensions_using_the_Windows_Registryhttps://developer.mozilla.org/en-US/docs/Building_an_Extension#Create_the_install_manifest

替換或提取GUID的解決方案將滿足我的需求。 它只取決於是否更容易從install.rdf清單中提取第一個GUID,去除周圍的<em:id></em:id>並將此{GUID}存儲在%GUID%變量中,或者替換帶有<em:id>enigmail@example.com</em:id> ID格式的第一個GUID。

針對Windows的sed解決方案,針對第7行:

sed  -i.bak "7 s#.*#<em:id>enigmail@example.com</em:id>#" file.html

對於模式<em:id>{daf44bf7-a45e-4450-979c-91cf07434c3d}</em:id>

sed  -i.bak "7 s#<em:id>{daf44bf7-a45e-4450-979c-91cf07434c3d}</em:id>#<em:id>enigmail@example.com</em:id>#" file.html

編輯 :我修改了下面的批處理程序,以顯示兩個解決方案作為單獨的方法:

@echo off
setlocal DisableDelayedExpansion

rem Extract GUID part of 7th line and use it in the registry key
for /F "skip=6 tokens=1* delims=:" %%a in ('findstr /N "^" install.rdf') do set "line7=%%b" & goto continue
:continue
set "GUID=%line7:*>=%"
set "GUID=%GUID:~0,-8%"
ECHO reg add HKLM\SOFTWARE\Wow6432Node\Mozilla\Thunderbird\Extensions /v %GUID%

rem Replace 7th line
(for /F "tokens=1* delims=:" %%a in ('findstr /N "^" install.rdf') do (
   if "%%a" neq "7" (
      echo(%%b
   ) else (
      echo     ^<em:id^>enigmail@example.com^</em:id^>
   )
)) > install.tmp
move /Y install.tmp install.rdf > NUL

例如:

> test
reg add HKLM\SOFTWARE\Wow6432Node\Mozilla\Thunderbird\Extensions /v {daf44bf7-a45e-4450-979c-91cf07434c3d}

> type install.rdf
<?xml version="1.0"?>

<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
     xmlns:em="http://www.mozilla.org/2004/em-rdf#">

  <Description about="urn:mozilla:install-manifest">
    <em:id>enigmail@example.com</em:id>
    <em:version>1.0</em:version>
    <em:type>2</em:type>

    <!-- Target Application this extension can install into,
         with minimum and maximum supported versions. -->
    <em:targetApplication>
      <Description>
        <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
        <em:minVersion>1.5</em:minVersion>
        <em:maxVersion>4.0.*</em:maxVersion>
      </Description>
    </em:targetApplication>

    <!-- Front End MetaData -->
    <em:name>sample</em:name>
    <em:description>A test extension</em:description>
    <em:creator>Your Name Here</em:creator>
    <em:homepageURL>http://www.example.com/</em:homepageURL>
  </Description>
</RDF>
@ECHO OFF
SETLOCAL
SET "guid="
FOR /f "tokens=2delims=<> " %%i IN ('find/i "<em:id>" ^<q19063900.rdf') DO SET guid=%%i&GOTO useguid
:useguid
ECHO guid found=%guid%
GOTO :EOF

這應該從包含<en:id>的第一行中提取GUID字符串。

然后可以按照您的建議在批次中使用%guid% 顯然,如果批次通過FOR ,則不會設置%guid%這意味着找不到<em:id>

q19063900.rdf是源.rdf文件的名稱)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM