首页 > 解决方案 > 当我从 CMD 启动 PowerShell 脚本时,这并没有很好地设置变量

问题描述

如果我从 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"

标签: powershellbatch-file

解决方案


关于 PowerShell.exe

当 Command 的值是字符串时,Command 必须是指定的最后一个参数,因为在命令之后键入的任何字符都被解释为命令参数。

Command 参数仅在可以将传递给 Command 的值识别为 ScriptBlock 类型时才接受执行的脚本块。这仅在从另一个 PowerShell 主机运行 PowerShell.exe 时才有可能。ScriptBlock 类型可以包含在现有变量中,从表达式返回,或者在传递给 PowerShell.exe 之前由 PowerShell 主机解析为括在花括号 {} 中的文字脚本块。

在 cmd.exe 中,没有脚本块(或 ScriptBlock 类型)之类的东西,因此传递给 Command 的值将始终是字符串。您可以在字符串中编写一个脚本块,但它不会被执行,它的行为就像您在典型的 PowerShell 提示符下键入它一样,将脚本块的内容打印回给您。

传递给 Command 的字符串仍将作为 PowerShell 执行,因此从 cmd.exe 运行时,通常首先不需要脚本块花括号。要执行 在字符串中定义的内联脚本块,可以使用调用运算符 &:

安慰

“&{}”

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}" 

推荐阅读