Mam kilka plików konfiguracyjnych w systemie Windows Server 2008 zagnieżdżonych w następujący sposób:
C:\Projects\Project_1\project1.config
C:\Projects\Project_2\project2.config
W mojej konfiguracji muszę wykonać zamianę stringów w następujący sposób:
<add key="Environment" value="Dev"/>
stanie się:
<add key="Environment" value="Demo"/>
Myślałem o użyciu skryptów wsadowych, ale nie było na to dobrego sposobu i słyszałem, że dzięki skryptom PowerShell można to łatwo wykonać. Znalazłem przykłady funkcji znajdź / zamień, ale liczyłem na sposób, aby przeszukać wszystkie foldery w moim katalogu C: \ Projects i znaleźć wszystkie pliki, które kończą się rozszerzeniem „.config”. Kiedy znajdzie jeden, chcę, aby zastąpił moje wartości ciągu.
Jakieś dobre zasoby, aby dowiedzieć się, jak to zrobić, lub jakikolwiek guru PowerShell, który może zaoferować wgląd?
powershell
scripting
replace
find
Brandon
źródło
źródło
Odpowiedzi:
Tutaj pierwsza próba na czubku głowy.
źródło
ls *.config -rec | %{ $f=$_; (gc $f.PSPath) | %{ $_ -replace "Dev", "Demo" } | sc $f.PSPath }
.
pols
. Sam zostałem przez to ukąszony.PowerShell to dobry wybór;) Bardzo łatwo jest wyliczyć pliki w danym katalogu, czytać je i przetwarzać.
Skrypt mógłby wyglądać tak:
Podzieliłem kod na więcej wierszy, aby było dla Ciebie czytelne. Zauważ, że możesz użyć Set-Content zamiast
[IO.File]::WriteAllText
, ale dodaje on nową linię na końcu. Dzięki temuWriteAllText
możesz tego uniknąć.W przeciwnym razie kod może wyglądać następująco:
$c | Set-Content $_.FullName
.źródło
To podejście działa dobrze:
źródło
Get-Content $_
goGet-Content $_.FullName
i odpowiednikiem dlaSet-Content
obsługi plików, które nie znajdowały się w katalogu głównym.Poszedłbym z xml i xpath:
źródło
Ten przykład programu PowerShell szuka wszystkich wystąpień ciągu „\ foo \” w folderze i jego podfolderach, zamienia „\ foo \” na „\ bar \” ORAZ NIE NAPISUJE PONOWNIE plików, które nie zawierają ciągu „\ foo \ „W ten sposób nie niszczysz pliku ze znacznikami daty i godziny ostatniej aktualizacji, w których nie znaleziono ciągu:
źródło
Uważam, że komentarz @Artyom był przydatny, ale niestety nie opublikował odpowiedzi.
To jest skrócona, moim zdaniem najlepsza wersja zaakceptowanej odpowiedzi;
źródło
foreach-object
zamiast%
aliasu podczas wykonywania takiego polecenia. W przeciwnym razie może to spowodować błąd:Expressions are only allowed as the first element of a pipeline
Napisałem małą funkcję pomocniczą do zamiany tekstu w pliku:
Przykład:
źródło
Podczas rekurencyjnej zamiany należy podać ścieżkę i nazwę pliku:
Spowoduje to zamianę wszystkich „starych” na „nowe” z rozróżnianiem wielkości liter we wszystkich plikach w folderach bieżącego katalogu.
źródło