Batch file 在Windows批处理文件中解析和传递特殊字符

Batch file 在Windows批处理文件中解析和传递特殊字符,batch-file,special-characters,Batch File,Special Characters,我正在尝试编写一个批处理文件,该文件可以接收FTP链接的用户输入,解析出用户、密码和域,将它们写入一个文件,并调用该文件作为FTP命令的输入。我已经成功地编写了它,直到有人有一个带有的密码在其中 FTP链接由系统生成,可能包含特殊字符(即:!,^,*) 我正在使用setlocaldelayedexpansion读取完整字符串(即:ftp://userid:password@使用/、:和@作为分隔符,在for循环中使用some.domain.com) 在解析输出后,我尝试进行创造性的endloca

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

FTP链接由系统生成,可能包含特殊字符(即:
^
*

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

在解析输出后,我尝试进行创造性的
endlocaldelayedexpansion
,但是标记不起作用,因为我正在结束扩展。我还尝试将每个令牌写入其自己的文件,然后将文件内容作为变量分配,但没有成功

我认为应该有办法做到这一点,但我一直在碰壁

以下是我的代码片段:

@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个字符)。我好不容易才发现

非常感谢您提供的任何帮助。

如果您知道该怎么做,这是微不足道的。
关键是仅在禁用的延迟扩展模式下扩展FOR参数(否则延迟扩展阶段将修改
字符)。
但要使用可变内容,请始终使用延迟扩展模式(因为只有延迟扩展才能安全地扩展任何内容)。
因此,您需要切换模式

参考:

这段代码很简单,使用起来更好

...
(echo open !ftpdomain!)
(echo(!ftpuser!)
(echo(!ftppass!)
(echo binary)
...
圆括号避免了尾随空格的问题。

echo(
后面的丑陋的左括号是为了避免空变量或包含有问题内容的变量出现问题,如
/?
打开或
关闭。

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

@Echo关闭
回送示例FTP链接:
回音(
回声“ftp://username:password@域.ext“
回音(
设置/P“ftplink=请输入完整的FTP链接:”
回音(
Set/P“ftpfile=请提供要下载的文件名:”
(对于/F“代币=2-4个代币=/:@”%%A In(“%ftplink%”)Do(回显打开%%C
回声%%A
回声%%B
回音二进制
回声散列
回波管理%ftpfile%
回音断开
Echo(退出))>get.ftp
ClS
FTP-i-s:get.FTP
您仍然可以保存这些变量,以便以后在脚本中使用,如果需要,您不需要在循环中使用它们

(对于/F“Tokens=2-4 delims=/:@”%%A In(“%ftplink%”)Do(设置“ftpuser=%%A”
设置“ftppass=%%B”
设置“ftpdomain=%%C”
回声打开%%C
回声%%A
回声%%B
回音二进制
回声散列
回波管理%ftpfile%
回音断开
Echo(退出))>get.ftp

答案就是这样。一旦你知道答案,它们就变得微不足道。在你知道答案之前,它们可能会让人恼火。感谢你提供的解决方案、解释和链接。现在,对我们中的更多人来说,它们可能变得微不足道。:)
...
(echo open !ftpdomain!)
(echo(!ftpuser!)
(echo(!ftppass!)
(echo binary)
...