Цикл для замены c: \, d: \ ... z: \ на \\ имя_сервера \ c $ \ - PullRequest
0 голосов
/ 05 апреля 2019

На самом деле я пытаюсь создать некоторый код для определения прав на общие папки на каждом отдельном сервере, который есть у меня на предприятии.

На данный момент я уже перечислил каждый сервер и экспортировал его в файл .txt, сделал цикл с этим .txt для экспорта в другой файл .txt всех общих папок.

Все это работает нормально, но путь такой: c:\...\...\folder$.Чтобы использовать это, мне нужно сделать цикл, чтобы заменить c:\ d:\ и т. Д. На \\servername\c$\.

Я пытался использовать [system.io.file]::ReadAllText и WriteAllText, он работает нормально дляодна буква, но не нашел способа сделать цикл для него.

Я пробовал

get-content ... -replace "c:\","\\$ServerName\c$\" ` -replace "d:\" ... 

, но получил ошибку о неправильном регулярном выражении, поэтому попытался с [regex]::Escape но не сработало, как ожидалось, ни ...

Powershell

$contenu = [System.IO.File]::ReadAllText("$path\$SharedFolders.txt").Replace("C:\","\\$SharedFolders\c$\")
[System.IO.File]::WriteAllText("$path\$SharedFolders.txt", $contenu)

Powershell

(Get-Content "$path\$SharedFolders.txt") | foreach {
    $_ -replace "C:\","\\$SharedFolders\C$\" `
 -replace "D:\","\\$SharedFolders\D$\" `
[...] | Set-Content "$path\$sharedfolders.txt"}

И мне бы хотелось что-то подобное:

Powershell

('a'..'z').ForEach({ (Get-Content "$path\$SharedFolders.txt" -Raw).replace("$_`:\","\\$SharedFolders\$_$") })

Но я слишком новичок в Powershell, чтобы заставить его работать должным образом

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

Ну, спасибо за вашу помощь, мне просто удается заставить это работать так:


$lecteur=[int][char]'A'

1..26 | % {
    $LR=[char]$lecteur
    $contenu =[System.IO.File]::ReadAllText("$path\$SharedFolders.txt").Replace("${LR}:\","\\$SharedFolders\$LR$\")
    [System.IO.File]::WriteAllText("$path\$SharedFolders.txt", $contenu)
    $lecteur++
}

Надеюсь, это поможет некоторым людям;)

0 голосов
/ 05 апреля 2019
  • Для использования 'a'..'z'
  • вам необходим PSv6. Оператор -replace основан на RegEx, вам нужно экранировать буквальный обратный слеш с другим в шаблоне.
  • следующий @ Lee_Dailey s подсказка построить RegEx с действительными буквами диска

$OFS = '|'
$RE  = ('('+(Get-Psdrive -PSProvider filesystem).where({$_.Displayroot -notmatch '^\\'}).name)+'):\\'
$OFS = $Null

"`$RE = '{0}'" -f $RE

'Loop to replace c:\, d:\ … z:\ with \\servername\c$\' -replace $RE,"\\servername\`${1}$\"

Пример вывода на моем ПК

$RE = '(A|C|D):\\'
Loop to replace \\servername\c$\, \\servername\d$\ … z:\ with \\servername\c$\

Чтение файла с параметром -raw не требует цикла, но все изменения будут сделаны сразу.

$OFS = '|'
$RE  = ('('+(Get-Psdrive -PSProvider filesystem).where({$_.Displayroot -notmatch '^\\'}).name)+'):\\'
$OFS = $Null

$File = "$path\$SharedFolders.txt"
(Get-Content $File -raw) -replace $RE,"\\servername\`${1}$\" |
 Set-Content $File
...