首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >解析和传递Windows批处理文件中的特殊字符

解析和传递Windows批处理文件中的特殊字符
EN

Stack Overflow用户
提问于 2019-03-12 04:55:42
回答 2查看 901关注 0票数 4

我正在尝试写一个批处理文件,它可以接受用户输入的FTP链接,解析出用户,密码和域,将它们写入文件,并调用该文件作为FTP命令的输入。我已经成功地编写了它,直到有人在里面有了一个带有!的密码。

FTP链接是系统生成的,可能包含特殊字符(例如:!^*)。

在使用/:@作为分隔符的for循环中读取完整字符串(即:ftp://userid:password@some.domain.com)时,我使用了setlocal delayedexpansion

我试着更有创意地在解析输出后执行endlocal delayedexpansion,但之后令牌不起作用,因为我要结束扩展。我还尝试将每个令牌写到它自己的文件中,然后将文件的内容作为变量赋值,但没有成功。

我认为应该有一种方法来做到这一点,但我总是碰壁。

下面是我的代码片段:

代码语言:javascript
复制
@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链接:

代码语言:javascript
复制
ftp://username:pas!word@somewhere.com

不幸的是,特殊字符可以在密码字符串中的任何位置,也可以在用户名中。此外,用户名和密码的长度也不一致(即:各8个字符)。我发现这一点是很艰难的。

任何和所有的帮助都非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-12 05:37:22

这是微不足道的(如果你知道怎么做的话)。

关键是仅在禁用的延迟扩展模式下扩展FOR参数(否则延迟扩展阶段将修改!字符)。

但要使用可变内容,请始终使用延迟扩展模式(因为只有延迟扩展才能安全地扩展任何内容)。

因此,您需要切换模式。

参考:SO: How does the Windows Command Interpreter (CMD.EXE) parse scripts?

代码语言:javascript
复制
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

这段代码很简单,最好使用

代码语言:javascript
复制
...
(echo open !ftpdomain!)
(echo(!ftpuser!)
(echo(!ftppass!)
(echo binary)
...

括号避免了尾随空格的问题。

echo(后面丑陋的开括号是为了避免空变量或包含有问题的东西的变量的问题,比如/?ON´ orOFF` `。

票数 3
EN

Stack Overflow用户

发布于 2019-03-12 07:59:34

当然,您可以根本不设置这些变量:

代码语言:javascript
复制
@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

如果需要,您仍然可以保存这些变量以供以后在脚本中使用,只是不需要在循环中使用它们!

代码语言:javascript
复制
(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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55110267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档