powershell - 当我从 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"
解决方案
当 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}"
推荐阅读
- rxjs - 使用 RxJS 创建类型化 Observable 的正确方法是什么?
- node.js - 为什么 MongoDB 简单读取查询不起作用?
- apache-spark - 使用 pyspark 将 RDD 保存到 S3 的方法
- powershell - Powershell检查当前日期和文件夹修改日期
- java - 如何将语音聊天功能添加到已经存在的视频会议代码 WebRTC Android
- google-apps-script - 是否可以禁用弹出请求?
- ios - 选择不同项目时队列中的第一项
- c++ - 使用 Mingw-w64 编译谷歌测试
- javascript - ReactJS 需要从外部类组件调用函数
- python - Flask-SQLAlchemy SQL Server 使用字符串作为主键