gpt4 book ai didi

powershell - 使用带有 "&"和 "%"的变量时出现引号问题

转载 作者:行者123 更新时间:2023-12-02 18:17:59 26 4
gpt4 key购买 nike

我已经在这里坐了三天了,试图解决以下问题。我需要一个可以将 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com