简体   繁体   中英

How do you resolve special folders in path strings in PowerShell?

In the Windows Command Prompt, special folders are resolved like so:

命令提示符显示特殊的文件夹分辨率

However, in powershell, these folders do not seem to be resolved:

PowerShell提示显示%temp%被逐字回显

Consider the string:

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

How can I use this as an argument to PowerShell functions (eg: Remove-Item ), and have PowerShell correctly resolve the special folders, as opposed to taking it literally and prepending the current working directory?

Edit:

I am working with strings using standard windows path notation coming from external configuration files, for example:

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

Note: as any of the Windows special folders can appear in these strings, I'd rather avoid horrible find-replace hacks like this

$config.some_file = $config.some_file -replace '%TEMP%' $env:temp

If you don't mind some performance issues

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

This will actually give you %TEMP% resolved by cmd itself.

You can grab all env variables from the env:\\ drive and use that to construct a succinct regex pattern for your find-replace operation, then use the Regex.Replace() method with a match evaluator:

$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')

You can expand it to a full path using:

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

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

Double-backslash \\\\ isn't a PowerShell thing either, \\ is not a special character in a PowerShell string - but double backslashes in a path do seem to work.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM