Когда я запускаю сценарий PowerShell из CMD, это неправильно устанавливает переменные - PullRequest
0 голосов
/ 16 февраля 2020

Если я запускаю команду из PowerShell, она отлично работает вместо CMD, это происходит: Imgur Image

PowerShell -NoLogo -NoProfile -Command "$MangaPage=Invoke-WebRequest -Uri %MangaLink%; $MangaName=$MangaPage.ParsedHtml.querySelector('#top-in > div.top-title > span.hideM0 > a').innerText; Write-Host $MangaName; $ChapterNumber=$MangaPage.ParsedHtml.querySelector('#combobox > option.selected').innerText; Write-Host $ChapterNumber; $PageNumber=$MangaPage.ParsedHtml.querySelector('#pageSelect > option.selected').innerText; Write-Host $PageNumber; $URLImage=$MangaPage.ParsedHtml.querySelector('#mainImg').src.replace('about:', 'https:'); Write-Host $URLImage; $FileExtension=$URLImage.SubString($URLImage.lastIndexOf('.')+1); Write-Host $FileExtension; $FileName='$.ChapterNumber'+'_'+'$PageNumber'+'_'+'$MangaName'+'.'+'$FileExtension'; $Folder=('$MangaName\$ChapterNumber'); If(!(Test-Path $Folder)) { New-Item -ItemType Directory -Force -Path $Folder }; Invoke-WebRequest $URLImage -OutFile $Folder\$FileName"

1 Ответ

0 голосов
/ 16 февраля 2020

О PowerShell.exe

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

Параметр Command принимает блок сценария к исполнению только тогда, когда он может распознать значение, переданное в Command, как тип ScriptBlock. Это возможно только при запуске PowerShell.exe с другого хоста PowerShell. Тип ScriptBlock может содержаться в существующей переменной, возвращаться из выражения или анализироваться хостом PowerShell как буквальный блок сценария, заключенный в фигурные скобки {}, перед передачей в PowerShell.exe.

В cmd.exe нет такой вещи, как блок скрипта (или ScriptBlock тип), поэтому значение, переданное в Command, всегда будет строкой. Вы можете написать блок скрипта внутри строки, но вместо выполнения он будет вести себя точно так же, как если бы вы набирали его в типичном приглашении PowerShell, распечатывая содержимое блока скрипта обратно к вам.

Строка, переданная в Command, будет по-прежнему выполняться как PowerShell, поэтому фигурные скобки блока сценария часто не требуются в первую очередь при запуске из cmd.exe. Для выполнения блока встроенного скрипта , определенного внутри строки, оператор вызова & может использоваться:

console

"& {}"

PowerShell -NoLogo -NoProfile -Command  "&{ $MangaPage=Invoke-WebRequest -Uri %MangaLink%; $MangaName=$MangaPage.ParsedHtml.querySelector('#top-in > div.top-title > span.hideM0 > a').innerText; Write-Host $MangaName; $ChapterNumber=$MangaPage.ParsedHtml.querySelector('#combobox > option.selected').innerText; Write-Host $ChapterNumber; $PageNumber=$MangaPage.ParsedHtml.querySelector('#pageSelect > option.selected').innerText; Write-Host $PageNumber; $URLImage=$MangaPage.ParsedHtml.querySelector('#mainImg').src.replace('about:', 'https:'); Write-Host $URLImage; $FileExtension=$URLImage.SubString($URLImage.lastIndexOf('.')+1); Write-Host $FileExtension; $FileName='$.ChapterNumber'+'_'+'$PageNumber'+'_'+'$MangaName'+'.'+'$FileExtension'; $Folder=('$MangaName\$ChapterNumber'); If(!(Test-Path $Folder)) { New-Item -ItemType Directory -Force -Path $Folder }; Invoke-WebRequest $URLImage -OutFile $Folder\$FileName}" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...