Jak wyszukiwać i zamieniać ciąg w wielu plikach XML (w katalogu) za pomocą Windows CMD

-1

Czy ktoś może mi pomóc, sugerując skrypt wsadowy, aby znaleźć ciąg „utf-16” w wielu plikach xml w katalogu i zastąpić go „utf-8”. Bez użycia narzędzi Znajdź i zamień. Zastąpienie należy wykonać w samym istniejącym pliku.

użytkownik426493
źródło
@DavidPostill nie widziałeś słów utf-16 i utf-8 Pytanie może, ale nie musi, być nieco zagubione, ale nie rozwiązujesz tego, wskazując tylko to drugie pytanie
barlop
jeśli masz plik zawierający mieszankę utf-8 i niepotrzebnie utf-16, to czy plik ma pomieszany format pliku, czy na pewno masz taki plik?
barlop
@barlop Przeczytałem go jako zamień literał ciąg utf-16i zamień na utf-8. Jeśli OP chce zmienić kodowanie , nie sądzę, że jest to możliwe z cmd.
DavidPostill
1
@barlop OP poprosił o skrypt wsadowy (bez użycia narzędzi Znajdź i zamień). Nie zapytał, jak korzystać z zewnętrznych narzędzi do konwersji. AFAIK nie można tego zrobić za pomocą skryptu wsadowego bez użycia narzędzi zewnętrznych. W każdym razie nadal nie jest jasne, co OP próbuje zrobić. Proszę nie obrażaj mnie używając „pontyfikatu”, ponieważ pytanie jest niejasne ...
DavidPostill

Odpowiedzi:

1

Użyj dowolnego procesora XSLT. Na przykład msxsl.

Narzędzie do transformacji wiersza poleceń

MSXML 4.0 z dodatkiem Service Pack 2 (Microsoft XML Core Services)

zero.xsl- przekształcenie arkusza stylów test.xmlnatest2.xml

<xsl:output method="xml" encoding="UTF-8" /> przekonwertować xml na UTF-8.

Zeroxml test.xml

Zeroxml.cmd:

@echo off
@set name=%1
msxsl.exe %name% zero.xsl -o %name:~0,-4%2.xml

zero.xsl:

<!-- The Identity Transformation -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<!-- <xsl:output method="html" encoding="UTF-8" indent="yes" omit-xml-declaration="no"/> -->


<xsl:output method="html" media-type="application/vnd.ms-excel" encoding="UTF-8" indent="yes" omit-xml-declaration="no"/>

<!-- <xsl:output omit-xml-declaration="no" indent="yes" encoding="UTF-8" method="html" />  -->
<!-- <xsl:output method="xml" media-type="application/vnd.ms-excel" encoding="UTF-8" indent="yes"     omit-xml-declaration="no"/>  -->
<!-- <xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="no"/>  -->
<!-- <xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/> -->

  <!-- Whenever you match any node or any attribute -->
  <xsl:template match="node()|@*">
    <!-- Copy the current node -->
    <xsl:copy>
      <!-- Including any attributes it has and any child nodes -->
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

 <xsl:template match="*|@*|comment()|
                          processing-instruction()|text()">
         <xsl:copy>
             <xsl:apply-templates select="*|@*|comment()|
                                      processing-instruction()|text()"/>
         </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

Way2, przekonwertuj UTF-16 na wiersz poleceń UTF-8:

Unicode - kolejność bajtów little-endian w formacie UTF-16.

powershell gc test.xml -encoding Unicode^|sc testUTF8.xml -encoding UTF8

BigEndianUnicode - kolejność bajtów big-endian w formacie UTF-16.

powershell gc test.xml -encoding BigEndianUnicode^|sc testUTF8.xml -encoding UTF8

Konwertuj wszystkie pliki XML UTF-16 w katalogu SourceDirXML i podkatalogu na UTF-8

powershell $in='C:\SourceDirXML';$out='C:\OutputUTF8XML\';ls -Fo -r $in -Fi *.xml^|%{(gc $_.FullName -encoding Unicode^|sc ($out+$_.Name) -encoding UTF8)}

Wyszukaj i zamień ciąg znaków w wielu plikach xml (w katalogu) za pomocą Windows CMD:

powershell $in='C:\SourceDirXML';$out='C:\OutputUTF8XML\';ls -Fo -r $in -Fi *.xml^|%{(gc $_.FullName^|%{$_ -replace 'oldstring','newstring'}^|sc ($out+$_.Name) -encoding UTF8)}
STTR
źródło
Myślę, że cały ten kod w zero.xsl ma sprawić, że zrobi to dla wielu plików? jaki kod zrobiłby to tylko dla jednego pliku? to dużo kodu, aby zmienić dosłowny ciąg znaków z jednej rzeczy na drugą. (jeśli tego właśnie chce)
barlop
@barlop zero.xsl pokazuje transformację, która nic nie robi z tekstem. Zrób to samo dla wielu plików, wystarczy zapętlić FOR /R %%i IN (*.xml) DO. Które linie chcesz zamienić w pliku xml i gdzie?
STTR
więc cały ten kod w zero.xsl to po prostu zamiana jednego ciągu na inny?
barlop
@barlop Nie, to pusta konwersja. Gdy plik jest konwertowany na sam, ale na przykład z kodowaniem UTF-8 określonym w opcjach. Jeśli podałeś w przykładzie dokładnie to, co chcesz przekonwertować, możesz napisać konkretną konwersję ciągu. Ponieważ będzie inaczej dla elementów i atrybutów dla pełnej linii dla podłańcucha.
STTR
dzięki, powinieneś wyjaśnić, że wszystko, co nic nie robi, i określasz konwersję, powinieneś nawet podać przykład konwertowania określonego ciągu. Wtedy będzie bardziej przydatny dla ludzi. Twoja odpowiedź powinna być przydatna dla osób szukających odpowiedzi na pytanie, innych niż PO. interesująca rzecz dotyczy również PowerShell, o której tam wspominasz. miejmy nadzieję, że OP sklaryfikuje to, co chce nawrócić. Ale w międzyczasie, a nawet niezależnie, podaj bardziej przydatny przykład (taki, który działa, z którego inni mogą korzystać i dostosowywać), aby twój przykład nie był całkowicie pustą powłoką.
barlop