首页 > 解决方案 > usebackq 没有延迟扩展

问题描述

以下从远程目录创建一个编号的链接列表,例如

1 Link!1
2 Link!2
3 Link!3
4 Link!4
5 Link!5

.

@echo off
setlocal ENABLEDELAYEDEXPANSION

megals --reload /Root/

set /p var1="enter folder name: " & megals /Root/var1

set /a c=0

FOR /F "tokens=1 usebackq" %%i in (`megals -n -e /Root/%%var1%%`) do (
set /a c=c+1
echo !c! %%i 
set string[!c!]=%%i
)

set /P number=Enter number:
echo !string[%number%]!

pause

第一个问题:所有链接都包含一个!字符,该字符被延迟扩展删除,使链接无用。链接需要 ,!因为它是链接的一部分。

第二个问题:我正在尝试将其集成到程序中,但我无法使用findstr,因为它会在同一行列出链接和文件名,并且当文件名包含括号时程序崩溃。所以我必须使用 usebackq 因为它让我只获得链接,而不需要处理文件名。

Findstr将列出Link!1 Filename (整行)

Usebackq让我得到Link!1

我不能使用Findstr,因为当文件名包含括号时程序会崩溃,这只能通过延迟扩展来解决。

这是来自这里的后续帖子,我被卡住了:(显示程序
https://stackoverflow.com/questions/49564553/create-a-numbered-list-based-on-a-given-list -of-strings# =

您可以在那里看到 findstr 方法,以及当文件名包含括号时它如何导致崩溃,这可以通过延迟扩展来修复,但这会删除!必不可少的字符,因为它是链接的一部分。

编辑:现在似乎可以工作了,谢谢

工作代码

@echo off

:start:


megals --reload /Root/

set /p var1="dir? " & megals /Root/%%var1%%

for /f "tokens=1,* delims=:" %%A in ('megals -n /Root/%%var1%% ^|findstr
/n "." ') do (
set Link[%%A]=%%B
Echo %%A %%B
)

setlocal DisABLEDELAYEDEXPANSION

set /a c=0

FOR /F "tokens=1 usebackq" %%i in (`megals -n -e /Root/%%var1%%`) do (
set /a c+=1
call set "string[%%c%%]=%%i"
)

set /P number="Enter number: "

FOR /F "tokens=*" %%g IN ('call echo %%string[%number%]%%') do (SET VAR2=%%g)
echo %Var2%
echo.

Megadl %VAR2% & echo. && goto :start:

pause

https://megatools.megous.com/man/megals.html#_megatools

标签: windowsbatch-filefor-loopcmddelayedvariableexpansion

解决方案


你真的应该双引号你的整套命令。
在调用中使用备用延迟扩展类型:

@echo off
setlocal DisABLEDELAYEDEXPANSION

megals --reload /Root/

set /p var1="enter folder name: " & megals /Root/var1

set /a c=0

FOR /F "tokens=1 usebackq" %%i in (`megals -n -e /Root/%%var1%%`) do (
    set /a c+=1
    call echo %%c%% %%i 
    call set "string[%%c%%]=%%i"
)

set /P number=Enter number:
call echo %%string[%number%]%%

pause

推荐阅读