PowerShell Создать папку на удаленном сервере

Следующий сценарий не добавляет папку на мой удаленный сервер. Вместо этого он помещает папку на мою машину! Почему он это делает? Каков правильный синтаксис, чтобы добавить его?

$setupFolder = "c:\SetupSoftwareAndFiles"

$stageSrvrs | ForEach-Object {
  Write-Host "Opening Session on $_"
  Enter-PSSession $_

  Write-Host "Creating SetupSoftwareAndFiles Folder"

  New-Item -Path $setupFolder -type directory -Force 

  Write-Host "Exiting Session"

  Exit-PSSession

}

person ChiliYago    schedule 07.03.2011    source источник


Ответы (5)


Командлет Enter-PSSession можно использовать только в сценарии интерактивного удаленного взаимодействия. Вы не можете использовать его как часть блока сценария. Вместо этого используйте Invoke-Command:

$stageSvrs | %{
         Invoke-Command -ComputerName $_ -ScriptBlock { 
             $setupFolder = "c:\SetupSoftwareAndFiles"
             Write-Host "Creating SetupSoftwareAndFiles Folder"
             New-Item -Path $setupFolder -type directory -Force 
             Write-Host "Folder creation complete"
         }
}
person ravikanth    schedule 08.03.2011

Путь UNC также работает с New-Item

$ComputerName = "fooComputer"
$DriveLetter = "D"
$Path = "fooPath"
New-Item -Path \\$ComputerName\$DriveLetter$\$Path -type directory -Force 
person Barry MSIH    schedule 08.05.2014
comment
Не работает для меня. Мне пришлось добавить FileSystem:: перед путем UNC. Пример: FileSystem::\\servername\path\newfolder - person Alex Kwitny; 18.05.2018

Для тех, у кого -ScriptBlock не работает, вы можете использовать это:

$c = Get-Credential -Credential 
$s = $ExecutionContext.InvokeCommand.NewScriptBlock("mkdir c:\NewDir")
Invoke-Command -ComputerName PC01 -ScriptBlock $s -Credential $c
person Mark Varnas    schedule 18.09.2013
comment
Старый поток, но для всех, кто работает таким образом: когда вы говорите, что ScriptBlock не работает, я думаю, вы можете столкнуться с проблемой, когда локальные переменные не передаются в удаленный сеанс. Взгляните сюда: stackoverflow.com/questions/36328690/ - person duct_tape_coder; 26.04.2019

Следующий код создаст новую папку на удаленном сервере, используя имя сервера, указанное в $server. В приведенном ниже коде предполагается, что учетные данные хранятся в MySecureCredentials и настроены заранее. Просто вызовите createNewRemoteFolder "<Destination-Path>", чтобы создать новую папку.

function createNewRemoteFolder($newFolderPath) {

    $scriptStr = "New-Item -Path $newFolderPath -type directory -Force"
    $scriptBlock = [scriptblock]::Create($scriptStr)

    runScriptBlock $scriptBlock
}


function runScriptBlock($scriptBlock) {

    Invoke-Command -ComputerName $server -Credential $MySecureCreds -ScriptBlock $scriptBlock
}
person Jared    schedule 09.05.2018

person    schedule
comment
Хотя этот фрагмент кода может быть решением, включая объяснение действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос для будущих читателей, и эти люди могут не знать причин вашего предложения кода. - person Mickael B.; 01.05.2020