CrazyKing
@CrazyKing

Как подставить значения из JSON-файла в PowerShell?

Всем добрый день!
Есть JSON файл:
{
  "id": "22",
  "name": "Server",
  "components":
  [
    {
      "name": "Web",
      "update": true,
      "package": [
        {
          "source": "D:\\products\\*",
          "target": "D:\\test\\"
        },
        {
          "source": "%inetpub_path%\\web1\\*",
          "target": "\\Web\\web1\\"
        },
        {
          "source": "%inetpub_path%\\web2\\*",
          "target": "\\Web\\web2\\"
        },
        {
          "source": "%inetpub_path%\\web3\\*",
          "target": "\\Web\\web3\\"
        }
      ]
    }
  ]
}

Необходимо из файла JSON получить все значения у которых "update" = true, затем выбрать от туда значения "source" и "target" и подставить пути в формулу "xcopy $foreachp /e /y". В идеале, для выполнения задачи, должно получиться так: "xcopy D:\products\* D:\test\ /e /y". Количество путей может увеличиваться со временем.

Вот что у меня есть:
#Парсим JSON
$JSON = Get-Content "D:\file.json" -Raw -Encoding UTF8 | ConvertFrom-Json

#Сортируем по update = true
$componentSelect = $JSON.components | select name, update, package | Where-Object {$_.update -like "True"}
$nextCompon = [string[]]
$nextCompon = $componentSelect.package | Select-Object source,target

$nextCompon.count

#Загоняем в цикл полученные значения

foreach ($foreach in $nextCompon)
     {
    
        $foreachp = $foreach -replace '@{source=', '' -replace ';', '' -replace 'target=','' -replace '}',''
        $d = xcopy $foreachp /e /y
     }


В переменной $foreachp, если выводить, получаю "D:\products\* D:\test\", но при подстановке в переменную $d получаю ошибку:
xcopy : Недопустимый путь
D:\Безымянный1.ps1:22 знак:14
+ $d = xcopy $foreachp /e /y
+ ~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (Недопустимый путь:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError

Подскажите, пожалуйста, как побороть.
  • Вопрос задан
  • 1022 просмотра
Решения вопроса 1
@yellowmew
Cloud infrastructure, monitoring engineer. SRE
Подозреваю что дело в двух вещах:
1. использование переменной окружения %inetpub_path% в скрипте powershell. Никогда не задумывался будет ли это работать, но в Posh переменные окружения используются так: $ENV:HOMEPATH вместо %HOMEPATH%
В скриптах cmd, напоминаю, так же необходимо удвоение знаков %
2. использование переменных в запуске консольной программы напрямую
Здесь попробуйте использовать start-process "xcopy.exe" -argumentlist "все необходимые вам аргументы с переменными"
Или же Invoke-Expression -command "xcopy.exe все необходимые вам аргументы с переменными"
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы