CMD中反向输出
Output in Reverse in CMD
我有一个短语需要在results.txt中输出。该短语来自 x.txt。例如:"I have two kids",在results.txt中应该输出"kids two have I"。
更新
它已经在工作了,但我不想循环。
请看下面的代码
代码
@ECHO OFF
set /p content=<x.txt
SET var=!content: =,!
SET rev=
:LOOP
IF NOT "!var!"=="" (
FOR /F "delims=, tokens=1,*" %%F IN ("!var!") DO (
SET rev=%%F,!rev!
SET var=%%G
)
) ELSE (
SET rev=!rev:~0,-1!
GOTO ENDLOOP
)
GOTO LOOP
:ENDLOOP
ECHO !rev:,= ! > results.txt
这里有三种不同的方式。
- 替换魔法(借自 Aacini)
- 对于代币
- 递归
@echo off
setlocal EnableDelayedExpansion
set "var=One two three four five"
call :rev1
call :rev2
call :rev3
exit /b
:rev1 -- replacement magic
setlocal
set "rev="
set rev=%var: = !rev!&Set rev=% !rev!
echo %0 !rev!
exit /b
:rev2 -- FOR toekns
setlocal
FOR /F "tokens=1-5" %%1 in ("%var%") do set "rev=%%5 %%4 %%3 %%2 %%1"
echo %0 !rev!
exit /b
:rev3 -- recursion
setlocal
set "rev="
call :__rev3_rec %var%
echo %0 !rev!
exit /b
:__rev3_rec
if "%1" == "" exit /b
call :__rev3_rec %2 %3 %4 %5
set "rev=%rev%%1 "
exit /b
这会获取文本文件的前四个单词(每行)并以相反的顺序将它们重写为 result.txt
:
>result.txt (for /f "tokens=1-4" %%a in (x.txt) do echo %%d %%c %%b %%a)
另一种解决方案(单行文本文件,字数不限):
@ECHO OFF
setlocal enabledelayedexpansion
echo I have two little but wonderful kids>x.txt
<x.txt set /p x=
for %%a in (%x%) do set "res=%%a !res!"
>result.txt echo %res:~0,-1%
(尽管从技术上讲,for
命令 本身就是 一个循环)
没有任何形式的循环,如果你能忍受前面的一些空间:
@ECHO OFF
setlocal
echo I have two kids>x.txt
<x.txt set /p x=
call :reverse %x%
goto :eof
:reverse
set "rev=%9 %8 %7 %6 %5 %4 %3 %2 %1"
echo Reverse without any form of loop: "%rev%"
for /f "tokens=*" %%a in ("%rev%") do echo To get rid of the spaces, you need a FOR loop: "%%a"
由于cmd
仅支持%1
到%9
,因此限制为最多九个单词
您可以使用 shift
命令使用更多参数(单词),但这意味着使用循环。
我不确定我是否完全理解你的问题,所以这是为了颠倒每行每个 space 分隔子字符串的顺序。
对于这项任务,我会利用 PowerShell。
在 powershell 提示符下,(powershell.exe):
GC '.\x.txt'|%{$L=$_.Split(' ');[Array]::Reverse($L);$L -Join ' '}|SC '.\results.txt'
在 command-prompt、(cmd.exe):
"%__AppDir__%WindowsPowerShell\v1.0\powershell.exe" -NoP "GC '.\x.txt'|%{$L=$_.Split(' ');[Array]::Reverse($L);$L -Join ' '}|SC '.\results.txt'
来自 batch-file:
@"%__AppDir__%WindowsPowerShell\v1.0\powershell.exe" -NoP "GC '.\x.txt'|%%{$L=$_.Split(' ');[Array]::Reverse($L);$L -Join ' '}|SC '.\results.txt'
如果您只处理文件的第一行,而不是所有行,则需要稍作修改。
在 powershell 提示符下,(powershell.exe):
GC '.\x.txt' -To 1|%{$L=$_.Split(' ');[Array]::Reverse($L);$L -Join ' '}|SC '.\results.txt'
在 command-prompt、(cmd.exe):
"%__AppDir__%WindowsPowerShell\v1.0\powershell.exe" -NoP "GC '.\x.txt' -To 1|%{$L=$_.Split(' ');[Array]::Reverse($L);$L -Join ' '}|SC '.\results.txt'
来自 batch-file:
@"%__AppDir__%WindowsPowerShell\v1.0\powershell.exe" -NoP "GC '.\x.txt' -To 1|%%{$L=$_.Split(' ');[Array]::Reverse($L);$L -Join ' '}|SC '.\results.txt'
请注意,在这两种情况下,如果您的字符串实际上是双引号,则它们不会移动位置。这意味着 "I have two kids"
将输出为 kids" two have "I
,而不是 "kids two have I"
.
我有一个短语需要在results.txt中输出。该短语来自 x.txt。例如:"I have two kids",在results.txt中应该输出"kids two have I"。
更新
它已经在工作了,但我不想循环。 请看下面的代码
代码
@ECHO OFF
set /p content=<x.txt
SET var=!content: =,!
SET rev=
:LOOP
IF NOT "!var!"=="" (
FOR /F "delims=, tokens=1,*" %%F IN ("!var!") DO (
SET rev=%%F,!rev!
SET var=%%G
)
) ELSE (
SET rev=!rev:~0,-1!
GOTO ENDLOOP
)
GOTO LOOP
:ENDLOOP
ECHO !rev:,= ! > results.txt
这里有三种不同的方式。
- 替换魔法(借自 Aacini)
- 对于代币
- 递归
@echo off
setlocal EnableDelayedExpansion
set "var=One two three four five"
call :rev1
call :rev2
call :rev3
exit /b
:rev1 -- replacement magic
setlocal
set "rev="
set rev=%var: = !rev!&Set rev=% !rev!
echo %0 !rev!
exit /b
:rev2 -- FOR toekns
setlocal
FOR /F "tokens=1-5" %%1 in ("%var%") do set "rev=%%5 %%4 %%3 %%2 %%1"
echo %0 !rev!
exit /b
:rev3 -- recursion
setlocal
set "rev="
call :__rev3_rec %var%
echo %0 !rev!
exit /b
:__rev3_rec
if "%1" == "" exit /b
call :__rev3_rec %2 %3 %4 %5
set "rev=%rev%%1 "
exit /b
这会获取文本文件的前四个单词(每行)并以相反的顺序将它们重写为 result.txt
:
>result.txt (for /f "tokens=1-4" %%a in (x.txt) do echo %%d %%c %%b %%a)
另一种解决方案(单行文本文件,字数不限):
@ECHO OFF
setlocal enabledelayedexpansion
echo I have two little but wonderful kids>x.txt
<x.txt set /p x=
for %%a in (%x%) do set "res=%%a !res!"
>result.txt echo %res:~0,-1%
(尽管从技术上讲,for
命令 本身就是 一个循环)
没有任何形式的循环,如果你能忍受前面的一些空间:
@ECHO OFF
setlocal
echo I have two kids>x.txt
<x.txt set /p x=
call :reverse %x%
goto :eof
:reverse
set "rev=%9 %8 %7 %6 %5 %4 %3 %2 %1"
echo Reverse without any form of loop: "%rev%"
for /f "tokens=*" %%a in ("%rev%") do echo To get rid of the spaces, you need a FOR loop: "%%a"
由于cmd
仅支持%1
到%9
,因此限制为最多九个单词
您可以使用 shift
命令使用更多参数(单词),但这意味着使用循环。
我不确定我是否完全理解你的问题,所以这是为了颠倒每行每个 space 分隔子字符串的顺序。
对于这项任务,我会利用 PowerShell。
在 powershell 提示符下,(powershell.exe):
GC '.\x.txt'|%{$L=$_.Split(' ');[Array]::Reverse($L);$L -Join ' '}|SC '.\results.txt'
在 command-prompt、(cmd.exe):
"%__AppDir__%WindowsPowerShell\v1.0\powershell.exe" -NoP "GC '.\x.txt'|%{$L=$_.Split(' ');[Array]::Reverse($L);$L -Join ' '}|SC '.\results.txt'
来自 batch-file:
@"%__AppDir__%WindowsPowerShell\v1.0\powershell.exe" -NoP "GC '.\x.txt'|%%{$L=$_.Split(' ');[Array]::Reverse($L);$L -Join ' '}|SC '.\results.txt'
如果您只处理文件的第一行,而不是所有行,则需要稍作修改。
在 powershell 提示符下,(powershell.exe):
GC '.\x.txt' -To 1|%{$L=$_.Split(' ');[Array]::Reverse($L);$L -Join ' '}|SC '.\results.txt'
在 command-prompt、(cmd.exe):
"%__AppDir__%WindowsPowerShell\v1.0\powershell.exe" -NoP "GC '.\x.txt' -To 1|%{$L=$_.Split(' ');[Array]::Reverse($L);$L -Join ' '}|SC '.\results.txt'
来自 batch-file:
@"%__AppDir__%WindowsPowerShell\v1.0\powershell.exe" -NoP "GC '.\x.txt' -To 1|%%{$L=$_.Split(' ');[Array]::Reverse($L);$L -Join ' '}|SC '.\results.txt'
请注意,在这两种情况下,如果您的字符串实际上是双引号,则它们不会移动位置。这意味着
"I have two kids"
将输出为 kids" two have "I
,而不是 "kids two have I"
.