Pwershell hjälp (eller Windows kataloghantering)

Permalänk
Avstängd

Pwershell hjälp (eller Windows kataloghantering)

Jag skulle ändra ett litet script vi använder på jobbet och det skapade en del oväntade problem. Scriptet är tänkt att bygga en mjukvara, lägga allt i en katalog, zippa denna och sen ta bort katalogen. Jag behövde lägga till en underkatalog i denna katalog som jag kopierar in några filer till som ska skickas med i zipfilen men på något sätt har jag lyckats skapa kataloger som ligger i något slags limbo. Jag kan inte ta bort dem för enligt Windows finns de inte kvar, men de finns ju där liksom.

Scriptet innan mina ändringar:

# The version of the release to build and publish $releaseVersion=$args[0] if(!$releaseVersion) { write-output "Usage: .\PackageAndZip '1.0.0'" exit } $msbuild = "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\msbuild" $projectFile = ".\XXX\XXX.csproj" $solutionFile = ".\XXX.sln" $publishFile = "XXX\Properties\PublishProfiles\FolderProfile.pubxml" $publishFolder = ".\publish" # Build and deploy & $msbuild /p:Configuration=Release /t:Rebuild $solutionFile # Publish & $msbuild $projectFile /p:Configuration=Release /p:DeployOnBuild=true /p:PublishProfile=$publishFile # Copy CLI application Copy-Item -Force XXX.Cli\bin\Release\net5.0\* $publishFolder # Copy start script Copy-Item -Force START.bat $publishFolder # Zip file $zipFilname = ".\XXX_v$releaseVersion.zip" Compress-Archive -Path $publishFolder\* -DestinationPath $zipFilname -Force # Delete publish folder Remove-Item $publishFolder -Recurse

Också har jag försökt få till något ungefär som nedan, har testat lite olika grejer men jag tror det var ungefär så här det såg ut när det gick utför (mina tillägg i fetstil):

# The version of the release to build and publish $releaseVersion=$args[0] if(!$releaseVersion) { write-output "Usage: .\PackageAndZip '1.0.0'" exit } $msbuild = "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\msbuild" $projectFile = ".\XXX\XXX.csproj" $solutionFile = ".\XXX.sln" $publishFile = "XXX\Properties\PublishProfiles\FolderProfile.pubxml" $publishFolder = ".\publish" # Build and deploy & $msbuild /p:Configuration=Release /t:Rebuild $solutionFile # Publish & $msbuild $projectFile /p:Configuration=Release /p:DeployOnBuild=true /p:PublishProfile=$publishFile # Copy CLI application Copy-Item -Force XXX.Cli\bin\Release\net5.0\* $publishFolder # Copy start script Copy-Item -Force START.bat $publishFolder # Copy packages to folder and include $packageFolder = $publishfolder + "\Packages" New-Item -Path $packageFolder -ItemType Directory Copy-Item -Force *.mypackage $packageFolder # Zip file $zipFilname = ".\XXX_v$releaseVersion.zip" Compress-Archive -Path $publishFolder\* -DestinationPath $zipFilname -Force # Delete publish folder Remove-Item $publishFolder -Recurse

Problemet är att detta skapade upp en katalog som heter 'publish ' (med ett mellanslag efteråt) som jag inte kan få bort. Eller egentligen två kataloger, en med ett mellanslag och en med två efter mina försök. När jag försöker säger Windows "Det gick inte att hitta objektet Det finns inte längre i D:\... Verifiera objektets plats och försök igen." I egenskaperna för katalogen så ser allt normalt ut förutom Säkerhet-fliken som har ett felmeddelande: "Den begärda säkerhetsinformationen är inte tillgänglig eller kan inte visas." med ett rött kryss. Vilket sätter stopp för mina försök att ta ägandeskap eller liknande.

Permalänk
Avstängd

Svarar mig själv här, inte för att jag har löst problemet men det är tydligen ett känt problem att Windows inte gillar bland annat kataloger där namnet slutar i mellanslag. Försökt med det mesta som nämns här:: https://superuser.com/questions/1277529/how-do-i-delete-a-fil...

En lösning som skulle kunna fungera är att boota någon "Linux Live CD" och försöka ta bort den därifrån, men eftersom det är min jobbdator som förstås är krypterad så är det inte så enkelt.

Permalänk
Medlem
Skrivet av snajk:

Svarar mig själv här, inte för att jag har löst problemet men det är tydligen ett känt problem att Windows inte gillar bland annat kataloger där namnet slutar i mellanslag. Försökt med det mesta som nämns här:: https://superuser.com/questions/1277529/how-do-i-delete-a-fil...

En lösning som skulle kunna fungera är att boota någon "Linux Live CD" och försöka ta bort den därifrån, men eftersom det är min jobbdator som förstås är krypterad så är det inte så enkelt.

Förslaget som nämns där fungerar inte?

rd /s "\\?\C:\foo\bar\bad "

för en katalog (motsvarande fast med del för en fil)

(Just "\\?\"-grejen är själva nyckeln till hur det borde gå att lösa)

Visa signatur

Desktop spel m.m.: Ryzen 9800X3D || MSI X870 Tomahawk Wifi || MSI Ventus 3x 5080 || Gskill FlareX 6000 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Arbetsstation: Ryzen 7945HX || Minisforum BD790i || Asus Proart 4070 Ti Super || Kingston Fury Impact 5600 65 GB || WD SN850 2TB || Samsung 990 Pro 2TB || Fractal Ridge
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem

prova att använda join-path för att göra din sökväg istället.
https://docs.microsoft.com/en-us/powershell/module/microsoft....

Du kan även läsa på om remove-item. Ett alternativt sätt kan vara att köra get-childitem och pipe:a det till remove-item.https://docs.microsoft.com/en-us/powershell/module/microsoft....

Sen tycker jag det är ganska simpelt och löst spec:at vad som förväntas. Jag hade valt att vara mer restriktiv med path:s. som detta:

Copy-Item -Force *.mypackage $packageFolder

här hade jag hellre satt .\ som path och använt filter, exclude eller include. Och använd aldrig -force om det inte är absolut nödvändigt.

Visa signatur

"Det här systemet fungerar urkasst." - operatör.
"Hur ska det fungera då?" - jag
"Gör så att det fungerar som jag vill." - operatör.
/facepalm

Permalänk
Avstängd
Skrivet av evil penguin:

Förslaget som nämns där fungerar inte?

rd /s "\\?\C:\foo\bar\bad "

för en katalog (motsvarande fast med del för en fil)

(Just "\\?\"-grejen är själva nyckeln till hur det borde gå att lösa)

Jo jag hade höga förhoppningar för den, men tyvärr. Cannot find path 'D:\....' because it does not exist.

Skrivet av Otur:

prova att använda join-path för att göra din sökväg istället.
https://docs.microsoft.com/en-us/powershell/module/microsoft....

Jo, det var bara ett första testskott, som tyvärr skapade de här katalogerna. Jag ändrade det så att jag skapar katalogen i .\ bara och kopierar den i nästa steg liksom, vilket funkade bra.

Citat:

Du kan även läsa på om remove-item. Ett alternativt sätt kan vara att köra get-childitem och pipe:a det till remove-item.https://docs.microsoft.com/en-us/powershell/module/microsoft....

Körde:

Get-ChildItem | Where-Object Name -Like pub* | ForEach-Object {Remove-Item -LiteralPath $_.Name}

Men det funkade inte heller. De hittas med Get-ChildItem | Where.. så det blir två anrop till Remove-Item men samma resultat, Cannot find path 'publish ' because it does not exist.

Citat:

Sen tycker jag det är ganska simpelt och löst spec:at vad som förväntas. Jag hade valt att vara mer restriktiv med path:s. som detta:

Copy-Item -Force *.mypackage $packageFolder

här hade jag hellre satt .\ som path och använt filter, exclude eller include. Och använd aldrig -force om det inte är absolut nödvändigt.

Jo det är nog inte perfekt, men det är inte jag som gjort det så jag vill inte pilla på andras saker i onödan. Jag behövde bara lägga till några lösa filer till vår paketering liksom. Personligen hade jag ju heller haft det i en pipeline som bygger en artefakt så kan man styra allt i scripten där, men cheferna har varit väldigt veliga med hur detta verktyg ska paketeras, om det är en produkt eller ej (det är en simulator som underlättar testning och design av våra lösningar men inget som någon faktisk kund ska använda), om det kräver samma rigorösa testkrav som faktiska produkter och så vidare.

Det jag har testat hittills är: Diverse former av delete och rename i cmd och powershell, som admin och inte. Startat om datorn (obviously). Installerat 7zip för att försöka lura systemet med att lägga till de till ett arkiv med switchen delete source. Nästa steg är Git Bash och se om det går att ordna den vägen. Men jag är inte så bekväm med bash så det är därför jag inte kommit dit än.

Permalänk
Avstängd

Bash löste det.

$ rm -r 'publish ' $ rm -r 'publish '

Inga konstigheter alls. WSL är ganska nice alltså...