Пакетная загрузка файлов и запуск нескольких файлов, один за другим? - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь создать командный файл, который может загружать и запускать три файла по одному. Два из них .bat-файлы и один .exe-файл. Я пытаюсь использовать команды powershell для этого в файле .bat, так как он должен быть исполняемым. Я борюсь с этим, потому что я незнаком как с пакетными файлами, так и с PowerShell.

PowerShell.exe -Command "$url = "https://ufile.io/wqtvx""
PowerShell.exe -Command "$outpath = "$PSScriptRoot/downloadtest.bat""
PowerShell.exe -Command "Invoke-WebRequest -Uri $url -OutFile $outpath"
PowerShell.exe -Command "$wc = New-Object System.Net.WebClient"
PowerShell.exe -Command "$wc.DownloadFile($url, $outpath)"
PowerShell.exe -Command "$args = @("Comma","Separated","Arguments")"
PowerShell.exe -Command "Start-Process -Filepath "$PSScriptRoot/downloadtest.bat" -ArgumentList $args"

Приведенный выше код будет повторяться три раза для каждого файла, который я хочу загрузить. Я не очень уверен, где хранить файл, который я хотел бы скачать онлайн, поэтому я загрузил его на бесплатный сайт для хранения файлов. Если кто-нибудь может помочь мне заставить это работать, я буду признателен.

Ответы [ 3 ]

0 голосов
/ 08 января 2019

Основная проблема с этим сценарием состоит в том, что команда powershell.exe -c будет запускать код после нее только на одной итерации powershell. По завершении выполнения кода он «закрывает» это окно powershell (пытаясь объяснить его как можно проще).

В Powershell есть возможность связывать команды в простой командной строке, аналогично символу пакета &, у powershell есть ; для этого задания. Кроме того, ваш код по-прежнему не работал бы, как заявлено Джеймсом С. - Ссылка не является прямой на файл, она требует от вас «нажать» кнопку для инициализации загрузки.

Не для рекламы, но я предлагаю GitHub или MediaFire, так как вы можете получить прямые ссылки на скачивание каждого файла. На веб-странице не требуется взаимодействие с javascript для их загрузки.


Этот скрипт поместит большинство ваших команд в одну строку, что позволяет загружать их из powershell. Эта конкретная команда будет работать на всех версиях PowerShell 1.0+. Простой start Batchfile.bat позаботится об остальном, или вы можете добавить команду, добавив ; Start-Process -Filepath $PSScriptRoot/downloadtest.bat -ArgumentList exc ...

Powershell.exe -Command "(New-Object Net.WebClient).DownloadFile('http://Site/Batchfile.bat', '%~dp0downloadtest.bat')"
0 голосов
/ 08 января 2019

Вы запускаете отдельный процесс 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"
0 голосов
/ 08 января 2019

Каждый процесс powershell является отдельным и знает, что было сделано в другом, вам нужно либо включить весь ваш код в один параметр -Command, либо использовать -File и передать ему многострочный сценарий powershell.

Также ваша загрузка не удастся, так как эта ссылка не относится к файлу, она требует, чтобы вы «нажали» кнопку для инициализации загрузки.

Благодаря этому вы получите downloadtest.bat, который содержит исходный код HTML для самой страницы загрузки .


Если у вас есть файловый хост с прямой URL-ссылкой, вы можете использовать точку с запятой ; между двумя командами Invoke-WebRequest и Start-Process, чтобы они находились в одной строке:

PowerShell.exe -Command "Invoke-WebRequest -Uri https://filehost.com/directlink/downloadtest.bat -OutFile $PSScriptRoot/downloadtest.bat ; Start-Process -Filepath $PSScriptRoot/downloadtest.bat -ArgumentList @('Comma','Separated','Arguments')"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...