【问题标题】:How to differentiate password containing @ and host name starting also with @?如何区分包含@的密码和以@开头的主机名?
【发布时间】:2016-08-27 11:52:00
【问题描述】:

我将使用用户名、密码和主机 IP 作为参数运行一个批处理脚本,格式如下:

用户名:密码@hostip

但我的密码包含@ 符号。所以它输出找不到主机。

例如:

batch.bat root:pass@q@10.120.36.65

我将如何通过批处理脚本执行此操作?

【问题讨论】:

  • 这是用于 FTP 的?还是别的什么??如果这是用于 FTP ==> 看看这个 ==> How to open an FTP folder in Windows via VBScript
  • 这个参数是batch.bat解析的吗?如果是这样,您需要显示代码。或者它只是简单地输入了一些未经编辑的命令?如果是这样,您需要告诉我们它是什么命令。否则我们只能猜测......
  • 感谢您的所有回答。但我的问题是批处理文件在内部调用了另外一个 ruby​​ 文件,并且匹配它的正则表达式被写在那里。所以我对 ruby​​ 进行了更改并且它起作用了!

标签: batch-file scripting


【解决方案1】:
@echo off
setlocal

for /F "tokens=1,2* delims=:@" %%a in ("%1") do (
   set "user=%%a"
   set "pass=%%b"
   set "host=%%c"
)
for /F "tokens=1* delims=@" %%a in ("%host%") do (
   if "%%b" neq "" (
      set "pass=%pass%@%%a"
      set "host=%%b"
   )
)

echo Username: "%user%"
echo Password: "%pass%"
echo HostIP:   "%host%"

输出示例:

C:\> batch.bat username:password@hostip
Username: "username"
Password: "password"
HostIP:   "hostip"

C:\> batch.bat root:pass@q@10.120.36.65
Username: "root"
Password: "pass@q"
HostIP:   "10.120.36.65"

【讨论】:

    【解决方案2】:

    这是我将字符串拆分为用户名、密码和主机 IP 地址或主机名的批处理代码:

    @echo off
    setlocal EnableDelayedExpansion
    if "%~1" == "" goto OutputError
    
    set "NameUser="
    set "Password="
    set "HostNameIP="
    
    for /F "tokens=1,2 delims=:" %%I in ("%~1") do (
        set "NameUser=%%I"
        set "Password=%%J"
        set "HostNameIP=%%J"
    )
    
    rem Is there a colon at all in string and something after the colon?
    if "%Password%" == "" goto OutputError
    
    rem Is there at least one At sign in argument string after first colon?
    if "%Password:@=%" == "%HostNameIP%" goto OutputError
    
    rem Get host name/IP which is the string after last At sign.
    rem The argument string should not end with an At sign.
    :GetHostNameIP
    set "HostNameIP=%HostNameIP:*@=%"
    if "%HostNameIP%" == "" goto OutputError
    if not "%HostNameIP:@=%" == "%HostNameIP%" goto GetHostNameIP
    
    rem Get password which is the string between first colon and last
    rem At sign which is here the password string with all (hopefully
    rem only one) @HostNameIP removed from password string.
    set "Password=!Password:@%HostNameIP%=!"
    
    rem Is there a password in argument string?
    if "%Password%" == "" goto OutputError
    
    echo The user name is: %NameUser%
    echo The password is:  %Password%
    echo Host name/IP is:  %HostNameIP%
    goto EndBatch
    
    :OutputError
    echo.
    echo ERROR: username:password@host not specified correct.
    
    :EndBatch
    echo.
    endlocal
    pause
    

    密码字符串可以包含 1 个或更多的 At 符号。很可能总是只有 1 个@,因为电子邮件地址被用作密码,尽管这不适合密码。

    当然,要求批处理文件使用 3 个单独的参数(用户名、密码和主机 IP 地址)执行会容易得多,因为这样就没有必要将单个参数字符串拆分为 3 个单独的字符串。

    此外,我认为从批处理文件中执行的控制台应用程序需要username:password@hostip。与此串联变体相比,大多数此控制台应用程序还支持另一种指定用户名、密码和主机 IP 地址的变体,至少用于密码的分隔字符串。如果控制台应用程序支持,使用单独指定的 3 个字符串调用控制台应用程序绝对是个好主意。

    注意USERNAME 是一个预定义的环境变量,不应用于此批处理文件,这就是使用NameUser 的原因。

    要了解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

    • call /? ... 解释 %~1(第一个参数字符串不带双引号)
    • echo /?
    • endlocal /?
    • for /?
    • goto /?
    • pause /?
    • rem /?
    • set /?
    • setlocal /?

    【讨论】:

      猜你喜欢
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      • 2015-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多