Permalänk
Medlem

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!

Permalänk
Medlem

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ö.

Permalänk
Medlem

@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?

Permalänk
Medlem

@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

Permalänk
Medlem

@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

Permalänk
Medlem
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

Permalänk
Medlem

@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!

Permalänk
Medlem

@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.

Permalänk
Medlem

@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>

Permalänk
Medlem
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

Permalänk
Medlem

@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