Board logo

标题: [文件操作] 批处理命令for /f 集里的("abcdefg"),如何分成7段? [打印本页]

作者: smatenchen    时间: 2022-6-1 00:48     标题: 批处理命令for /f 集里的("abcdefg"),如何分成7段?

本帖最后由 smatenchen 于 2022-6-2 21:04 编辑



for /f 集里的("abcdefg"),如何分成a,b,c,d,e,f,g,这样的7段?


1
for /f “delims=?”%%i in ("abcdefg") do echo %%i
如何将"abcdefg"分成7段,再显示成“a b c d e f g”,或"a-b-c-d-e-f-g",或"a,b,c,d,e,f,g"呢?


2
用什么分隔符呢?命令语句怎么写呢?
作者: qixiaobin0715    时间: 2022-6-1 08:38

字符连在一起,你说哪里有分隔符呢?应用你所说的for /f加delims无法分隔,可以考虑其它方式:
  1. @echo off
  2. set var1=abcdefg
  3. :a
  4. set var2=%var1:~0,1%
  5. set var1=%var1:~1%
  6. echo,%var2%
  7. if not "%var1%"=="" goto :a
  8. pause
复制代码

作者: smatenchen    时间: 2022-6-2 21:07

回复 2# qixiaobin0715



1
感谢大神!


2
你的代码,有效。


3
鄙人的意思是,要显示成“a b c d e f g”,或"a-b-c-d-e-f-g",或"a,b,c,d,e,f,g",
而非单显。


4
大神,有解法吗?
作者: qixiaobin0715    时间: 2022-6-6 14:00

回复 3# smatenchen
  1. @echo off
  2. set var1=abcdefg
  3. :a
  4. set var2=%var1:~0,1%
  5. set var1=%var1:~1%
  6. set var=%var%,%var2%
  7. if not "%var1%"=="" goto :a
  8. set var=%var:~1%
  9. echo,%var%
  10. pause
复制代码

作者: smatenchen    时间: 2022-6-8 17:45

回复 4# qixiaobin0715



1
感谢大神!


2
大神的代码,有效。感谢!


3
这样传递变量,蛮有趣的。


4
代码的世界,人类的思维不好懂。


5
二进制思维,如何跃升为人类思维,自然语言?


6
人类的思维,是如何运作的?怎么完成逻辑运算?
作者: idwma    时间: 2022-6-8 21:09

回复 5# smatenchen


    5给道友推荐一本书 '龙书'
作者: smatenchen    时间: 2022-6-8 22:35

回复 6# idwma


   
作者: hfxiang    时间: 2022-7-18 11:52

@echo off
setlocal EnableDelayedExpansion
set "var1=abcdefg"
set "var2="
for /l %%i in (0,1,6) do call set "var2=!var2!-%%var1:~%%i,1%%"
echo;%var2:~1%
endlocal
作者: smatenchen    时间: 2022-7-19 20:29

本帖最后由 smatenchen 于 2022-7-19 20:34 编辑

回复 8# hfxiang



@echo off
setlocal EnableDelayedExpansion
set "var1=abcdefg"
set "var2="
for /l %%i in (0,1,6) do call set "var2=!var2!-%%var1:~%%i,1%%"
echo;%var2:~1%
endlocal

1,
感谢大神!

2,
其中,do call set,是什么用法?

3,
call不是用来调用其它批处理的吗?
怎么还可以有这样的用法吗?
具体含义,请大神细解一下。

4,
省掉call,写成do set,不行吗?

5,
%var1:~%%i,1%,这句含义明确,再在其外套一层%%,是何意呢?

6,
因为,其内有%%i,故也要仿照使用%吗?。


作者: hfxiang    时间: 2022-7-20 08:54

第2、第3及第5其实是同1个问题:do call set 主要为解决for内字符串截取时“~”后跟变量的问题;

第4个问题:省掉 call,写成 do set,行不行你可自行测试(代码已是现成,其实测试才是最好的老师);

第6个问题:你说对了。
作者: smatenchen    时间: 2022-7-20 20:22

回复 10# hfxiang



1,
感谢大神!


2,
查看call的帮助,没有这类用法的讲解。


3,
for的帮助,也没细讲,如何用转义,用变量……。


4,
这样,学起来就费劲了!
得从其它地方去一点点积累了。


5,
微软,甚不是个玩艺哎!
作者: ZDG0000    时间: 2022-7-22 01:32

沙雕年年有!!!
作者: smatenchen    时间: 2022-7-22 16:39

回复 12# ZDG0000


作者: CrLf    时间: 2022-7-24 00:00

  1. @echo off & setlocal enabledelayedexpansion
  2. cmd /u /c "echo abcdefg" | for /f "delims=" %%a in ('more') do (
  3. for %%b in (%%a) do echo %%b
  4. )
复制代码

作者: hfxiang    时间: 2022-7-24 09:21

回复 14# CrLf


太厉害了!!!但不知其所以然。
同时俺在Win10命令行下,如下单条指令也能出同样的结果,太神奇了
cmd /u /c "echo abcdefg"|for /f "delims=" %a in ('more') do @echo %a
作者: CrLf    时间: 2022-7-26 23:01

回复 15# hfxiang


    原理是 cmd /u 会将内容按unicode编码输出,其中原本的单字节字符后会额外加一个 00(NUL字符),而more会将 00 变成 0D 0A(回车换行符)

    确实只要一层for就可以了,写的时候记成more会把NUL替换成空格,所以多写了一层
作者: smatenchen    时间: 2022-8-20 08:26

回复 16# CrLf


作者: Batcher    时间: 2023-7-24 18:56

回复 14# CrLf
  1. @echo off
  2. for /f "delims=" %%i in ('cmd /q /u /c set /p "=abcdefg" ^< nul ^| find /v ""') do (
  3.     echo,%%i
  4. )
  5. pause
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2