Я хочу изменить переменную с some\original\path на some\replaced\path , выполнив поиск-замену и изменив "оригинальную" часть пути.

set x=some\original\path
set y= ????
(y is now some\replaced\path)

Как мне сделать это в пакетном файле Windows? Обратите внимание, что:

  • Я хочу, чтобы код был гибким, поэтому не нужно жестко кодировать строки или символьные индексы.
  • Я в порядке с решением Powershell тоже. Я ищу то, что является самым простым, наиболее устойчивым и может работать на моем компьютере с Windows 7.

Решение:

В пакетных файлах вы можете выполнять замену строк в процессе интерполяции %%

set y=%x:original=replaced%

4 ответа4

2

С PowerShell вы можете использовать оператор -replace :

$x = 'some\original\path'
$y = $x -replace 'original','replaced'

Оператор -replace использует регулярные выражения, поэтому вы также можете сделать:

$y = $x -replace '\\\w+\\','\replaced\'
1

Изменить: Чтобы ответить на уточненный вопрос:

Если вы можете убедиться, что original всегда один и тот же, и только один раз в пути, используйте:

@Echo Off
Set "Find=original"
Set "Replace=replaced"
Set "OldPath=%~1"
Call Set "NewPath=%%OldPath:\%Find%\=\%Replace%\%%"
Echo %NewPath%

Это заменит первый экземпляр \original\ на \replaced\ replace \. Тестирование:

C:\> ChangePath.bat "Alice\original\Clive"
Alice\replaced\Clive

C:\> ChangePath.bat "Alice\original\Clive\Denver"
Alice\replaced\Clive\Denver

C:\> ChangePath.bat "Alice\Bob\original\Clive"
Alice\Bob\replaced\Clive

Предыдущий ответ

Чтобы изменить второй раздел пути, вы можете использовать:

@Echo Off
Set "Replace=Replacement Path"
Set "PathABC=%~1"
Set "PathBC=%PathABC:*\=%"
Call Set "PathA=%%PathABC:\%PathBC%=%%"
Set "PathC=%PathBC:*\=%"
Set "NewPath=%PathA%\%Replace%\%PathC%"
Echo %NewPath%

Тестирование:

C:\> ChangePath.bat "Alice\Bob\Clive"
Alice\Replacement Path\Clive

Это зависит от того, нет ли главного слеша. Он заменяет текст между первым и вторым слешем.


Изменить: Чтобы объяснить, что означает %% .

%% - это способ избежать знака процента. Если бы я написал следующую строку, он бы рассматривал % Green 50% как переменную. Поскольку эта переменная не определена, она запишет следующий вывод.

C:\> Echo Red 90% Green 50% Blue 5%
Red 90 Blue 5%

Что мне нужно написать это:

C:\> Echo Red 90%% Green 50%% Blue 5%%
Red 90% Green 50% Blue 5%

Следующая строка проходит несколько преобразований. Вот каждый шаг его трансформации.

:: Original line
Call Set "NewPath=%%OldPath:\%Find%\=\%Replace%\%%"

:: The variables encased in single `%` are evaluated:
Call Set "NewPath=%%OldPath:\original\=\replaced\%%"

:: `Call` runs the rest of the line as a command.  The `%%` are evaluated to `%`.
Set "NewPath=%OldPath:\original\=\replaced\%"

:: The search and replace on `OldPath` occurs.
Set "NewPath=Alice\replaced\Clive"

:: The final command is processed.
1

Не ясно, если это то, что вам нужно, но в PowerShell замена строк довольно проста:

$x = "some\original\path"
$y = $x.Replace("original", "replaced")

Должен получить то, что хотел (надеюсь).

0

В Powershell заменить строку:

$string1 = "blah1\blah2.txt"
$toFind = "blah1"
$toReplace = "blah2"
$string1 = $string1.replace($toFind,$toReplace)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .