Скрипт Powershell - замените FilePath для всех URI, указанных в текстовом файле. - PullRequest
0 голосов
/ 30 октября 2019

Я новичок в Power-Shell. Пожалуйста, потерпите меня.

Учитывая текстовый файл с несколькими путями файлов, каждый из которых разделен новой строкой, я пытаюсь заменить путь к файлу каждого из них новым путем для того же файла.

Пример: Входной файл:

C:\Project\SharedLib\Shared\log4net.dll
C:\Project\SharedLib\Shared\Aspose.dll
C:\Dependency\SL\UnStable\Crystal.dll

Выходной файл:

\\ServerName\websites$\Stable\Release\log4net.dll
\\ServerName\websites$\Stable\Release\Aspone.dll
\\ServerName\websites$\Stable\Release\Crystal.dll

Моя попытка:

Get-ChildItem "*.txt" -Filter *.txt | 
Foreach-Object {

    foreach($line in Get-Content $_) {

        $currentPath = [System.IO.Path]::GetDirectoryName($line)
        ($line) -replace $currentPath, '\\ServerName\websites$\Stable\Release\' | Set-Content $line
    }
}

Ошибка назаменить линию. Пожалуйста, помогите!

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

Сообщение об ошибке, которое я получал, было

The regular expression pattern C:\Project\SharedLib\Shared is not valid.
At C:\temp\StackOverflow.ps1:6 char:9
+         ($line) -replace $currentPath, '\\ServerName\websites$\Stable ...
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (C:\Project\SharedLib\Shared:String) [], RuntimeException
    + FullyQualifiedErrorId : InvalidRegularExpression

Это говорит мне, что строка C: \ Project \ SharedLib обрабатывается как шаблон RegEx - и нам нужно выйтиоператоры. (Вот почему вы часто увидите, что обратные слеши удваиваются - они экранированы.)

Не нужно помнить, что они все есть - вы можете использовать [regex] :: escape ($ currentPath), чтобы сделать это за вас,

Get-ChildItem "*.txt" -Filter *.txt | 
Foreach-Object {

    foreach($line in Get-Content $_) {

        $currentPath = [System.IO.Path]::GetDirectoryName($line)
        ($line) -replace [regex]::escape($currentPath), '\\ServerName\websites$\Stable\Release\' | Set-Content $line
    }
}
0 голосов
/ 30 октября 2019

для получения имени файла используется Split-Path. затем он использует Join-Path для создания нового полного пути. [ ухмылка ]

$SourceFile = "$env:TEMP\Reddy-In.txt"
$DestFile = "$env:TEMP\Reddy-Out.txt"

# create a file to work with
#    remove this section when ready to use your own data
@'
C:\Project\SharedLib\Shared\log4net.dll
C:\Project\SharedLib\Shared\Aspose.dll
C:\Dependency\SL\UnStable\Crystal.dll
'@ | Set-Content -LiteralPath $SourceFile

$Prefix = '\\ServerName\websites$\Stable\Release'

$InStuff = Get-Content -LiteralPath $SourceFile
$Results = foreach ($IS_Item in $InStuff)
    {
    $FileName = Split-Path -Path $IS_Item -Leaf
    Join-Path -Path $Prefix -ChildPath $FileName
    }

# display on screen
$Results

# send to a text file
$Results |
    Set-Content -LiteralPath $DestFile

вывод на экран ...

\\ServerName\websites$\Stable\Release\log4net.dll
\\ServerName\websites$\Stable\Release\Aspose.dll
\\ServerName\websites$\Stable\Release\Crystal.dll

содержание текстового файла ...

\\ServerName\websites$\Stable\Release\log4net.dll
\\ServerName\websites$\Stable\Release\Aspose.dll
\\ServerName\websites$\Stable\Release\Crystal.dll
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...