Ваша строка вывода PowerShell не совсем PowerShell-ese.Это что-то вроде PowerCmd или что-то в этом роде.Замените
echo $package@$obj[$key][$package] >> packages.txt
на
"JSON[{0:d}]={1}@{2}" -f $i++, $package, $obj[$key][$package] >> packages.txt
... если вы хотите заполнить массив JSON [] при выходе PowerShell обратно в среду пакетной обработки, или
"{0}@{1}" -f $package, $obj[$key][$package] >> packages.txt
... если вы хотите, чтобы только конкатенированные значения были отправлены в packages.txt.И если это так, избавьтесь от цикла for /F
в пакетном режиме.Вы также можете использовать gc
в PowerShell для чтения JSON, что гораздо более изящно, чем пытаться заполнить переменную Batch многострочным значением.
<# : batch portion (contained within a PowerShell multi-line comment)
@echo off & setlocal
set "JSON=InstallPackage.json"
rem # re-eval self with PowerShell and capture results
powershell -noprofile "iex (${%~f0} | out-string)"
rem # end main runtime
goto :EOF
: end batch / begin PowerShell hybrid code #>
add-type -AssemblyName System.Web.Extensions
$JSON = new-object Web.Script.Serialization.JavaScriptSerializer
$obj = $JSON.DeserializeObject((gc $env:JSON))
# output object in key@value format to packages.txt
foreach ($key in $obj.keys) {
foreach($package in $obj[$key].keys){
"{0}@{1}" -f $package, $obj[$key][$package] >> packages.txt
}
}
И у меня есть еще одна рекомендация,Вместо того, чтобы писать package.txt с помощью перенаправления добавления, ваши намерения будут более понятны, если вы используете командлет out-file
.Ожидаете ли вы, что пакеты package.txt будут создаваться с нуля при каждом запуске?Или продолжит ли расти файл packages.txt с несколькими запусками?Если вы вернетесь к этому коду через год, вспомните ли вы о своих намерениях?
Это будет более понятным:
# output object in key@value format to packages.txt
&{
foreach ($key in $obj.keys) {
foreach($package in $obj[$key].keys){
"{0}@{1}" -f $package, $obj[$key][$package]
}
}
} | out-file packages.txt
Если вы намереваетесь наращивать package.txt с последовательными запусками, тогдаиспользуйте
out-file packages.txt -append
Видите?Таким образом, package.txt будет явно либо перезаписываться, либо добавляться при каждом запуске, и не потребует никаких проверок, существует ли файл или ожидает, что файл еще не существует.Это менее двусмысленно.