Страница https://schneegans.de/windows/unattend-generator
— это форма, которая позволяет вам определить, что будет в autounatted.xml
для использования при автоматической установке Windows, и в результате получается URL-адрес, содержащий все эти параметры. Теперь, когда у меня есть именно то, что я хочу из опций в форме, я хочу нажать кнопку Download file
, которая находится в форме, чтобы я мог загрузить autounattend.xml
в свою систему. Я безуспешно пробовал следующее. Может быть, я использую неправильный подход для сбора этого XML-файла?
Как я могу использовать этот URL-адрес и нажать кнопку Download file
на этой странице (или любым другим способом в PowerShell, с помощью которого я могу собрать соответствующие XML-данные для autounattend.xml
)?
# URL of the page
$url = "https://schneegans.de/windows/unattend-generator/?LanguageMode=Unattended&UILanguage=en-US&UserLocale=en-GB&KeyboardLayout=0809%3A00000809&GeoLocation=242&ProcessorArchitecture=amd64&ComputerNameMode=Custom&ComputerName=Win10&TimeZoneMode=Implicit&PartitionMode=Unattended&PartitionLayout=GPT&EspSize=300&RecoveryMode=Partition&RecoverySize=600&WindowsEditionMode=Unattended&WindowsEdition=pro&UserAccountMode=Unattended&AccountName0=Boss&AccountPassword0=boss&AccountGroup0=Administrators&AccountName1=User&AccountPassword1=user&AccountGroup1=Users&AccountName2=&AccountName3=&AccountName4=&AutoLogonMode=Own&PasswordExpirationMode=Default&LockoutMode=Default&DisableSystemRestore=true&EnableLongPaths=true&EnableRemoteDesktop=true&HardenSystemDriveAcl=true&AllowPowerShellScripts=true&DisableLastAccess=true&NoAutoRebootWithLoggedOnUsers=true&TurnOffSystemSounds=true&DisableAppSuggestions=true&ProcessAudit=true&ProcessAuditCommandLine=true&WifiMode=Skip&ExpressSettings=DisableAll&SystemScript0=&SystemScriptType0=Cmd&SystemScript1=&SystemScriptType1=Ps1&SystemScript2=&SystemScriptType2=Reg&SystemScript3=&SystemScriptType3=Vbs&DefaultUserScript0=&DefaultUserScriptType0=Reg&FirstLogonScript0=&FirstLogonScriptType0=Cmd&FirstLogonScript1=&FirstLogonScriptType1=Ps1&FirstLogonScript2=&FirstLogonScriptType2=Reg&FirstLogonScript3=&FirstLogonScriptType3=Vbs&UserOnceScript0=&UserOnceScriptType0=Cmd&UserOnceScript1=&UserOnceScriptType1=Ps1&UserOnceScript2=&UserOnceScriptType2=Reg&UserOnceScript3=&UserOnceScriptType3=Vbs&WdacMode=Skip"
try {
# Send request to the page
$response = Invoke-WebRequest -Uri $url
# Parse the HTML response
$html = $response.ParsedHtml
# Find the download button element
$downloadButton = $html.querySelector('.btn.btn-primary')
if ($downloadButton -eq $null) {
Write-Host "Download button not found."
}
# Extract the download link
$downloadLink = $downloadButton.getAttribute('href')
# Download the file
Invoke-WebRequest -Uri $downloadLink -OutFile "autounattend.xml"
Write-Host "File downloaded successfully."
}
catch {
Write-Host "Error occurred: $_"
}
Вы можете открыть инструменты отладчика в своем браузере (с помощью F12), чтобы проверить, какой URL-адрес используется и какие данные публикуются (на вкладке «сеть»). В Chrome и Firefox даже есть опция «копировать в Powershell», которая сгенерирует для вас код PS, включая заголовки и файлы cookie.
Это обе вещи, о возможности которых я не подозревал, и это здорово (я знал F12, но не знал, что в Chrome и Firefox есть опция «Копировать в PowerShell»!). Мне не нужно нажимать кнопку, и я с радостью воспользуюсь выводом «Просмотр файла», это хорошая идея. Я знаю, что могу делать такие вещи, как (invoke-webrequest $url).RawContent
, чтобы увидеть все на странице, но это, вероятно, немного примитивно. Есть ли у вас лучший/более точный метод, который более точно извлечет XML с помощью invoke-restmethod
?
Вы достигаете ограничений того, что можно сделать с помощью PowerShell. Если вам необходимо взаимодействовать с элементами DOM, вам следует использовать JavaScript, который предназначен именно для этой цели.
Не нужно нажимать кнопку — просто используйте действия просмотра или загрузки:
$url = 'https://schneegans.de/windows/unattend-generator/view/?LanguageMode=...';
Invoke-WebRequest -Uri $url -OutFile "$env:TEMP\autounattend.xml";
Источник: Я являюсь автором этого сервиса.
Вам нужно загружать его динамически? Есть ли причина, по которой вы не можете просто сгенерировать его вручную как разовый шаг, сохранить как XML-файл (или встроить его как строку в свой сценарий) и использовать в качестве шаблона в своем сценарии? Кроме того, если вы используете кнопку «Просмотреть файл» в самом низу страницы, вы перейдете на URL-адрес с соответствующей строкой запроса — возможно, вы могли бы просто создать этот URL-адрес и строку запроса в своем коде и использовать
invoke-restmethod
для этого, чтобы получить содержимое unattend.xml, а не отправлять POST форму «загрузить файл»...