Выход в обратном порядке в CMD - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть фраза, которая должна быть выведена в results.txt. Фраза происходит из x.txt. Например: «У меня двое детей», он должен вывести «дети двое имеют меня» в results.txt.

ОБНОВЛЕНИЕ

Уже работает, но я не хочу л oop. Пожалуйста, см. Код ниже

Код

@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

Ответы [ 3 ]

1 голос
/ 24 февраля 2020

Это берет первые четыре слова (каждой строки) текстового файла и переписывает их в обратном порядке в 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 сама по себе al oop)

Без какой-либо формы al oop, если вы можете жить с некоторыми пробелами спереди:

@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, но это будет означать использование al oop.

0 голосов
/ 24 февраля 2020

Я не уверен, что полностью понял ваш вопрос, поэтому он предназначен для изменения порядка каждой подстроки, разделенной пробелом, в строке.

Для этой задачи я бы использовал PowerShell.



В приглашении , (powershell.exe) :
GC '.\x.txt'|%{$L=$_.Split(' ');[Array]::Reverse($L);$L -Join ' '}|SC '.\results.txt'

В командной строке , (cmd.exe) :

"%__AppDir__%WindowsPowerShell\v1.0\powershell.exe" -NoP "GC '.\x.txt'|%{$L=$_.Split(' ');[Array]::Reverse($L);$L -Join ' '}|SC '.\results.txt'

Из :

@"%__AppDir__%WindowsPowerShell\v1.0\powershell.exe" -NoP "GC '.\x.txt'|%%{$L=$_.Split(' ');[Array]::Reverse($L);$L -Join ' '}|SC '.\results.txt'



Если вы работаете только с первой строкой файла, в отличие от всех них, требуется небольшая модификация.

По приглашению , (powershell .exe) :

GC '.\x.txt' -To 1|%{$L=$_.Split(' ');[Array]::Reverse($L);$L -Join ' '}|SC '.\results.txt'

В командной строке , (cmd.exe) :

"%__AppDir__%WindowsPowerShell\v1.0\powershell.exe" -NoP "GC '.\x.txt' -To 1|%{$L=$_.Split(' ');[Array]::Reverse($L);$L -Join ' '}|SC '.\results.txt'

От a :

@"%__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".
0 голосов
/ 24 февраля 2020

Вот три разных способа.

  1. Маги на замену c (заимствовано у Аасини)
  2. Для токенов
  3. Рекурсия
@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
...