首页 > 解决方案 > 循环将 c:\, d:\ ... z:\ 替换为 \\servername\c$\

问题描述

我实际上正在尝试构建一些代码来识别我企业中每台服务器中共享文件夹的权限。

现在,我已经列出了每台服务器并将其导出到一个 .txt 文件中,在这个 .txt 上执行循环以将所有共享文件夹导出到另一个 .txt 文件中。

所有这一切都很好,但路径就像 : c:\...\...\folder$。为了能够使用它,我需要做一个循环来替换c:\ d:\\\servername\c$\

我试过使用[system.io.file]::ReadAllTextand WriteAllText,它对一个字母工作正常,但没有找到一种方法来循环它。

我试过了

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

但得到一个关于正则表达式无效的错误,所以尝试[regex]::Escape但没有按预期工作......

电源外壳

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

电源外壳

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

我想要这样的东西:

电源外壳

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

但我在 Powershell 中太新手了,无法使其正常工作

标签: powershellshared-directoryaccess-rights

解决方案


  • 您需要 PSv6 才能使用'a'..'z'
  • -replace运算符基于 RegEx,您需要使用模式中的另一个反斜杠来转义文字反斜杠。
  • 按照@Lee_Dailey的提示构建具有有效驱动器号的正则表达式

$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

推荐阅读