- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经在这里坐了三天了,试图解决以下问题。我需要一个可以将 url 作为参数传递给的调用函数。但是,此 URL 有一个 &
,一旦我将变量作为调用参数传递,它就不再起作用。我无法在 Url 中设置 /&
,因为它是动态 Url。
每个网址均以 https://
开头,以 &dl=1
结尾
@echo off
setlocal enabledelayedexpansion
set "url=!array[2]!"
call :do_download
:do_download
powershell -c "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12;
Invoke-WebRequest '%url%' -OutFile 'C:\Program Files (x86)\test.zip'"
但是如果我尝试使用所有版本的引号、双引号、修剪或其他技巧,它就不起作用:´(我还不知道。但我需要 Url 作为调用参数。
@echo off
setlocal enabledelayedexpansion
set "url=!array[2]!"
call :do_download "%url%"
:do_download
powershell -c "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12;
Invoke-WebRequest '%1' -OutFile 'C:\Program Files (x86)\test.zip'"
如果你自己尝试一下:您可以使用以下命令保存 packs.txt
:
Testlink
https://sync.luckycloud.de/d/76ffff3d76ea4e9ab15e/files/?p=%2FTest.txt&dl=1
该链接是从 lorem ipsum 下载一个包含 200 个单词的 .txt
文件。这是完整的代码,此时可以工作,但没有 call-param。您可以根据需要设置路径,这只是示例。该代码自行运行;使用 !
是因为稍后它将位于 if
内,但该代码独立于该代码。
@echo off
setlocal enabledelayedexpansion
call :readtest
pause
call :do_download
pause
:readtest
set count=0
for /f "usebackq tokens=*" %%A in ("C:\Program Files (x86)\Steam\steamapps\common\packs.txt") do (
set /a count+=1
set url[!count!]=%%A
)
set "pack_sd=!url[2]!"
goto :eof
:do_download
powershell -c "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; Invoke-WebRequest '%pack_sd%' -OutFile 'C:\Program Files (x86)\Steam\steamapps\common\test.txt'"
goto :eof
如果我尝试使用 use 来回答::"=
call :do_download "%pack_sd%"
:do_download
echo TT %1 TT
set "url=%1"
set test=%url:"=%
echo "TT %test% TT"
第一个回声:
TT "https://sync.luckycloud.de/d/76ffff3d76ea4e9ab15e/files/?p=FTest.txt&dl=1" TT
第二个回声:
error: command "dl" is wrong or unknown...
"TT "= TT"
如果我尝试用 %~1 回答
call :do_download "%pack_sd%"
:do_download
echo TT %1 TT
set url=%~1
echo "TT %url% TT%
第一个回声:
TT "https://sync.luckycloud.de/d/76ffff3d76ea4e9ab15e/files/?p=FTest.txt&dl=1" TT
第二个回声:
error: command "dl" is wrong or unknown...
"TT https://sync.luckycloud.de/d/76ffff3d76ea4e9ab15e/files/?p=FTest.txt TT"
如果我在 powershell 命令中使用答案:'%1:"=':
call :do_download "%pack_sd%"
:do_download
powershell -c "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; Invoke-WebRequest '%1:"=' -OutFile 'C:\Program Files (x86)\Steam\steamapps\common\test.txt'"
goto :eof
error: "The string has no terminator: '."
最佳答案
问题归结为:
支持的要求不仅仅是 &
还有%
不幸的是,URL 中的字符使解决方案变得非常复杂,因为 cmd.exe
(不恰本地)通过 call
将参数的逐字值传递给子例程。字符串插值,这需要将 %
加倍。值以保存它们。
因此,从带有 for /f
的文件中读取 URL一定有它的%
以编程方式加倍,然后将其作为参数传递给 call :do_download
,这是一项不平凡的任务 - 请参阅下面的代码和源代码注释。
请注意,如果您的网址还包含 !
,则需要额外努力。字符。
在您的 :do_download
中子程序,使用set "url=%~1"
。这将存储 %1
的未加引号值(第一个参数)在变量 %url%
中
请勿使用set "url=%1"
或set url=%~1
,这两个都可以预见地中断为 %1
嵌入双引号并包含 &
的值.
请勿使用 %1:"=
,它不会做你认为它会做的事情。 %1
是一个参数,而您尝试使用的字符串替换语法仅适用于变量(例如 %url:"=%
)
然后你可以使用%url%
"..."
内的原样形成 powershell -c
的字符串参数 - 或者你可以使用 %~1
直接。
与中间%url%
变量,但是,您也可以利用以下事实:所有 cmd.exe
变量(但不是参数,例如 %1
)也是环境变量,因此允许 PowerShell 通过环境变量引用访问 URL > 而不是直接将其嵌入到命令字符串中(相当于 cmd.exe 的 %url%
在 PowerShell 中为 $env:url
)。也就是说,您可以替换 powershell
请使用以下内容进行调用 - 请注意如何括起 '...'
不得使用引用作为 PowerShell 命令的一部分:
powershell -c "Write-Output $env:url"
这是一个最小的示例,显示包含 &
的 URL和%
字符正确传递到 PowerShell;代码中的其他所有内容都是偶然的(使用 for /f
,PowerShell 命令的细节):
@echo off
setlocal enabledelayedexpansion
:: Use a sample URL that contains both & and % characters.
:: Note: The % must be DOUBLED here in order to escape it.
:: The resulting string will only have ONE %, as desired and will therefore
:: literally be the following, as it would be read from a file with `for /f`:
:: http://example.org?p=%2FTest.txt&dl=1
set "url=http://example.org?p=%%2FTest.txt&dl=1"
:: Unfortunately, using `call` requires escaping of % even in variable values,
:: as the embedded single % are then again subject to variable expansion
:: (even though they shouldn't be).
:: Doubling % *programmatically* is non-trivial and requires a helper variable
:: as well as mixing up-front and delayed expansion.
:: The following string substitution effectively doubles the embedded % chars.
:: so that the :do_download subroutine again sees them as verbatim single ones.
set "pct=%%"
call :do_download "!url:%pct%=%%%%!"
goto :eof
:do_download
set "url=%~1"
powershell -c "Write-Output '%url%'"
goto :eof
上面逐字打印 http://example.org?p=%2FTest.txt&dl=1
,证明 URL 已正确传递到 PowerShell。
关于powershell - 使用带有 "&"和 "%"的变量时出现引号问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71287991/
我正在寻找实现 PowerShell 提供程序 在 电源外壳。 我一直在想,如果我只是定义类型,然后将它们导入我的 session (导入模块),我应该能够让它们可用。 例如,这个 不工作但它沿着我想
我创建的脚本使用了组件,这些组件仅在32位版本的Powershell中可用。 默认情况下,Windows使用Powershell x64执行脚本,这会导致一些错误。 是一种在脚本开头设置值以强制Win
是否可以从 Powershell 中检测它是否是嵌套 shell? 如果我打开 Powershell 或 cmd.exe 窗口,然后输入 powershell 在那里,是否有一个神奇的 $host.s
随着 PowerShell Core 的发布,应用程序在使用托管自动化库 (system.management.automation) 时如何选择调用哪个版本的 Powershell(Powershe
最近,我加入了我企业的 Windows 团队,凭借我的开发人员背景(一般是 Java、.NET 和 Web),我很快就对 PowerShell 产生了兴趣。我可以看到它比普通的旧批处理文件、VB 更有
假设我有一个 powershell 脚本,它在我当前路径的相对路径中包含一个 Powershell 哈希。让我们称之为“name.ps1”,它包含: $names = @{ "bob" = "b
我想为我正在构建的自定义 Powershell Commandlet 使用 SqlServerCmdletSnapin。如果我将以下代码添加到 PSM1 的开头: if ( (Get-PSSnapin
如何调用从 PowerShell 脚本中获取命名参数的 PowerShell 脚本? foo.ps1: param( [Parameter(Mandatory=$true)][String]$a=''
我即将为 Windows 管理员编写一个 PowerShell 脚本,以帮助他们完成与部署 Web 应用程序相关的某些任务。 有什么理由让我应该赞成或排除开发 PowerShell 模块 (.psm1
我的 powershell 模块有一个函数,我希望它返回一个非零退出代码。但是,作为一个模块函数,当我运行 Import-Module 时,它会加载到 powershell 控制台的上下文中。所以,当
我在这个问题上花了最后 4 个小时,非常感谢您提供的任何意见。 我需要使用不同的凭据调用 powershell 脚本并将参数传递给该脚本。 安装 WISEScript 中包装的程序后,此脚本开始收集机
我有一个场景,我需要将 powershell 命令的命令和输出转发到另一个进程以进行日志记录和处理。 我希望这个控制台尽可能接近 powershell,因此不希望将它简单地托管在另一个控制台程序中。
我正在尝试让一个主 PowerShell 脚本运行所有其他脚本,同时等待 30-60 秒以确保完成任务。我尝试过的所有其他操作都不会停止/等待第一个脚本及其进程完成,然后才能同时完成所有其他脚本,并且
我正在编写一个脚本来使用多个 plink (PuTTY) session 作为 Windows 版本的 clustersh。然而,我陷入困境,因为我想从 powershell 打开多个 Powersh
我读了这个答案:How to Open Powershell from Powershell start powershell 这将打开基础的大分辨率 PS 实例。如何打开 PS(x86)? 最佳答案
我很想知道我们是否可以在 Powershell 中做到这一点。 使用 Out-File 命令,我们可以通过管道将其输出写入文件。这样我就可以将我所有的历史命令发送到一个文本文件中。 问题是我可以在每次
我在 about_Pipelines 阅读了有关 PowerShell 中的管道工作原理的信息,并了解到管道一次传送一个对象。 所以,这个 Get-Service | Format-Table -Pr
我正在尝试像这样从 powershell 启动一个进程:- $proc = (start-process $myExe -argumentList '/myArg True' -windowStyle
## To run the script # .\get_status.ps1 -Hostname -Service_Action -Service_Name #$Hostname = "hos
让我们使用 powershell 命令 Write-Host "red text"-Fore red这会在红色前景中显示“红色文本”。 但是,您希望文本以稍微亮一点的方式显示字体颜色,浅红色。 有没有
我是一名优秀的程序员,十分优秀!