[Batch / PowerShell] Hulp met creeeren van bat / PS bestand

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Themperror
  • Registratie: Maart 2011
  • Laatst online: 22-08 16:59
Hallo,

Ik gebruik een atm een simpel bat bestandje om een aantal assets te converten maar deze werkt helaas maar voor een enkele map, nou moet ik op deze manier elke submap handmatig toevoegen, en ben nu op het punt aangekomen (nieuwe assets) dat het toevoegen van elke submap (en sub-submaps etc) niet echt meer handig is..

Mijn huidige bat doet:

code:
1
2
for %%f in (resources/textures/*.*) do ( IF NOT EXIST "data/textures/%%~nf.dds" (
"bin/ThempImageParser.exe" "resources/textures/%%f" "data/textures/%%~nf.dds"


Voor het leesgemak even snel uitgelegd:
Voor elk bestand in resources/textures/ voer bin/ThempImageParser.exe arg1 arg2 uit ALS het target bestand niet bestaat

Nu moet ik het dus iets flexibler hebben en in de richting van dit:

[pseudo code]
code:
1
2
3
4
5
6
7
8
9
10
baseDir = currentDir;
rawAssetsDir = resources/textures/
processedAssetsDir = data/textures/
for every file %%F in rawAssetsDir and %subdirs recursively
{
    if(processedAssetsDir/%subdirs/%~nF.bin does NOT exist)
    {
        start baseDir/myExe.exe "rawAssetsDir/%subdirs/%%F" "processedAssetsDir/%subdirs/%~nF.bin"
    }
}


Dus hij moet recursief alle submappen afgaan ipc en hetzelfde doet als de "oude" versie.

Dit kan in zowel powershell als batch.

Maar mijn kennis van batch houd hier op, Ik heb enigsinds iets kunnen vinden over FORFILES maak heb geen idee hoe ik het relatieve pad vanaf base dir kan onthouden en "outputten"

Rig: AMD Ryzen 9950X3D, 96GB DDR5 6000Mhz, MSI Ventus X3 OC RTX5090


Acties:
  • 0 Henk 'm!

  • MAX3400
  • Registratie: Mei 2003
  • Laatst online: 27-09 22:07

MAX3400

XBL: OctagonQontrol

Kijk even op https://gallery.technet.microsoft.com/scriptcenter voor bakken met scripts gebaseerd op allerlei "Microsoft" scripting.

Mijn advertenties!!! | Mijn antwoorden zijn vaak niet snowflake-proof


Acties:
  • 0 Henk 'm!

  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

Ik weet zeker dat dit fouten bevat, aangezien ik ‘t op m’n iPad zit te tikken, maar dit stukje Powershell lijkt me wel een goed begin.

code:
1
2
3
4
5
6
7
8
9
10
$BaseDir = $MyInvocation.MyCommand.Path
$RawAssetsDir = C:\Resources\Textures
$ProcessedAssetsDir = C:\Data\Textures
$Items = Get-ChildItem -Path $RawAssetsDir -Recurse -ItemType File
ForEach ($Item in $Items) {
    $Dest = $Item.FullName -replace $RawAssetsDir, $ProcessedAssetsDir
    If (!(Test-Path -Path $Dest)) {
        Start-Process -Path (Join-Path -Path $BaseDir -ChildPath myexe.exe) -Arguments $Item.FullName, $Dest
    }
}

Acties:
  • 0 Henk 'm!

  • Themperror
  • Registratie: Maart 2011
  • Laatst online: 22-08 16:59
downtime schreef op zondag 3 december 2017 @ 23:38:
Ik weet zeker dat dit fouten bevat, aangezien ik ‘t op m’n iPad zit te tikken, maar dit stukje Powershell lijkt me wel een goed begin.

code:
1
2
3
4
5
6
7
8
9
10
$BaseDir = $MyInvocation.MyCommand.Path
$RawAssetsDir = C:\Resources\Textures
$ProcessedAssetsDir = C:\Data\Textures
$Items = Get-ChildItem -Path $RawAssetsDir -Recurse -ItemType File
ForEach ($Item in $Items) {
    $Dest = $Item.FullName -replace $RawAssetsDir, $ProcessedAssetsDir
    If (!(Test-Path -Path $Dest)) {
        Start-Process -Path (Join-Path -Path $BaseDir -ChildPath myexe.exe) -Arguments $Item.FullName, $Dest
    }
}
Heb zelf nog nooit met powershell gewerkt, weet alleen dat ik het kan uitvoeren via een ander .bat bestand (wat ik dan ook zou doen)

Maar ik krijg deze error (nadat ik de bug gefixed had omdat je pathnames geen strings waren:

Afbeeldingslocatie: https://i.imgur.com/jBReghn.png

Als het goed is test je ook niet op de juiste items en werken de paden niet relatief (het doel is ook dat het werkt vanaf elke locatie van de schijf, en dus alleen de directories vanaf de locatie van het powershell bestandje gebruikt)

Dus het lijtk alsof je zou testen met gelijke bestands extensies:
resources/textures/file.extension met data/textures/file.extension..
terwijl dit moet worden:
resources/textures/file.extension met data/textures/file.dds (of ipv dds liever zelfs elk arbitraire formaat (in een variabele dus..)

En het werkt nu met absolute padnamen wat ook niet fijn is aangezien dit aangepast moet worden voor elk andere locatie (staat op versioncontrol dus voor andere mensen zou dit ook moeten werken dan)
(of zou die C:\ uit het padnaam kunnen?)

Rig: AMD Ryzen 9950X3D, 96GB DDR5 6000Mhz, MSI Ventus X3 OC RTX5090


Acties:
  • 0 Henk 'm!

  • MAX3400
  • Registratie: Mei 2003
  • Laatst online: 27-09 22:07

MAX3400

XBL: OctagonQontrol

Verander eens "-itemtype File" naar "-include *.dds"

Mijn advertenties!!! | Mijn antwoorden zijn vaak niet snowflake-proof


Acties:
  • 0 Henk 'm!

  • Themperror
  • Registratie: Maart 2011
  • Laatst online: 22-08 16:59
MAX3400 schreef op maandag 4 december 2017 @ 14:35:
Verander eens "-itemtype File" naar "-include *.dds"
code:
1
2
3
4
5
6
7
8
9
10
$BaseDir = $MyInvocation.MyCommand.Path
$RawAssetsDir = "\Resources\Textures"
$ProcessedAssetsDir = "\Data\Textures"
$Items = Get-ChildItem -Path $RawAssetsDir -Recurse -include *.dds
ForEach ($Item in $Items) {
    $Dest = $Item.FullName -replace $RawAssetsDir, $ProcessedAssetsDir
    If (!(Test-Path -Path $Dest)) {
        Start-Process -Path (Join-Path -Path $BaseDir -ChildPath bin\ThempImageParser.exe) -Arguments $Item.FullName, $Dest
    }
}


en dan krijg ik een error dat ie het padnaam niet kan vinden:
code:
1
Get-ChildItem : Cannot find path 'C:\Resources\Textures' because it does not exist.

vanaf lijn:
code:
1
$Items = Get-ChildItem -Path $RawAssetsDir -Recurse -include *.dds


Hij lijkt dus nogsteeds vanaf C:\ te zoeken terwijl ie moet beginnen in het pad van het .ps1 bestand..

[ Voor 5% gewijzigd door Themperror op 04-12-2017 14:38 ]

Rig: AMD Ryzen 9950X3D, 96GB DDR5 6000Mhz, MSI Ventus X3 OC RTX5090


Acties:
  • 0 Henk 'm!

  • MAX3400
  • Registratie: Mei 2003
  • Laatst online: 27-09 22:07

MAX3400

XBL: OctagonQontrol

Themperror schreef op maandag 4 december 2017 @ 14:38:

en dan krijg ik een error dat ie het padnaam niet kan vinden:
Euh nee; $MyInvocation.MyCommand.Path wordt pas gezet vanuit PowerShell en niet vanuit PowerShell ISE.

Wat gebeurt er als je PowerShell opstart, je current path verandert naar C: en daar je .PS1 aftrapt?

Mijn advertenties!!! | Mijn antwoorden zijn vaak niet snowflake-proof


Acties:
  • 0 Henk 'm!

  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

MAX3400 schreef op maandag 4 december 2017 @ 14:41:
[...]

Euh nee; $MyInvocation.MyCommand.Path wordt pas gezet vanuit PowerShell en niet vanuit PowerShell ISE.

Wat gebeurt er als je PowerShell opstart, je current path verandert naar C: en daar je .PS1 aftrapt?
$MyInvocation.MyCommand.Path werkt alleen als je een (als .ps1 opgeslagen) script runt. Of dat vanuit ISE is, maakt niet uit, zolang je het script maar opgeslagen hebt. In een niet-opgeslagen script blok wordt die waarde niet geset.

Acties:
  • 0 Henk 'm!

  • Themperror
  • Registratie: Maart 2011
  • Laatst online: 22-08 16:59
MAX3400 schreef op maandag 4 december 2017 @ 14:41:
[...]

Euh nee; $MyInvocation.MyCommand.Path wordt pas gezet vanuit PowerShell en niet vanuit PowerShell ISE.

Wat gebeurt er als je PowerShell opstart, je current path verandert naar C: en daar je .PS1 aftrapt?
Of ik begrijp je niet goed.. of ik wordt hier misbegrepen..

Het powershell bestandje moet dus worden uitgevoerd vanaf "PrepareRun.bat" eigenlijk of anders vanaf visual studio anders

die moet daarna voor elk bestand in resources/textures/ de converter aan roepen (met als output argument data/textures/

Afbeeldingslocatie: https://i.imgur.com/DnuN2N3.png

Maarja code zoals eerder hierboven, als ik de .ps1 zo uitvoer krijg ik zover het lijkt een blanco powershell die na 0.001 seconden weer verdwijnt en verder niks gedaan lijkt te hebben

[ Voor 11% gewijzigd door Themperror op 04-12-2017 14:49 ]

Rig: AMD Ryzen 9950X3D, 96GB DDR5 6000Mhz, MSI Ventus X3 OC RTX5090


Acties:
  • 0 Henk 'm!

  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

MAX3400 schreef op maandag 4 december 2017 @ 14:35:
Verander eens "-itemtype File" naar "-include *.dds"
Nee, was foutje van me, -ItemType File moet gewoon -File zijn. Dat krijg je als je snel even wat maakt op je iPad. Maar die -Include zal ook wel werken.

Acties:
  • 0 Henk 'm!

  • Themperror
  • Registratie: Maart 2011
  • Laatst online: 22-08 16:59
downtime schreef op maandag 4 december 2017 @ 14:49:
[...]

Nee, was foutje van me, -ItemType File moet gewoon -File zijn. Dat krijg je als je snel even wat maakt op je iPad. Maar die -Include zal ook wel werken.
ahh ik begrijp de code al iets beter, hij zoekt nu dus (met die include .dds) naar elk .dds bestandje in die map.. maar daar zijn er daar geen van.. ofja misschien wel, punt is dat er vanalles in zou kunnen zitten.. (.tga, .bmp, .png, .jpg en zelfs .dds), maar hij moet wel checken of de target directory die file met als extension .dds (want dat is het output formaat) niet bestaat.

dit is goed te zien in het alleerste stukje code in mijn OP, elk input file maar hij zoekt of de .dds ervan in de target directory niet bestaat

[ Voor 10% gewijzigd door Themperror op 04-12-2017 14:54 ]

Rig: AMD Ryzen 9950X3D, 96GB DDR5 6000Mhz, MSI Ventus X3 OC RTX5090


Acties:
  • 0 Henk 'm!

  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

Dat ie vanaf C: zoekt zal wel komen door die slash voor \Resource\Textures. Dat moet gewoon Resources\Textures zijn.

Acties:
  • 0 Henk 'm!

  • Themperror
  • Registratie: Maart 2011
  • Laatst online: 22-08 16:59
downtime schreef op maandag 4 december 2017 @ 15:02:
Dat ie vanaf C: zoekt zal wel komen door die slash voor \Resource\Textures. Dat moet gewoon Resources\Textures zijn.
In je originele code stond C:\resources\ dus had de C: weggehaald :P

zonder de \ voor het padnaam krijg ik een error:

The regular expression pattern Resources\Textures is not valid.

Rig: AMD Ryzen 9950X3D, 96GB DDR5 6000Mhz, MSI Ventus X3 OC RTX5090


Acties:
  • 0 Henk 'm!

  • MAX3400
  • Registratie: Mei 2003
  • Laatst online: 27-09 22:07

MAX3400

XBL: OctagonQontrol

@Themperror Je wil in 1x teveel en eerlijk gezegd snap ik je vraag gedeeltelijk en daardoor is het lastig troubleshooten.

Als je eerst eens begint om je variable padnamen uit je Powershell-script te halen.
Maak ook even een "test omgeving" aan onder bijvoorbeeld D:\Textures en D:\Resources
Open daadwerkelijk eerst een PowerShell (dus niet ISE) en trap je aangepaste script af als je in het pad D:\ zit.

Let wel: PS1 uit BAT starten, is niet altijd handig. Afhankelijk van het script en de geladen modules, mag je dit niet vanuit BAT starten ivm module registratie, signed/unsigned flags etc.

Mijn advertenties!!! | Mijn antwoorden zijn vaak niet snowflake-proof


Acties:
  • 0 Henk 'm!

  • Themperror
  • Registratie: Maart 2011
  • Laatst online: 22-08 16:59
MAX3400 schreef op maandag 4 december 2017 @ 15:08:
@Themperror Je wil in 1x teveel en eerlijk gezegd snap ik je vraag gedeeltelijk en daardoor is het lastig troubleshooten.

Als je eerst eens begint om je variable padnamen uit je Powershell-script te halen.
Maak ook even een "test omgeving" aan onder bijvoorbeeld D:\Textures en D:\Resources
Open daadwerkelijk eerst een PowerShell (dus niet ISE) en trap je aangepaste script af als je in het pad D:\ zit.

Let wel: PS1 uit BAT starten, is niet altijd handig. Afhankelijk van het script en de geladen modules, mag je dit niet vanuit BAT starten ivm module registratie, signed/unsigned flags etc.
Ik begrijp het.. Ik zal even wat duidelijker zijn..

Dit moet dus allemaal worden uitgevoerd worden als post-build step in visual studio (simpel genoeg via visual studio een .bat aanroepen die vervolgens alles afhandeld) .
Als dus een Powershell bestandje niet zal werken (en ben nu dus puur met powershell bezig vanwege het feit dat de eerste reply richting powershell ging) is misschien een Batch bestand een beter optie..

Ik heb verder geen D:\ schijf (of andere) dus zal hooguit vanaf C:\ kunnen testen, maar ultiem moet het vanaf elk pad werken zonder de code hoeven aan te passen.

Anyhow test scenario is opgezet.

Rig: AMD Ryzen 9950X3D, 96GB DDR5 6000Mhz, MSI Ventus X3 OC RTX5090


Acties:
  • 0 Henk 'm!

  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

MAX3400 schreef op maandag 4 december 2017 @ 15:08:
@Themperror Je wil in 1x teveel en eerlijk gezegd snap ik je vraag gedeeltelijk en daardoor is het lastig troubleshooten.

Als je eerst eens begint om je variable padnamen uit je Powershell-script te halen.
Maak ook even een "test omgeving" aan onder bijvoorbeeld D:\Textures en D:\Resources
Open daadwerkelijk eerst een PowerShell (dus niet ISE) en trap je aangepaste script af als je in het pad D:\ zit.

Let wel: PS1 uit BAT starten, is niet altijd handig. Afhankelijk van het script en de geladen modules, mag je dit niet vanuit BAT starten ivm module registratie, signed/unsigned flags etc.
Ik ben met je eens dat het script wat vereenvoudigd moet worden zodat @Themperror het zelf kan troubleshooten. Maar het maakt helemaal niks uit of ie dat in ISE of vanaf een prompt doet.

Zolang je maar een opgeslagen script uitvoert zitten er vrijwel geen verschillen tussen uitvoeren in ISE en een prompt. Pas wanneer je iets uitvoert wat niet opgeslagen is, zal ISE het als een scriptblock zien, en niet een “echt” script en zal de code zich daardoor iets anders gedragen.

Zelf schrijf ik al m’n PowerShell in ISE. Pas als het script af is, wordt het zekerheidshalve nog een paar keer getest vanaf een prompt.

Acties:
  • 0 Henk 'm!

  • Themperror
  • Registratie: Maart 2011
  • Laatst online: 22-08 16:59
Ok.. "test" omgeving staat, en heb het visueler ingebeeld voor jullie:
Afbeeldingslocatie: https://i.imgur.com/baQWzMT.png

Rig: AMD Ryzen 9950X3D, 96GB DDR5 6000Mhz, MSI Ventus X3 OC RTX5090


Acties:
  • 0 Henk 'm!

  • heuveltje
  • Registratie: Februari 2000
  • Laatst online: 21:00

heuveltje

KoelkastFilosoof

kun je niet gewoon een dir *.dds /s /b >files.txt doen ?

dan krijg je zo een lijst met alle files die je wilt converten inc filenaam en path

Heuveltjes CPU geschiedenis door de jaren heen : AMD 486dx4 100, Cyrix PR166+, Intel P233MMX, Intel Celeron 366Mhz, AMD K6-450, AMD duron 600, AMD Thunderbird 1200mhz, AMD Athlon 64 x2 5600, AMD Phenom X3 720, Intel i5 4460, AMD Ryzen 5 3600 5800x3d


Acties:
  • 0 Henk 'm!

  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

heuveltje schreef op maandag 4 december 2017 @ 15:29:
kun je niet gewoon een dir *.dds /s /b >files.txt doen ?

dan krijg je zo een lijst met alle files die je wilt converten inc filenaam en path
En hoe check je dan of het outputbestand al bestaat?

Acties:
  • 0 Henk 'm!

  • Themperror
  • Registratie: Maart 2011
  • Laatst online: 22-08 16:59
heuveltje schreef op maandag 4 december 2017 @ 15:29:
kun je niet gewoon een dir *.dds /s /b >files.txt doen ?

dan krijg je zo een lijst met alle files die je wilt converten inc filenaam en path
het moet automatisch gebeuren, en de output directory krijgt alleen maar .dds files, de input directory kan vanalles hebben dus: *.*


Dusja:
code:
1
2
for %%f in (resources/textures/*.*) do ( IF NOT EXIST "data/textures/%%~nf.dds" (
"bin/ThempImageParser.exe" "resources/textures/%%f" "data/textures/%%~nf.dds"


dit werkt.. voor 1 gedefineerde map.. dus eigenlijk moet dit alleen nog aangepast worden om voor elke map eronder recursief uitgevoert te worden..

(een ander extra probleem is dat ik wel de mappenstructuur van tevoren handmatig moet aanmaken -_-)

Rig: AMD Ryzen 9950X3D, 96GB DDR5 6000Mhz, MSI Ventus X3 OC RTX5090


Acties:
  • +1 Henk 'm!

  • downtime
  • Registratie: Januari 2000
  • Niet online

downtime

Everybody lies

Het bevatte toch wat meer fouten dan ik dacht, al was de opzet wel OK :)

PowerShell:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$BaseDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$MyExe = Join-Path -Path $BaseDir -ChildPath 'myexe.exe'
$RawAssetsDir = Join-Path -Path $BaseDir -ChildPath 'Resources\Textures'
$ProcessedAssetsDir = Join-Path -Path $BaseDir -ChildPath 'Data\Textures'
$Items = Get-ChildItem -Path $RawAssetsDir -Recurse -File

ForEach ($Item in $Items) {
    $DestDir = $Item.Directory.FullName.Replace($RawAssetsDir, $ProcessedAssetsDir)
    $DestFullName = Join-Path -Path $DestDir -ChildPath ('{0}.dds' -f $Item.Basename)
    If (!(Test-Path -Path $DestFullName)) {
        New-Item -Path $DestDir -ItemType Directory -Force | Out-Null
        Start-Process -FilePath $MyExe -ArgumentList $Item.FullName, $DestFullName
    }
}

Dit werkt voor mij behalve het daadwerkelijke aftrappen van een executable. Ik heb gewoon geen executable om het mee te testen.
Pagina: 1