Вы запускаете отдельный процесс Powershell в каждой строке, поэтому каждая строка совершенно не зависит от другой. Это не сработает, поскольку вы определяете переменные и присваиваете им значения в одной строке, а затем пытаетесь использовать их позже в совершенно отдельном процессе, который не имеет такой переменной. Самый простой ответ - разделить все ваши утверждения точками с запятой, как указано в double-beep .
PowerShell.exe -Command "$url = 'https://ufile.io/wqtvx'; $outpath = '$PSScriptRoot/downloadtest.bat'; Invoke-WebRequest -Uri $url -OutFile $outpath; $wc = New-Object System.Net.WebClient; $wc.DownloadFile($url, $outpath); $args = @('Comma','Separated','Arguments'); Start-Process -Filepath '$PSScriptRoot/downloadtest.bat' -ArgumentList $args"
Обратите внимание, что вы неправильно использовали кавычки в своем коде. Посмотрите на подсветку синтаксиса для идеи о том, что происходит в вашей первой строке:
PowerShell.exe -Command "$url = "https://ufile.io/wqtvx""
Powershell будет интерпретировать вашу команду как первую строку «$ url =», которая выдаст ошибку, поскольку это неверный синтаксис Powershell. Тогда https://ufile.io/wqtvx находится вне каких-либо кавычек, и Powershell снова не поймет, как это интерпретировать и выдать ошибку. Наконец, у вас есть пустая строка "", прикрепленная к концу, которая не добавляет никакого значения в утверждение. Используйте одинарные кавычки для кавычек в кавычках, как показано в моем примере выше.
Обычно этот код слишком велик для одного лайнера. Это трудно читать и устранять неполадки. Я бы предложил создать скрипт Powershell, представляющий собой просто текстовый файл с расширением .ps1, и назвать его что-то вроде «DownloadFile.ps1». В этот файл поместите следующий код:
$url = "https://ufile.io/wqtvx"
$outpath = "$PSScriptRoot/downloadtest.bat"
Invoke-WebRequest -Uri $url -OutFile $outpath
$wc = New-Object System.Net.WebClient
$wc.DownloadFile($url, $outpath)
$args = @("Comma","Separated","Arguments")
Start-Process -Filepath "$PSScriptRoot/downloadtest.bat" -ArgumentList $args
Затем вызовите это из вашего командного файла с помощью чего-то вроде:
Powershell.exe -ExecutionPolicy Bypass -Command "C:\Path\To\DownloadFile.ps1"