Trädvy Permalänk
Medlem
Registrerad
Nov 2012

Batch och XML

Hej!
Har en XML fil med följande data:

<Databas> <Datornamn>Dator1</Datornamn> <Programvara>C:\mapp\script.bat> <Version>1</Version> </Databas>

Med hjälp av:

for /f "tokens=2delims=<> " %%i in ('type system\databas.xml ^|find "%Computername%"') do set "_datornamn=%%i"

hämtas alla dator1 värden, men om jag skulle vilja ha värdet på <Programvara> istället. Hur gör jag då? Dvs. ett WHERE utryck i det hela där den hämtar alla <Programvara> WHERE <Datornamn> = %Computername%

Tacksam för hjälp!

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Apr 2002

Din XML är inte valid då du ej har </Programvara>

Sen hur hanterar du om det finns flera datorer som har flera programvaror?

Sen bör du titta på PowerShell istället om du sitter i en windows miljö.

CPU: i7 6700k + Fractal Design S24 // GPU: EVGA GTX 980 Ti SC+ ACX 2.0+ // RAM: Kingston 16GB 2133MHz CL13 MoBo: MSI GAMING M7 // PSU: EVGA Supernova G2 850W, 80+ Gold // SSD: Samsung SM951 256GB M.2 NVMe + Samsung EVO 850 250GB M.2 // Chassi: Fractal Design S OS: W10 Pro // Skrämar: Acer XB270HU + 2x Dell U2412M
NAS: Synology DS415+ (3x WD RED 6 TB) // Konsol: Xbox One

Trädvy Permalänk
Medlem
Registrerad
Nov 2012

@Tino:
Hej Tino!

<Databas> <Datornamn>Dator1</Datornamn> <Programvara>C:\mapp\script.bat></Programvara> <Version>1</Version> </Databas>

Så ska det se ut.

När jag använder ovanstående så returneras alla värden i filen som har alla samma datornamn.
Hur kan man använda Powershell för att hämta värdena?

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Apr 2002

@erilid66

$databas = [xml] (Get-Content C:\temp\databas.xml) $databas.Databas.Programvara

Du kör detta Via Windows PowerShell. Du kan spara ovanstående kod i en .ps1 fil.

Har du en mer komplett xml fil? För jag ser inte hur det skulle gå ihop att ha flera datorer i ditt exempel. Följande stödjer flera datorer.

<Databas> <Dator> <Datornamn>Dator1</Datornamn> <Programvara>C:\mapp\script.bat</Programvara> <Version>1</Version> </Dator> <Dator> <Datornamn>Dator1</Datornamn> <Programvara>C:\mapp\script2.bat</Programvara> <Version>1</Version> </Dator> <Dator> <Datornamn>Dator2</Datornamn> <Programvara>C:\mapp\script.bat</Programvara> <Version>1</Version> </Dator> </Databas>

$databas = [xml] (Get-Content C:\temp\databas2.xml) $databas.Databas.Dator | select -ExpandProperty Programvara

För att filtrera ut dator1

$databas.Databas.Dator | where { $_.Datornamn -eq "Dator1" } | select -ExpandProperty Programvara

Eller om du istället vill filtrea på nuvarande dator

$databas.Databas.Dator | where { $_.Datornamn -eq $env:COMPUTERNAME } | select -ExpandProperty Programvara

CPU: i7 6700k + Fractal Design S24 // GPU: EVGA GTX 980 Ti SC+ ACX 2.0+ // RAM: Kingston 16GB 2133MHz CL13 MoBo: MSI GAMING M7 // PSU: EVGA Supernova G2 850W, 80+ Gold // SSD: Samsung SM951 256GB M.2 NVMe + Samsung EVO 850 250GB M.2 // Chassi: Fractal Design S OS: W10 Pro // Skrämar: Acer XB270HU + 2x Dell U2412M
NAS: Synology DS415+ (3x WD RED 6 TB) // Konsol: Xbox One

Trädvy Permalänk
Medlem
Registrerad
Nov 2012

@Tino:

<Databas> <Dator> <Datornamn>Dator1</Datornamn> <Programvara>C:\mapp\script.bat</Programvara> <Version>1</Version> </Dator> <Dator> <Datornamn>Dator1</Datornamn> <Programvara>C:\mapp\script2.bat</Programvara> <Version>1</Version> </Dator> <Dator> <Datornamn>Dator2</Datornamn> <Programvara>C:\mapp\script.bat</Programvara> <Version>1</Version> </Dator> </Databas>

Precis det ser ut så!

Ska jag kombinera:

$databas = [xml] (Get-Content C:\temp\databas2.xml) $databas.Databas.Dator | where { $_.Datornamn -eq $env:COMPUTERNAME } | select -ExpandProperty Programvara

För att få resultatet:
C:\mapp\script.bat
C:\mapp\script2.bat

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Apr 2002
Skrivet av erilid66:

Ska jag kombinera:

$databas = [xml] (Get-Content C:\temp\databas2.xml) $databas.Databas.Dator | where { $_.Datornamn -eq $env:COMPUTERNAME } | select -ExpandProperty Programvara

För att få resultatet:
C:\mapp\script.bat
C:\mapp\script2.bat

Ja om din dator heter Dator1 så skall du få ut det resultatet. Samt att den förväntar sig att xmlfilen ligger under C:\temp\databas2.xml

CPU: i7 6700k + Fractal Design S24 // GPU: EVGA GTX 980 Ti SC+ ACX 2.0+ // RAM: Kingston 16GB 2133MHz CL13 MoBo: MSI GAMING M7 // PSU: EVGA Supernova G2 850W, 80+ Gold // SSD: Samsung SM951 256GB M.2 NVMe + Samsung EVO 850 250GB M.2 // Chassi: Fractal Design S OS: W10 Pro // Skrämar: Acer XB270HU + 2x Dell U2412M
NAS: Synology DS415+ (3x WD RED 6 TB) // Konsol: Xbox One

Trädvy Permalänk
Medlem
Registrerad
Nov 2012

@Tino:
Har kollat så att sökvägen är rätt och datorn heter dator1.
om jag använder ovanstående får jag svaret:
PS P:\> C:\Users\erilid66\Desktop\test.ps1

___________________________________________________________________________________

Använde Powershell ISE.
Om jag använder powershell så blir det bara en ny rad.

Otroligt tacksam för din hjälp!

Trädvy Permalänk
Medlem
Plats
Norrland
Registrerad
Feb 2004

@erilid66:

Kan det vara Case Sensitive kanske?
Nu har jag absolut ingen koll på Powershell men en vild chansning är att det är Case Sensitive, alltså om din dator heter "dator1" så hittar den inget.
Heter den däremot "Dator1" så kommer den säkert hitta något.

Kan ha helt fel också, då får någon rätta mig.

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Apr 2002

@Buruz Powershell är ej Case Sensitive.

@erilid66 vad får du om du skriver $env:COMPUTERNAME i PowerShell? detta skall matcha det som du har i Datornamn. För mig fungerar det hela när jag uppdaterar xml filen så den innehåller mitt datornamn.

PS C:\Windows\system32> $env:COMPUTERNAME TINO-PC PS C:\Windows\system32> C:\Temp\test.ps1 C:\mapp\script.bat C:\mapp\script2.bat PS C:\Windows\system32>

XML:

<Databas> <Dator> <Datornamn>Tino-PC</Datornamn> <Programvara>C:\mapp\script.bat</Programvara> <Version>1</Version> </Dator> <Dator> <Datornamn>Tino-PC</Datornamn> <Programvara>C:\mapp\script2.bat</Programvara> <Version>1</Version> </Dator> <Dator> <Datornamn>Dator2</Datornamn> <Programvara>C:\mapp\script.bat</Programvara> <Version>1</Version> </Dator> </Databas>

CPU: i7 6700k + Fractal Design S24 // GPU: EVGA GTX 980 Ti SC+ ACX 2.0+ // RAM: Kingston 16GB 2133MHz CL13 MoBo: MSI GAMING M7 // PSU: EVGA Supernova G2 850W, 80+ Gold // SSD: Samsung SM951 256GB M.2 NVMe + Samsung EVO 850 250GB M.2 // Chassi: Fractal Design S OS: W10 Pro // Skrämar: Acer XB270HU + 2x Dell U2412M
NAS: Synology DS415+ (3x WD RED 6 TB) // Konsol: Xbox One

Trädvy Permalänk
Medlem
Registrerad
Nov 2012
Skrivet av Tino:

@Buruz Powershell är ej Case Sensitive.

@erilid66 vad får du om du skriver $env:COMPUTERNAME i PowerShell? detta skall matcha det som du har i Datornamn. För mig fungerar det hela när jag uppdaterar xml filen så den innehåller mitt datornamn.

PS C:\Windows\system32> $env:COMPUTERNAME TINO-PC PS C:\Windows\system32> C:\Temp\test.ps1 C:\mapp\script.bat C:\mapp\script2.bat PS C:\Windows\system32>

XML:

<Databas> <Dator> <Datornamn>Tino-PC</Datornamn> <Programvara>C:\mapp\script.bat</Programvara> <Version>1</Version> </Dator> <Dator> <Datornamn>Tino-PC</Datornamn> <Programvara>C:\mapp\script2.bat</Programvara> <Version>1</Version> </Dator> <Dator> <Datornamn>Dator2</Datornamn> <Programvara>C:\mapp\script.bat</Programvara> <Version>1</Version> </Dator> </Databas>

Nu har jag fått det att fungera, datorn som jag testade på hade inaktiverat powershell script! Om jag nu vill köra scriptena med en wait när det första scriptet kört klart så startas det andra osv, hur gör jag då? Går det att köra i cmd och hämta sökvägarna ifrån powershell.

Skickades från m.sweclockers.com

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Apr 2002

@erilid66 Invoke-Expression är det du söker.

Så det är nu dags för dig att börja sätta dig in i PowerShell.
Jag har visat dig vägen det nu är dags för dig att vandra den

CPU: i7 6700k + Fractal Design S24 // GPU: EVGA GTX 980 Ti SC+ ACX 2.0+ // RAM: Kingston 16GB 2133MHz CL13 MoBo: MSI GAMING M7 // PSU: EVGA Supernova G2 850W, 80+ Gold // SSD: Samsung SM951 256GB M.2 NVMe + Samsung EVO 850 250GB M.2 // Chassi: Fractal Design S OS: W10 Pro // Skrämar: Acer XB270HU + 2x Dell U2412M
NAS: Synology DS415+ (3x WD RED 6 TB) // Konsol: Xbox One