Powershell: Hur ange citat-tecken i kod utan att det tolkas som program-instruktion?

Permalänk
Medlem

Powershell: Hur ange citat-tecken i kod utan att det tolkas som program-instruktion?

Jag gör ett enkelt PS-skript som skannar igenom filnamn efter bokstäver/tecken som inte ska tillåtas i filnamn, och ändrar dessa bokstäverna. Hittar skriptet ett "Ÿ" i ett filnamn ska den bokstaven bytas ut bokstaven till "Y" osv.

Problemet uppstår när jag vill ange alla tecken som ska betraktas otillåtna i t.ex. en variabel.

$UnsupportedChars = '[!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ¡¢£¤¥¦§¨©ª«¬®¯]'

I dom tecken som ska vara otillåtna, ingår även det tecken - apostrof i här fallet - som både börjar OCH avslutar variabel. Förenklat exempel:

$UnsupportedChars = '[ab/def']'

Med andra ord, i variabelinnehållet ovan så förekommer apostrof som ett av dom tecken som ska betraktas som otillåtet tecknen (se 7e tecknet i båda variabel-innehållen ovan). Men den apostrofen signalerar då till programmet att detta är slutet på variabelinnehållet - vilket inte är avsikten.
Jag vill kunna ange "alla" tecken som innehåll i variabeln, utan något av dom tecknen tolkas som instruktion/avslut av variabeln. Har problem att förstå hur jag kan komma runt det dilemmat. Begränsad PS-kunskap. Skulle uppskatta hjälp/tips/tankar.

Har ett liknande problem senare i koden, närmare bestämt i loopen som söker igenom filnamnen och ersätter otillåtna tecken med tillåtna motsvarigheter. Det är tänkt såhär:

if ($_.Value -match "Å") { $newFileName = ($newFileName -replace "Å", "A") }

Men det blir problem när jag vill ange att det är just Citat-tecken jag vill ersätta/radera ur filnamn, eftersom citat-tecknet används ju just för att definiera tecknet som ska anges/bearbetas:

if ($_.Value -match """) { $newFileName = ($newFileName -replace """, "-") }

PS godkänner inte ens koden som körbar då.
När citat-tecken är just tecknet som ska anges, hur kan man göra då? Samma princip som ovanstående problem.

PS. fattar att folk kan tänka "men vem fasen anger citat-namn i filnamn?". Tänkte så jag med, men en del användare av enkla servern som jag kör för jobbet, är liksom 'dator-dummies' till sin natur .DS

Permalänk
Medlem

Har för mig att PS använder backtick ` som escapetecken. En sträng innehållande ett citattecken skrivs då $quotationmark = "`""

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk
Medlem

Hm, den var svårgissad; skrivet både med och utan ironi.
COBOL, FORTRAN, C, Python och alla Unix-skal använder backslash (\), men tydligen inte MS/PS (igen).

Permalänk
Medlem
Skrivet av Dooley:

Jag gör ett enkelt PS-skript som skannar igenom filnamn efter bokstäver/tecken som inte ska tillåtas i filnamn, och ändrar dessa bokstäverna. Hittar skriptet ett "Ÿ" i ett filnamn ska den bokstaven bytas ut bokstaven till "Y" osv.

För att normalisera bokstäver kan du köra det här:
$str = "Ÿlva"
$str.Normalize("FormD") -replace '\p{M}'
Ylva

Skrivet av Dooley:

Problemet uppstår när jag vill ange alla tecken som ska betraktas otillåtna i t.ex. en variabel.

$UnsupportedChars = '[!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ¡¢£¤¥¦§¨©ª«¬®¯]'

Som redan nämnt är det backtick `
$str = "[!#$%&'()*+,-./:;<=>?@[\]^_`{|}~€‚ƒ`„…†‡ˆ‰Š‹ŒŽ‘’`“`”•–—˜™š›œžŸ¡¢£¤¥¦§¨©ª«¬®¯]"

Du kan göra en mer allmän regex istället.
Tex en grupp där allt som inte är i gruppen matchas:

"Mitt`"tt;<=>fi'na{|}~€‚filnamn.txt" -replace "[^\w .]"
Mittttfinafilnamn.txt

Permalänk
Medlem
Skrivet av psobject:

För att normalisera bokstäver kan du köra det här:
$str = "Ÿlva"
$str.Normalize("FormD") -replace '\p{M}'
Ylva

Tackar
Det här såg riktigt intressant ut. Jag har suttit ett tag och försökt slå upp precis vad Normalize och FormD gör i just Powershell, men hittar enbart väldans långrandiga och abstrakta hänvisningar.

Om du orkar får du gärna beskriva lite kort vad Normalize gör, vilken parameter FormD är samt vilken slags ersättning som '\p{M}' hänvisar till?

Tack.