【问题标题】:How do you resolve special folders in path strings in PowerShell?如何在 PowerShell 中解析路径字符串中的特殊文件夹?
【发布时间】:2017-07-13 04:12:17
【问题描述】:

在 Windows 命令提示符中,特殊文件夹的解析方式如下:

但是,在 powershell 中,这些文件夹似乎没有被解析:

考虑字符串:

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

如何将其用作 PowerShell 函数的参数(例如:Remove-Item),并让 PowerShell 正确解析特殊文件夹,而不是按字面意思理解并将当前工作目录放在前面?

编辑:

我正在使用来自外部配置文件的标准 Windows 路径表示法处理字符串,例如:

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

注意:由于任何Windows special folders 都可以出现在这些字符串中,我宁愿避免像这样可怕的查找替换黑客攻击

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

【问题讨论】:

  • 好吧,你可以创建自己的函数来解析它们,并将它们转换为值,我认为你不能做任何其他事情(除了你的 hack)
  • -替换 '%(.*)%', '$env:$1'

标签: shell powershell command-line path


【解决方案1】:

您可以使用以下方法将其扩展为完整路径:

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

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

双反斜杠 \\ 也不是 PowerShell 的东西,\ 不是 PowerShell 字符串中的特殊字符 - 但路径中的双反斜杠似乎确实有效。

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

【讨论】:

    【解决方案2】:

    如果您不介意一些性能问题

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

    这实际上会给你 %TEMP% 由 cmd 本身解决。

    【讨论】:

    • 美女!这完美地工作,在我的情况下性能不是问题(还)。
    • 您称$config.some_file = $config.some_file -replace '%TEMP%' $env:temp 为黑客,但这可以吗?疯狂@AlexMcMillan
    • @4c74356b41 确实如此!第一个要求我维护所有可能的特殊文件夹的列表(例如:%TEMP%%PROGRAMFILES%%APPDATA% 等)并每次迭代它们;后者是一个整洁的单线,可以解决所有问题。
    • 不,您可以使用 cmets 中的正则表达式,它将任何内容转换为 powershell 变量,因此 %appdata% 变为 $env:appdata%temp% 变为 $env:temp 等等,会更干净.你也可以使用正则表达式来处理`\`
    • 否决我的问题,因为您认为我选择了错误的答案是微不足道的。这个解决方案对我有用。再见
    【解决方案3】:

    您可以从 env:\ 驱动器中获取所有 env 变量,并使用它为您的查找-替换操作构建一个简洁的正则表达式模式,然后使用带有匹配评估器的 Regex.Replace() 方法:

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

    【讨论】:

      猜你喜欢
      • 2014-09-22
      • 2022-01-12
      • 1970-01-01
      • 2023-04-03
      • 2014-09-03
      • 1970-01-01
      • 2014-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多