我正在尝试写一个批处理文件,它可以接受用户输入的FTP链接,解析出用户,密码和域,将它们写入文件,并调用该文件作为FTP命令的输入。我已经成功地编写了它,直到有人在里面有了一个带有!
的密码。
FTP链接是系统生成的,可能包含特殊字符(例如:!
、^
、*
)。
在使用/
、:
和@
作为分隔符的for循环中读取完整字符串(即:ftp://userid:password@some.domain.com
)时,我使用了setlocal delayedexpansion
。
我试着更有创意地在解析输出后执行endlocal delayedexpansion
,但之后令牌不起作用,因为我要结束扩展。我还尝试将每个令牌写到它自己的文件中,然后将文件的内容作为变量赋值,但没有成功。
我认为应该有一种方法来做到这一点,但我总是碰壁。
下面是我的代码片段:
@ECHO OFF
setlocal enableextensions enabledelayedexpansion
echo Example FTP link:
echo.
echo "ftp://xxxxxxxx:yyyyyyyy@some.where.com"
echo.
set /p ftplink= Please enter full FTP link:
echo.
set /p ftpfile= Please provide the file name you want to download:
:FTPbat
:: Generate a bat file for FTP retrieval
for /f "tokens=1-4 delims=/:@" %%a in ("%ftplink%") do (
set ftpdomain=%%~d
set ftpuser=%%~b
set ftppass=%%~c
)
echo open %ftpdomain%> get.ftp
echo %ftpuser%>> get.ftp
echo %ftppass%>> get.ftp
echo binary>> get.ftp
echo hash>> get.ftp
echo mget %ftpfile%>> get.ftp
echo disconnect>> get.ftp
echo quit>> get.ftp
:GetFTPFile
CLS
FTP -i -s:get.ftp
以下是一个示例FTP链接:
ftp://username:pas!word@somewhere.com
不幸的是,特殊字符可以在密码字符串中的任何位置,也可以在用户名中。此外,用户名和密码的长度也不一致(即:各8个字符)。我发现这一点是很艰难的。
任何和所有的帮助都非常感谢。
发布于 2019-03-12 05:37:22
这是微不足道的(如果你知道怎么做的话)。
关键是仅在禁用的延迟扩展模式下扩展FOR参数(否则延迟扩展阶段将修改!
字符)。
但要使用可变内容,请始终使用延迟扩展模式(因为只有延迟扩展才能安全地扩展任何内容)。
因此,您需要切换模式。
参考:SO: How does the Windows Command Interpreter (CMD.EXE) parse scripts?
SETLOCAL EnableDelayedExpansion
(
for /f "tokens=1-4 delims=/:@" %%a in ("!ftplink!") do (
SETLOCAL DisableDelayedExpansion
set "ftpdomain=%%~d"
set "ftpuser=%%~b"
set "ftppass=%%~c"
SETLOCAL EnableDelayedExpansion
echo open !ftpdomain!
echo !ftpuser!
echo !ftppass!
echo binary
echo hash
echo mget !ftpfile!
echo disconnect
echo quit
ENDLOCAL
ENDLOCAL
)
) > get.ftp
这段代码很简单,最好使用
...
(echo open !ftpdomain!)
(echo(!ftpuser!)
(echo(!ftppass!)
(echo binary)
...
括号避免了尾随空格的问题。
echo(
后面丑陋的开括号是为了避免空变量或包含有问题的东西的变量的问题,比如/?
,ON´ or
OFF` `。
发布于 2019-03-12 07:59:34
当然,您可以根本不设置这些变量:
@Echo Off
Echo Example FTP link:
Echo(
Echo "ftp://username:password@domain.ext"
Echo(
Set /P "ftplink= Please enter full FTP link: "
Echo(
Set /P "ftpfile= Please provide the file name you want to download: "
(For /F "Tokens=2-4 delims=/:@" %%A In ("%ftplink%")Do (Echo open %%C
Echo %%A
Echo %%B
Echo binary
Echo hash
Echo mget %ftpfile%
Echo disconnect
Echo quit))>get.ftp
ClS
FTP -i -s:get.ftp
如果需要,您仍然可以保存这些变量以供以后在脚本中使用,只是不需要在循环中使用它们!
(For /F "Tokens=2-4 delims=/:@" %%A In ("%ftplink%")Do (Set "ftpuser=%%A"
Set "ftppass=%%B"
Set "ftpdomain=%%C"
Echo open %%C
Echo %%A
Echo %%B
Echo binary
Echo hash
Echo mget %ftpfile%
Echo disconnect
Echo quit))>get.ftp
https://stackoverflow.com/questions/55110267
复制相似问题