2013-07-03 2 views
0

Короче говоря, я хочу знать, как я могу написать командный файл, чтобы найти путь к файлу (внутри файла .csproj), который выглядит следующим образом:Пакетный файл, чтобы найти замену пути файла в файле

..\..\..\..\..\Program Files\file\inside\Repository.dll

и заменить его с правильным именем пути

'C:\Program Files\file\inside\Repository.dll' 

Обратите внимание, как файлы одинаковы. У меня есть несколько файлов, которые правильно определены в моих .csproj-файлах, это просто путь к их неправильной работе. Поэтому я хочу найти и заменить только путь к файлу, а не сам файл. Таким образом, это, по существу, нахождение и замена части строки, а не всей строки.

+0

Вы должны показать более достоверные примеры вашего 'csproj' файла – Endoro

ответ

0

Замена f, a la FOR ... %v IN (...) DO ... %~fv разрешит путь и сделает его полностью квалифицированным путем.

Таким образом, требование заставить это работать - это получить путь к файлу (файлам) в переменной цикла FOR.

FOR /F "delims=*" %%f IN (list_of_files.txt) DO @ECHO %%~ff 

Что касается получения путей из файла .CSPROJ, я не знаю формата. Можете ли вы сказать, как будут выражены пути? Являются ли они атрибутами или контентом XML-элемента? Если их нелегко найти, это будет чрезвычайно ненадежным в зависимости от того, как данные выражаются.

+0

Вот как это выглядит во всех файлах. Структура пути всегда одинакова в каждом файле .csproj, но файл .dll отличается. .. \ .. \ .. \ .. \ .. \ ProgramFiles \ file \ inside \ DataRepository.dll user2296207

+0

Насколько важно для вас, чтобы это было сделано в пакетном режиме/CMD? Perl/Python/почти все намного проще и надежнее. Элемент '' гарантирован (по вашему расчёту), чтобы быть на линии сам по себе? Всегда ли такое же количество пробелов в начале? Я могу создать хакерский пакетный скрипт для этого, но это будет громоздко читать. Если вы начнете с чего-то, что может анализировать XML, вам будет лучше. – mojo

2

вы можете попробовать это:

 
@echo OFF &SETLOCAL 
SET "fpath=C:\Program Files\file\inside\csproj" &REM set path to csproj files 
SET "newext=.new"         &REM set extension for new files 

SET "fname=" 
for /r "%fpath%" %%a in (*.csproj) DO SET "fname=%%~a"&CALL:process 
goto:eof 

:process 
(FOR /f "delims=" %%b IN ('findstr /n "^" "%fname%"') DO (
    SET "line=%%b" 
    SETLOCAL ENABLEDELAYEDEXPANSION 
    SET "line=!line:*:=!" 
    IF "!line:..\..\..\..\..\Program Files\file\inside\DataRepository.dll=!" neq "!line!" (
     SET "line=!line:..\..\..\..\..\Program Files\file\inside\DataRepository.dll=C:\Program Files\file\inside\DataRepository.dll!" 
    ) 
    ECHO(!line! 
    ENDLOCAL 
))>"%fname%%newext%" 
goto:eof 
Смежные вопросы