Конкатенация сетевого пути + переменная (имя папки) - PullRequest
0 голосов
/ 25 октября 2018

Как я могу объединить этот сетевой путь с этой переменной, введенной пользователем (это будет полный сетевой путь)?

Таким образом, пользователь вводит имя новой папки, например: Folder-123 (будетхранится в переменной $ pjname)

Copy-Item "\\SERVER\Work_3rd\R Drive Structure\Project No\MDCXXXX" -Destination "\\SERVER\Work_3rd" -Recurse

write-host "Folder has been created. Press any key to continue..."
[void][System.Console]::ReadKey($true)    

Write-Host "Please enter the project name: "
$pjname = Read-Host
Write-Output "New Folder will be: $pjname"

Rename-Item -Path "\\SERVER\Work_3rd\MDCXXXX" -NewName $pjname

write-host "Folder has been renamed. Press any key to continue..."
[void][System.Console]::ReadKey($true)

$pathToTemplate = '\\SERVER\Work_3rd\R Drive Structure\Project No\MDCXXXX'

$rootPath2 = '\\SERVER\Work_3rd\'

$rootPath = -join ($rootPath2, $pjname) # this concatenates the new project 
name on to the root folder path**

# $rootPath += $pjname  # this concatenates the new project name on to the 
root folder path

If(Test-Path $rootPath)
{
$CurrentACL = (Get-Item $pathToTemplate).GetAccessControl('Access')
$CurrentACL | Set-Acl -Path $rootPath
}

Эта новая папка, хранящаяся в $ pjname, должна иметь сетевой путь, подобный \\\SERVER\Work-3rd\ + FOLDER NAME.Например, \\\SERVER\Word-3rd\Folder-123

PowerShell не находит окончательный путь к новой папке, поэтому разрешение не применяется к ней.


Я пытаюсь в тестовой областии получить эту проблему ниже:

Folder has been renamed. Press any key to continue...

Get-Acl : Cannot find path '\\SERVER\test-area\Test-123' because it does not exist.
At C:\Users\felipe.sa\Desktop\Script\NewProjectFolder\NewProject-WP_- 
_ProductionV3.ps1:279 char:8
+ $acl = Get-Acl $NewNetworkPath
+        ~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : ObjectNotFound: (:) [Get-Acl], ItemNotFoundException
+ FullyQualifiedErrorId : 
GetAcl_PathNotFound_Exception,Microsoft.PowerShell.Commands.GetAclCommand

You cannot call a method on a null-valued expression.
At C:\Users\felipe.sa\Desktop\Script\NewProjectFolder\NewProject-WP_- 
_ProductionV3.ps1:282 char:1
+ $acl.SetAccessRule($rule)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Всякий раз, когда вы объединяете пути, особенно те, которые предоставляются конечными пользователями, используйте утилиту, которая может выполнить большую часть тяжелой работы.Используйте метод комбинирования , так как конкатенация строк имеет несколько ловушек, которые необходимо без необходимости устранять.

[io.path]::combine('\\server\share', 'newfolder')

Метод объединения будет принимать части пути в виде массива и строить правильный путь.Обратите внимание, что это не проверяет, существует ли путь.Он может хорошо справляться с конечными разделителями путей.Следующие команды дают тот же результат.

[io.path]::combine('\\server\share\', 'newfolder')
[io.path]::combine('\\server\share', 'newfolder') 

Остерегайтесь разделителей начальных путей, хотя:

Если один из последующих путей является абсолютным, то операция объединения сбрасывает начальныйс этим абсолютным путем, отбрасывая все предыдущие объединенные пути.

0 голосов
/ 26 октября 2018

Спасибо, Мэтт и oze4!Странная проблема произошла сейчас.Я использовал решение oze4 и иногда оно работает, а иногда нет.Будет ли это строка, введенная пользователем?

Когда она работала, имя папки было «MDX1111 - XXXX Xxxxxxx Xxxxxxxxx» - 32 символа.Я снова запустил код, используя имя папки «MDX1112 - Xxxxxx Xxxxxxx Xxxxxxxxxx» - 35 символов и получил эту ошибку ниже:

Get-Acl : Cannot find path '\\SERVER\Work_Block_A\MDX1112 - Xxxxxx Xxxxxxx 
Xxxxxxxxxx' because it does not
exist.
At C:\Users\felipe.sa\Desktop\Script\NewProjectFolder\NewProject-WP_- 
_ProductionV1.ps1:125 char:8
+ $acl = Get-Acl $NewNetworkPath
+        ~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : ObjectNotFound: (:) [Get-Acl], ItemNotFoundException
+ FullyQualifiedErrorId : 
GetAcl_PathNotFound_Exception,Microsoft.PowerShell.Commands.GetAclCommand

You cannot call a method on a null-valued expression.
At C:\Users\felipe.sa\Desktop\Script\NewProjectFolder\NewProject-WP_- 
_ProductionV1.ps1:128 char:1
+ $acl.SetAccessRule($rule)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

Есть мысли?

Спасибо.

0 голосов
/ 25 октября 2018

Вы пытаетесь создать новый каталог в этом общем каталоге или переименовать каталог?Похоже, вы пытаетесь переименовать каталог.

Полагаю, это не работает, потому что вы пропускаете конечный "\" на своем пути.Вот пример кода, который добавляет пользовательскую переменную к сетевому пути:

$MyRootPath     = "\\SomeServer\Dir1\Dir2\"
Write-Host "Enter Dir Name"
$myAnswer       = Read-Host

Я напечатал «hello» при запросе нового каталога.

$finalAnswer    = $myAnswer.Trim()
$NewNetworkPath = ("{0}{1}" -f $MyRootPath, $finalAnswer)
$NewNetworkPath

возвращает:

\\SomeServer\Dir1\Dir2\hello
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...