【问题标题】:Retrieve first character from parameter/string从参数/字符串中检索第一个字符
【发布时间】:2017-05-18 07:57:16
【问题描述】:

所以我要做的是在一个参数中去除字符串中的每个字符,除了第一个字符。

This is the closest I've found so far 但它的工作方式不同。

C:\vbackup.bat test e: c:\temp

@echo off

IF /I NOT "%2" == "c:" (
    :echo %%2:~0,1%     // I personally prefer this since it will only be used once

    :: Test
    SET var=%2
    SET var2=%var:~0,1%
    CALL :show "0,1"
    echo.
    echo Backing up entire %2 to %3\%1

    echo.
    pause
    exit
)

:show
echo Test : var=%var% var2=%var2%
GOTO :eof

结果:

Test : var=e: var2=~0,1

【问题讨论】:

  • 我建议打开一个命令提示符窗口并首先运行call /?。显示在几个窗口页面上的输出帮助解释了如何引用批处理文件参数,而不使用或使用 %~d2 之类的修饰符,该修饰符扩展为仅带有第二个参数冒号的驱动器号,例如 E:。接下来在命令提示符窗口set /? 中运行并阅读关于delayed expansion 的章节,当您在命令块中定义环境变量并希望在同一块中访问此环境变量的值时,您将需要在这里。
  • 你需要一个普通的环境变量来做sub-string expansion,它不能用于像%2这样的参数引用。在单个代码块中修改和读取变量时,需要delayed expansion

标签: batch-file


【解决方案1】:

这应该可行:

something.bat:

@ECHO OFF
SETLOCAL EnableDelayedExpansion
:LOOP
IF NOT "%~1"=="" (
    SET firstChar=%1
    SET firstChar=!firstChar:~0,1!
    ECHO !firstChar!
    SHIFT
    GOTO LOOP
)

调用something.bat abc def ghi jkl 将生成输出:

a
d
g
j

编辑:按照 cmets 中的建议,将 [%1]==[] 替换为 "%~1"==""

【讨论】:

  • 最好使用IF NOT "%~1"==""
  • @npocmaka 这也可以,但为什么IF NOT "%~1"=="" 更好?
  • [] 对于 Windows 命令解释器没有意义。它们也只是要比较的两个字符。但是双引号是有意义的,因为它定义了字符串,即使包含空格或&()[]{}^=;!'+,`~<>|,也应将其解释为一个参数。双引号也通过 IF 进行比较。使用第一行 IF NOT "%~1"=="" (echo true) else (echo false) 和第二行 IF NOT [%1]==[] (echo true) else (echo false) 和第三行 echo Finished 创建一个批处理文件。接下来打开命令提示符窗口并使用单双引号作为参数运行批处理文件。
  • 您会看到错误消息 The syntax of the command is incorrect. 并且第二行和第三行不再执行,因为您的 IF 条件的第二行扩展到 IF NOT ["]==[] (echo true) else (echo false) 以及单双之后的所有内容引号被解释为 IF 条件的一个参数,这意味着缺少运算符、第二个参数和要执行的命令,从而导致语法错误。
猜你喜欢
  • 2020-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
  • 2020-02-14
  • 2013-01-20
  • 1970-01-01
相关资源
最近更新 更多