PowerShell-dagi yo'llardagi maxsus papkalarni qanday hal qilasiz?

Windows Buyruqning so'rashida, maxsus papkalarni quyidagi kabi hal qilinadi:

Command Prompt showing special folder resolution

Biroq, bu papkalarni kuchsiz deb bo'lmaydi:

PowerShell Prompt showing %temp% being echoed literally

Quyidagilarni ko'rib chiqing:

$myfile = "%temp%\\myfolder\\myfile.txt"

Qanday qilib buni PowerShell funktsiyalari uchun argument deb ishlatishim mumkin (masalan: Remove-Item ) va PowerShell so'zlashuvni to'g'ri bajarish va joriy ishchi daftarni oldik qilish o'rniga maxsus papkalarni to'g'ri hal qilish kerakmi?

Tahrirlash:

Masalan, tashqi konfiguratsiya fayllaridan kelib chiqqan standart oyna chiziq belgilaridan foydalanib strings bilan ishlayapman, masalan:

config.json:

{
    "some_file": "%TEMP%\\folder\\file.txt"
}

myscript.ps1:

$config = Get-Content -Raw -Path "config.json" | ConvertFrom-Json
Remove-Item -path $config.some_file -Force

Eslatma: Ushbu satrlarda Windows maxsus papkalari har qandayida ko'rinishi mumkin Bu kabi dahshatli topilmalar o'rnini egallaydi

$config.some_file = $config.some_file -replace '%TEMP%' $env:temp
0
siz ularni ajralish uchun o'zingizning funksiyangizni yaratishingiz va ularni qadriyatlarga aylantirishingiz mumkin, sizda boshqa hech narsa qilolmaysiz (hack tashqari)
qo'shib qo'ydi muallif 4c74356b41, manba
'% (. *)%', '$ env: $ 1' almashtirish '
qo'shib qo'ydi muallif BenH, manba
'% (. *)%', '$ env: $ 1' almashtirish '
qo'shib qo'ydi muallif BenH, manba

7 javoblar

Barcha env parametrlarini env: \ haydovchisidan olishingiz mumkin va uni topish kodi bilan ishlash uchun regex naqshini yaratish uchun foydalaning, keyin Regex.Replace() Bir usulni baholovchi bilan usul:

$vars = Get-ChildItem env:\ |ForEach-Object {[regex]::Escape($_.Name)}
$find  = "%(?:$($envNames -join '|'))%"
[regex]::Replace($config.some_file, $find, {param([System.Text.RegularExpressions.Match]$found) return (Get-Item "env:\$($found.Groups[1])").Value},'IgnoreCase')
1
qo'shib qo'ydi

Barcha env parametrlarini env: \ haydovchisidan olishingiz mumkin va uni topish kodi bilan ishlash uchun regex naqshini yaratish uchun foydalaning, keyin Regex.Replace() Bir usulni baholovchi bilan usul:

$vars = Get-ChildItem env:\ |ForEach-Object {[regex]::Escape($_.Name)}
$find  = "%(?:$($envNames -join '|'))%"
[regex]::Replace($config.some_file, $find, {param([System.Text.RegularExpressions.Match]$found) return (Get-Item "env:\$($found.Groups[1])").Value},'IgnoreCase')
1
qo'shib qo'ydi

Barcha env parametrlarini env: \ haydovchisidan olishingiz mumkin va uni topish kodi bilan ishlash uchun regex naqshini yaratish uchun foydalaning, keyin Regex.Replace() Bir usulni baholovchi bilan usul:

$vars = Get-ChildItem env:\ |ForEach-Object {[regex]::Escape($_.Name)}
$find  = "%(?:$($envNames -join '|'))%"
[regex]::Replace($config.some_file, $find, {param([System.Text.RegularExpressions.Match]$found) return (Get-Item "env:\$($found.Groups[1])").Value},'IgnoreCase')
1
qo'shib qo'ydi

Buni quyidagicha foydalanib to'liq yo'lni kengaytira olasiz:

[System.Environment]::ExpandEnvironmentVariables("%TEMP%\\myfolder\\myfile.txt")

c:\users\username\AppData\Local\Temp\\myfolder\\myfile.txt

Ikkala chiziqli kod \\ PowerShell emas, balki \ PowerShell dizgesindeki maxsus belgi emas, lekin yo'lda ikki marta chivinlar ishlayotgan ko'rinadi.

Documentation: https://msdn.microsoft.com/en-us/library/system.environment.expandenvironmentvariables.aspx

1
qo'shib qo'ydi

Buni quyidagicha foydalanib to'liq yo'lni kengaytira olasiz:

[System.Environment]::ExpandEnvironmentVariables("%TEMP%\\myfolder\\myfile.txt")

c:\users\username\AppData\Local\Temp\\myfolder\\myfile.txt

Ikkala chiziqli kod \\ PowerShell emas, balki \ PowerShell dizgesindeki maxsus belgi emas, lekin yo'lda ikki marta chivinlar ishlayotgan ko'rinadi.

Documentation: https://msdn.microsoft.com/en-us/library/system.environment.expandenvironmentvariables.aspx

1
qo'shib qo'ydi

Buni quyidagicha foydalanib to'liq yo'lni kengaytira olasiz:

[System.Environment]::ExpandEnvironmentVariables("%TEMP%\\myfolder\\myfile.txt")

c:\users\username\AppData\Local\Temp\\myfolder\\myfile.txt

Ikkala chiziqli kod \\ PowerShell emas, balki \ PowerShell dizgesindeki maxsus belgi emas, lekin yo'lda ikki marta chivinlar ishlayotgan ko'rinadi.

Documentation: https://msdn.microsoft.com/en-us/library/system.environment.expandenvironmentvariables.aspx

1
qo'shib qo'ydi

Agar ba'zi ishlash muammolariga duch kelmasangiz

$ resolvedPathInABitHackyWay = (cmd/c echo "% TEMP% \" folder \\ file.txt ")

Bu sizga %% TEMP% ni cmd tomonidan o'zi hal qiladi.

1
qo'shib qo'ydi
Siz go'zallik! Bu juda yaxshi ishlaydi, va mening ishimda (hanuzgacha) ishlash muammo emas.
qo'shib qo'ydi muallif Alex McMillan, manba
@ 4c74356b41 Ishonchli! Birinchisi, barcha kerakli maxsus papkalar ro'yxatini (masalan, % TEMP% , % PROGRAMFILES% , % APPDATA% va hokazo) va har safar ularni yechish kerak; ikkinchisining hammasi hammasini hal qiladigan shinam bir tekislovchi.
qo'shib qo'ydi muallif Alex McMillan, manba
Mening savolimni pastga surib qo'ydim, chunki siz noto'g'ri javobni tanladim deb o'ylaysiz. Ushbu yechim men uchun ishladi. Bye
qo'shib qo'ydi muallif Alex McMillan, manba
$ config.some_file = $ config.some_file -% almashtirish '% TEMP%' $ env: temp deb atashni istaysiz, ammo bu yaxshi emasmi? jinnilik @AlexMcMillan
qo'shib qo'ydi muallif 4c74356b41, manba
Yo'q, regexni sharhlardan foydalanishingiz mumkin, bu narsa har qanday narsalarni kuchlar o'zgaruvchisiga o'zgartiradi, shuning uchun % appdata% $ env: appdata </​​code>, % temp% $ env: temp va shunga o'xshash bo'ladi, juda toza bo'ladi. Siz shuningdek regexni `` `` deb qarash uchun foydalanishingiz mumkin
qo'shib qo'ydi muallif 4c74356b41, manba