【问题标题】:How to convert a windows batch file into a signle line "cmd /c" command?如何将 Windows 批处理文件转换为单行“cmd /c”命令?
【发布时间】:2014-10-31 21:16:00
【问题描述】:

我有下面的批处理文件,并希望将其转换为单行 cmd /c 命令。

@ECHO OFF
SETLOCAL
FOR /F "TOKENS=2 DELIMS=:." %%I IN ('chcp') DO SET _codepage_=%%I
SET _codepage_=Cp%_codepage_: =%
ECHO %_codepage_%
ENDLOCAL

我试过了:

cmd /c FOR /F "TOKENS=2 DELIMS=:." %I IN ('chcp') DO @SET _codepage_=%I && @SET _codepage_=Cp%_codepage_: =% && @ECHO %_codepage_%

也试过了:

cmd /v:on /c FOR /F "TOKENS=2 DELIMS=:." %I IN ('chcp') DO @SET _codepage_=%I && @SET _codepage_=Cp%_codepage_: =% && @ECHO !_codepage_!

但是这两种方法都不起作用!有谁能帮帮我吗?

【问题讨论】:

    标签: windows batch-file cmd


    【解决方案1】:
    cmd /q/c"for /f "tokens=2delims=:." %a in ('chcp')do for %b in (%a)do echo(Cp%b"
    

    原始代码做了什么?拆分chcp的输出,删除结束点(我不知道,谢谢),将值存储在变量中以从中删除空格并在其前面加上Cp,然后回显变量

    这段代码有什么作用?拆分chcp 的输出,删除结束点,但不是使用变量来删除空格,而是在第一个循环的值上使用附加的for 循环,并且,而不是作为变量的前缀,@ 987654328@包含在回显的数据中。

    【讨论】:

    • 你能解释一下你的答案吗?看来我需要像这样引用我的完整命令:cmd /v:on /q /c "FOR /F "TOKENS=2 DELIMS=:." %I IN ('chcp') DO SET _codepage_=%I && SET _codepage_=Cp!_codepage_: =! && ECHO !_codepage_!"。但我无法理解您的回答,尤其是do echo(Cp%b 部分!
    • 另外,delims 似乎需要额外的 .,因为在德国语言环境中 chcp 结果是 Aktive Codepage: 850. see here
    • @fubar,第一次看到结尾点,谢谢。添加了它的工作原理。
    • 我接受你的回答,尽管我也会发布我最终是如何做到的以及这个脚本的目的。
    • @fubar,不,它不是无效的。 echo( 只是一种习惯。有关完整历史记录,请参阅here。在这种情况下,不需要括号
    【解决方案2】:

    我会使用MC ND answer。但只是为了恶心,我创建了另一个解决方案。

    cmd /v:on /q /c "(for /f "delims=." %a in ('chcp') do for %b in (%a) do set cp=Cp%b) & echo !cp!"
    

    请注意,对于所有解决方案,您可以考虑添加 /D 选项以防止自动运行命令运行。

    【讨论】:

    • 我花了很多时间在 Windows 批处理文件命令中挖掘,我不得不承认我很沮丧!欢迎任何其他解决方案,只是为了好玩!
    【解决方案3】:

    似乎我在 cmd 命令周围缺少双引号。这就是我最终这样做的方式:

    cmd /v:on /q /c "FOR /F "TOKENS=2 DELIMS=:." %I IN ('chcp') DO SET _codepage_=%I && SET _codepage_=Cp!_codepage_: =! && ECHO !_codepage_!"
    

    正如上面提到的MC ND 一样正确:

    cmd /q /c "FOR /F "TOKENS=2 DELIMS=:." %a IN ('chcp') DO FOR %b IN (%a) DO ECHO Cp%b"
    

    我在 Java 中使用这个带有 ProcessBuilder 的命令来获取控制台的代码页并将其传递给进程的 stdout 和 stderr 流,如下所示:

    String encoding = getConsoleEncoding(); // use the above cmd command
    BufferedReader stdout = new BufferedReader( new InputStreamReader(p.getErrorStream(),encoding) );
    

    所以系统命令的结果,例如date /t 将在 Java 中正确显示。

    【讨论】:

    • +1,您可以将&& 转义为^&^&,而不是添加引号。实际上,您只需要一个^&。
    【解决方案4】:

    您可以将以上内容保存到一个文件中,将其命名为 my.bat。然后使用:

    cmd.exe /c "call my.bat"
    

    对于在一个命令行中,不使用批处理文件,您可以:

    FOR /F "TOKENS=2 DELIMS=:." %I IN ('chcp') DO (SET _codepage1_=%I && SET _codepage_=Cp%_codepage1_% && ECHO %_codepage_%)
    

    【讨论】:

    • 我不想创建批处理文件;甚至不是 tmp 的。我认为可以用单行cmd来完成,但是做不到!
    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    相关资源
    最近更新 更多