Powershell script trigga cmd sql select och loop

Permalänk
Medlem

Powershell script trigga cmd sql select och loop

Hej, försökte få in det jag vill ha hjälp med i powershell, jag har kört fast lite med en förbättring jag håller på med, mitt mål just nu är att

1. Använda 2 read-host variabel för att trigga en cmd fil med rätt parametrar som gör massor med grejer. (Fungerar men inte som jag vill)
2. Efter att del 1 är körd ska en select göras ur en datorbas för att visa att det blev rätt version. (select fugnerar 100%)

Nu kommer mitt problem, jag vet inte hur jag ska gå vidare med loop eller byta variabel eller bestpractice, ska försöka förklara scenariot.

Det finns x antal mappar vi säger 10, i varje av dessa 10 ligger en hel del filer men en cmd fil som ska köras i varje mapp (i en viss ordning med. Ex mapp 191 först, sedan 192, 193 osv. Efter att en CMD fil har kört ska selecten göras och sedan ska jag få frågan om den ska gå vidare. Här är jag helt lost, ska man använda någon get-childitem och köra -start procees i typ en foreach?

Just nu är scriptet simpelt, (skippar sqln då den fungerar som den ska)

Det som är nu är;

$ServerName = Read-Host 'Skriv servername'
$DatabaseName = Read-host "Skriv databasnamn"
$rorpath1 = Read-Host 'Skriv ror'

Start-Process -NoNewWindow -FilePath "D:\Auto\RORds_Upgrades\Upgrades\$rorpath1" -ArgumentList "$ServerName","$DatabaseName"

Detta fungerar, MEN problemet här är ju att $rorpath1 inte stämmer mer än för första körningen, sedan är ju det en annan mapp, hur ska jag gå tillväga för att loopa detta rätt?

Ber om ursäkt om det är rörigt, jag har googlat till förtvivelse men inte hittat svaret på det jag söker, och nej det går inte att ta bort cmd filerna de måste vara så.

Visa signatur

Chassi: Fractal design Define C Mobo: aorus x570 elite
Cpu Ryzen 3600 Kylare noctua nh-d15Gpu 7900XT Ram g.skill flare x black
Kingston a2000 1TB 2x PSU: EVGA SuperNova 850 G2

Permalänk
Medlem

Skitkass på powershell men kan du inte bara göra typ såhär, om jag förstår dig rätt.

$ServerName = (Read-Host "Server name?") $DatabaseName = (Read-Host "Database name?") Do { $rorpath = (Read-Host "Folder name?") Start-Process -NoNewWindow -FilePath "D:\Auto\RORds_Upgrades\Upgrades\$rorpath1" -ArgumentList "$ServerName","$DatabaseName" } While($rorpath)

Om du inte vill skriva mapparna själv och vill att den ska ta alla mappar därifrån du kör skriptet så kanske nått sånt här

$ServerName = (Read-Host "Server name?") $DatabaseName = (Read-Host "Database name?") get-childitem -Directory | ForEach-Object { Start-Process -NoNewWindow -FilePath "D:\Auto\RORds_Upgrades\Upgrades\${$_.Name}" -ArgumentList "$ServerName", "$DatabaseName" }

Permalänk
Medlem
Skrivet av Xenofonus:

Skitkass på powershell men kan du inte bara göra typ såhär, om jag förstår dig rätt.

$ServerName = (Read-Host "Server name?") $DatabaseName = (Read-Host "Database name?") Do { $rorpath = (Read-Host "Folder name?") Start-Process -NoNewWindow -FilePath "D:\Auto\RORds_Upgrades\Upgrades\$rorpath1" -ArgumentList "$ServerName","$DatabaseName" } While($rorpath)

Om du inte vill skriva mapparna själv och vill att den ska ta alla mappar därifrån du kör skriptet så kanske nått sånt här

$ServerName = (Read-Host "Server name?") $DatabaseName = (Read-Host "Database name?") get-childitem -Directory | ForEach-Object { Start-Process -NoNewWindow -FilePath "D:\Auto\RORds_Upgrades\Upgrades\${$_.Name}" -ArgumentList "$ServerName", "$DatabaseName" }

Tack för svar, känns som det kan vara något i rätt riktning, tack!

Visa signatur

Chassi: Fractal design Define C Mobo: aorus x570 elite
Cpu Ryzen 3600 Kylare noctua nh-d15Gpu 7900XT Ram g.skill flare x black
Kingston a2000 1TB 2x PSU: EVGA SuperNova 850 G2

Permalänk
Medlem

Har nu fått det att fungera så jag bara kan skriva i promopten så allting går, nu är frågan hur jag får det att lira med get-child item så jag slipper skriva för varje mapp.

Visa signatur

Chassi: Fractal design Define C Mobo: aorus x570 elite
Cpu Ryzen 3600 Kylare noctua nh-d15Gpu 7900XT Ram g.skill flare x black
Kingston a2000 1TB 2x PSU: EVGA SuperNova 850 G2

Permalänk
Medlem
Skrivet av NatureBoyyy:

Har nu fått det att fungera så jag bara kan skriva i promopten så allting går, nu är frågan hur jag får det att lira med get-child item så jag slipper skriva för varje mapp.

Såg du mitt andra exempel? Det hjälper dig inte?

Permalänk
Medlem
Skrivet av Xenofonus:

Såg du mitt andra exempel? Det hjälper dig inte?

Fick det inte att lira, men jag byggde vidare på det och egentligen är det bättre att köra med att skriva i varje gång då får man mer kontroll! Tack för hjälpen, såhär blev det och fungerar som det ska

$ServerName = (Read-Host "Server name?")
$DatabaseName = (Read-Host "Database name?")

Do {
$rorpath = (Read-Host "Folder name?")

Start-Process -NoNewWindow -FilePath "D:\Auto\RORds_Upgrades\Upgrades\$rorpath\RORd_$rorpath.cmd" -ArgumentList "$ServerName","$DatabaseName"

} While($rorpath)

Nu ska jag bara också få in att göra en sql select efter varje körning, några förslag på att få in det

Visa signatur

Chassi: Fractal design Define C Mobo: aorus x570 elite
Cpu Ryzen 3600 Kylare noctua nh-d15Gpu 7900XT Ram g.skill flare x black
Kingston a2000 1TB 2x PSU: EVGA SuperNova 850 G2

Permalänk
Medlem
Skrivet av NatureBoyyy:

Fick det inte att lira, men jag byggde vidare på det och egentligen är det bättre att köra med att skriva i varje gång då får man mer kontroll! Tack för hjälpen, såhär blev det och fungerar som det ska

$ServerName = (Read-Host "Server name?")
$DatabaseName = (Read-Host "Database name?")

Do {
$rorpath = (Read-Host "Folder name?")

Start-Process -NoNewWindow -FilePath "D:\Auto\RORds_Upgrades\Upgrades\$rorpath\RORd_$rorpath.cmd" -ArgumentList "$ServerName","$DatabaseName"

} While($rorpath)

Nu ska jag bara också få in att göra en sql select efter varje körning, några förslag på att få in det

Ahh ok

Annars testa skriva om foreachen lite, jag testade inte så noga så kanske skrev refernsen till name propertyn lite fel, testa nått sånt här istället, notera att jag tagit bort "" på variablerna ServerName och DatabaseName

get-childitem -Directory | ForEach-Object { Start-Process -NoNewWindow -FilePath "D:\Auto\RORds_Upgrades\Upgrades\" + $_.Name -ArgumentList $ServerName, $DatabaseName }

Vad gäller din fråga så är det väl bara att göra din sql direkt efter start-processraden?

Permalänk
Medlem
Skrivet av Xenofonus:

Ahh ok

Annars testa skriva om foreachen lite, jag testade inte så noga så kanske skrev refernsen till name propertyn lite fel, testa nått sånt här istället, notera att jag tagit bort "" på variablerna ServerName och DatabaseName

get-childitem -Directory | ForEach-Object { Start-Process -NoNewWindow -FilePath "D:\Auto\RORds_Upgrades\Upgrades\" + $_.Name -ArgumentList $ServerName, $DatabaseName }

Ska kika vidare på denna sen, jättesstort tack

Vad gäller din fråga så är det väl bara att göra din sql direkt efter start-processraden?

Hmm, fungerar halvt, jag kör scriptet, men får upp frågan

Folder name?: två gånger innan selecten körs, nästa körning får jag selecten efter, får gräva vidare! Stort tack suttit fast ett litet tag, inte jobbat så mycket i powershell.

Visa signatur

Chassi: Fractal design Define C Mobo: aorus x570 elite
Cpu Ryzen 3600 Kylare noctua nh-d15Gpu 7900XT Ram g.skill flare x black
Kingston a2000 1TB 2x PSU: EVGA SuperNova 850 G2

Permalänk
Medlem
Skrivet av NatureBoyyy:

Hmm, fungerar halvt, jag kör scriptet, men får upp frågan

Folder name?: två gånger innan selecten körs, nästa körning får jag selecten efter, får gräva vidare! Stort tack suttit fast ett litet tag, inte jobbat så mycket i powershell.

Ingen fara! Du får visa hur loopen ser ut numera annars om du behöver hjälp, för beteendet du beskrivet låter lite skumt helt klart.

Permalänk
Medlem
Skrivet av Xenofonus:

Ingen fara! Du får visa hur loopen ser ut numera annars om du behöver hjälp, för beteendet du beskrivet låter lite skumt helt klart.

Såhär ser själva loopen ut just nu.

$ServerName = (Read-Host "Server name?")
$DatabaseName = (Read-Host "Database name?")

Do {
$rorpath = (Read-Host "Folder name?")

Start-Process -NoNewWindow -FilePath "D:\Auto\RORds_Upgrades\Upgrades\$rorpath\RORd_$rorpath.cmd" -ArgumentList "$ServerName","$DatabaseName"

$Query = "Select huvudversion,underversion from ez0.ez0p0100"
#Timeout parameters
$QueryTimeout = 120
$ConnectionTimeout = 30
#Action of connecting to the Database and executing the query and returning results if there were any.
$conn=New-Object System.Data.SqlClient.SQLConnection
$ConnectionString = "Server={0};Database={1};Integrated Security=True;Connect Timeout={2}" -f $ServerName,$DatabaseName,$ConnectionTimeout
$conn.ConnectionString=$ConnectionString
$conn.Open()
$cmd=New-Object system.Data.SqlClient.SqlCommand($Query,$conn)
$cmd.CommandTimeout=$QueryTimeout
$ds=New-Object system.Data.DataSet
$da=New-Object system.Data.SqlClient.SqlDataAdapter($cmd)
[void]$da.fill($ds)
$conn.Close()
$ds.Tables

} While($rorpath)

Dold text

Mycket märkligt, körde i powershell direkt istället för ISE så kanske förstår varför det blir fel men samtidigt inte,

Här är print på felen/körning

https://imgur.com/a/73ZjW1p

Visa signatur

Chassi: Fractal design Define C Mobo: aorus x570 elite
Cpu Ryzen 3600 Kylare noctua nh-d15Gpu 7900XT Ram g.skill flare x black
Kingston a2000 1TB 2x PSU: EVGA SuperNova 850 G2

Permalänk
Medlem
Skrivet av NatureBoyyy:

Såhär ser själva loopen ut just nu.

$ServerName = (Read-Host "Server name?")
$DatabaseName = (Read-Host "Database name?")

Do {
$rorpath = (Read-Host "Folder name?")

Start-Process -NoNewWindow -FilePath "D:\Auto\RORds_Upgrades\Upgrades\$rorpath\RORd_$rorpath.cmd" -ArgumentList "$ServerName","$DatabaseName"

$Query = "Select huvudversion,underversion from ez0.ez0p0100"
#Timeout parameters
$QueryTimeout = 120
$ConnectionTimeout = 30
#Action of connecting to the Database and executing the query and returning results if there were any.
$conn=New-Object System.Data.SqlClient.SQLConnection
$ConnectionString = "Server={0};Database={1};Integrated Security=True;Connect Timeout={2}" -f $ServerName,$DatabaseName,$ConnectionTimeout
$conn.ConnectionString=$ConnectionString
$conn.Open()
$cmd=New-Object system.Data.SqlClient.SqlCommand($Query,$conn)
$cmd.CommandTimeout=$QueryTimeout
$ds=New-Object system.Data.DataSet
$da=New-Object system.Data.SqlClient.SqlDataAdapter($cmd)
[void]$da.fill($ds)
$conn.Close()
$ds.Tables

} While($rorpath)

Dold text

Mycket märkligt, körde i powershell direkt istället för ISE så kanske förstår varför det blir fel men samtidigt inte,

Här är print på felen/körning

https://imgur.com/a/73ZjW1p

Ingen aning varför den frågar två ggr men en liten grej du kan göra (som inte lär ha med detta att göra) är att du flyttar ut de variabler som inte behöver vara i loopen. Tänker på Query, QueryTimeout, ConnectionTimeout och kanske t o m ConnectionString.

De förändras aldrig om jag inte ser fel så finns ingen mening att återskapa dem varje iteration av loopen.

Permalänk
Medlem
Skrivet av NatureBoyyy:

Såhär ser själva loopen ut just nu.

$ServerName = (Read-Host "Server name?")
$DatabaseName = (Read-Host "Database name?")

Do {
$rorpath = (Read-Host "Folder name?")

Start-Process -NoNewWindow -FilePath "D:\Auto\RORds_Upgrades\Upgrades\$rorpath\RORd_$rorpath.cmd" -ArgumentList "$ServerName","$DatabaseName"

$Query = "Select huvudversion,underversion from ez0.ez0p0100"
#Timeout parameters
$QueryTimeout = 120
$ConnectionTimeout = 30
#Action of connecting to the Database and executing the query and returning results if there were any.
$conn=New-Object System.Data.SqlClient.SQLConnection
$ConnectionString = "Server={0};Database={1};Integrated Security=True;Connect Timeout={2}" -f $ServerName,$DatabaseName,$ConnectionTimeout
$conn.ConnectionString=$ConnectionString
$conn.Open()
$cmd=New-Object system.Data.SqlClient.SqlCommand($Query,$conn)
$cmd.CommandTimeout=$QueryTimeout
$ds=New-Object system.Data.DataSet
$da=New-Object system.Data.SqlClient.SqlDataAdapter($cmd)
[void]$da.fill($ds)
$conn.Close()
$ds.Tables

} While($rorpath)

Dold text

Mycket märkligt, körde i powershell direkt istället för ISE så kanske förstår varför det blir fel men samtidigt inte,

Här är print på felen/körning

https://imgur.com/a/73ZjW1p

Tips, du kan använda [code="språk"]text[/code] taggarna för att formatera koden när du postar, blir mer lättläst. Eller så kan du posta på pastebin eller liknande och länka koden. Men då främst om du har större kodstycken.

Permalänk
Medlem
Skrivet av Xenofonus:

Ingen aning varför den frågar två ggr men en liten grej du kan göra (som inte lär ha med detta att göra) är att du flyttar ut de variabler som inte behöver vara i loopen. Tänker på Query, QueryTimeout, ConnectionTimeout och kanske t o m ConnectionString.

De förändras aldrig om jag inte ser fel så finns ingen mening att återskapa dem varje iteration av loopen.

Aight tack städar upp det med, märkliga är kör jag bara

.\RORd_19200.cmd WIN-N5OAMUQ0FDB\SQL2019 SUPPORT_ROR direkt i powershell fungerar det, men det fungerar inte när jag använder variabler i scriptet.

$ServerName = (Read-Host "Server name?") $DatabaseName = (Read-Host "Database name?") Do { $rorpath = (Read-Host "Folder name?") Start-Process -NoNewWindow -FilePath "D:\Auto\RORds_Upgrades\Upgrades\$rorpath\RORd_$rorpath.cmd" -ArgumentList '$ServerName','$DatabaseName' } While($rorpath)

Skrivet av nikwad:

Tips, du kan använda [code="språk"]text[/code] taggarna för att formatera koden när du postar, blir mer lättläst. Eller så kan du posta på pastebin eller liknande och länka koden. Men då främst om du har större kodstycken.

Tack visste inte om detta! Har inte pasteat någon kod i på sweclockers tidigare, ska försöka lista ut hur fan jag gör det bara, verkar göra fel.

Visa signatur

Chassi: Fractal design Define C Mobo: aorus x570 elite
Cpu Ryzen 3600 Kylare noctua nh-d15Gpu 7900XT Ram g.skill flare x black
Kingston a2000 1TB 2x PSU: EVGA SuperNova 850 G2

Permalänk
Medlem
Skrivet av NatureBoyyy:

Aight tack städar upp det med, märkliga är kör jag bara

.\RORd_19200.cmd WIN-N5OAMUQ0FDB\SQL2019 SUPPORT_ROR direkt i powershell fungerar det, men det fungerar inte när jag använder variabler i scriptet.

$ServerName = (Read-Host "Server name?") $DatabaseName = (Read-Host "Database name?") Do { $rorpath = (Read-Host "Folder name?") Start-Process -NoNewWindow -FilePath "D:\Auto\RORds_Upgrades\Upgrades\$rorpath\RORd_$rorpath.cmd" -ArgumentList '$ServerName','$DatabaseName' } While($rorpath)

Tack visste inte om detta! Har inte pasteat någon kod i på sweclockers tidigare, ska försöka lista ut hur fan jag gör det bara, verkar göra fel.

Omslut variabler med $($var) när du använder dom inom quotations "" ''

Sen ska du inte behöva quotes i din -argumentslist iom att du använder variabler.

Permalänk
Medlem
Skrivet av nikwad:

Omslut variabler med $($var) när du använder dom inom quotations "" ''

Sen ska du inte behöva quotes i din -argumentslist iom att du använder variabler.

Okej så det ska se ut mer såhär? Eller missförstod jag helt?

$ServerName = (Read-Host "Server name?") $DatabaseName = (Read-Host "Database name?") Do { $rorpath = (Read-Host "Folder name?") Start-Process -NoNewWindow -FilePath "D:\Auto\RORds_Upgrades\Upgrades\$($rorpath)\RORd_$($rorpath).cmd" -ArgumentList $ServerName,$DatabaseName } While($rorpath)

Visa signatur

Chassi: Fractal design Define C Mobo: aorus x570 elite
Cpu Ryzen 3600 Kylare noctua nh-d15Gpu 7900XT Ram g.skill flare x black
Kingston a2000 1TB 2x PSU: EVGA SuperNova 850 G2

Permalänk
Medlem

Precis
Du kan även testa att bara printa hela -FilePath argumentet för att säkerställa att strängen är korrekt.

Tänk också på att om du vill att powershell ska parsea en variabel så måste du använda double quotes " och inte single quoates '. Med single quote så använder den bara strängen exakt som den är skriven.

Permalänk
Medlem
Skrivet av nikwad:

Precis
Du kan även testa att bara printa hela -FilePath argumentet för att säkerställa att strängen är korrekt.

Tack, körde en print och pathen är exakt rätt, men lirar fan inte ändå :/

Visa signatur

Chassi: Fractal design Define C Mobo: aorus x570 elite
Cpu Ryzen 3600 Kylare noctua nh-d15Gpu 7900XT Ram g.skill flare x black
Kingston a2000 1TB 2x PSU: EVGA SuperNova 850 G2

Permalänk
Medlem
Skrivet av NatureBoyyy:

Tack, körde en print och pathen är exakt rätt, men lirar fan inte ändå :/

Har du testat att skapa en ny batch script som bara echo dina arguments. Bara så att du vet att själva powershell scriptet är ok.

Ex batch:

@ECHO OFF ECHO %1 ECHO %2

Ex ps

Start-Process -NoNewWindow -FilePath "...\test.cmd" -ArgumentList 'testy','yesty'

Permalänk
Medlem

Varför blandar du både bat & ps? Allt kan ju skrivas i PS.

Blev bara nyfiken

Visa signatur

[IT-Dept]
Ryzen 1700 OC - 32 - 1070

Permalänk
Medlem
Skrivet av AllMessedUp:

Varför blandar du både bat & ps? Allt kan ju skrivas i PS.

Blev bara nyfiken

Detta är jobbrelaterat så leverans får vi i .cmd tyvärr.

Visa signatur

Chassi: Fractal design Define C Mobo: aorus x570 elite
Cpu Ryzen 3600 Kylare noctua nh-d15Gpu 7900XT Ram g.skill flare x black
Kingston a2000 1TB 2x PSU: EVGA SuperNova 850 G2