2013-07-08 4 views
6

Я пытаюсь создать сценарий PowerShell для копирования файла с моего локального компьютера на удаленный компьютер с использованием его IP-адреса.Копировать/передать файл с помощью PowerShell 2.0

Я проверил мое соединение клиент-сервер с помощью следующей команды:

Invoke Command -ComputerName <IP Address> -ScriptBlock {ipconfig} -Credential $credential 

(где $ учетных были введены как раз перед этой командой).

Я пробовал использовать команды Copy-Item и Robocopy, но я не понимаю, возьмут ли они мои учетные данные, а затем позвольте мне скопировать файл с локальной на удаленную машину. Чтобы быть конкретным, могут ли они поддерживать локально для удаленной передачи файлов?

Много раз я сталкивался с такими ошибками, как: Плохое имя пользователя и пароль, путь источника не существует или путь назначения не существует. Но я все еще хотел быть уверенным, что я был на правильном пути и использовал правильные команды для реализации того, что я хочу, или если есть что-то еще, что я должен рассмотреть. Как я могу исправить эту проблему?

+0

Необходимо ввести фактический код и ошибку, которую вы получаете. Не расплывчата. Вы уже что-то пробовали, и он не работает - покажите нам, что вы пробовали, и что такое неудача. – alroc

+0

Powershell запускает команды с теми привилегиями, которые у вас уже есть. Поэтому, если вы можете копировать через gui, тогда Copy-Item должен работать. –

+0

Предлагает: сопоставить сетевой диск, если вы хотите использовать старую команду «net use». Для получения дополнительной информации о дополнительных функциях рассмотрите start-bitstransfer или robocopy –

ответ

7

Похоже, вы пытаетесь скопировать файл с помощью удаленного доступа PowerShell. Как указано в других ответах, было бы проще использовать Copy-Item и/или Robocopy для копирования из источника в общий ресурс на конечном компьютере.

Если вы хотите скопировать файл с помощью удаленного доступа PowerShell, вы можете разбить файл на переменную и использовать его в блоке удаленного сценария. Что-то вроде:

$contents = [IO.File]::ReadAllBytes($localPath) 
Invoke-Command -ComputerName <IP Address> ` 
       -Credential $credential ` 
       -ScriptBlock { [IO.File]::WriteAllBytes('C:\remotepath', $using:contents) } 

Конечно, если файл, который вы читаете, действительно большой, это может привести удаленное соединение для запуска из памяти (по умолчанию, PowerShell ограничивает удаленные соединения около 128 МБ).

Если вы застряли с помощью PowerShell 2, вам необходимо передать байт в качестве параметра блока сценария:

$contents = [IO.File]::ReadAllBytes($localPath) 
Invoke-Command -ComputerName <IP Address> ` 
       -Credential $credential ` 
       -ScriptBlock { 
        param(
         [byte[]] 
         $Contents 
        ) 
        [IO.File]::WriteAllBytes('C:\remotepath', $Contents) 
       } ` 
       -ArgumentList @(,$contents) 

И да, вы должны обернуть $contents в массиве при прохождении его в качестве значения к параметру -ArgumentListи он должен иметь префикс с помощью оператора запятой ,, иначе ваш удаленный блок сценария получит только первый байт.

+0

Спасибо! Я попробовал, но это дало мне эту ошибку: «Использовать переменную невозможно восстановить ........ и она действительна только при вызове ScriptBlock на удаленном компьютере». Принимая во внимание, что я определил $ localPath и $ contents. – sanya

+1

Похоже, вы используете PowerShell 2, а не PowerShell 3. Пожалуйста, подтвердите, посмотрев на значение '$ PSVersionTable'. –

+0

О да, спасибо, что заставило меня заметить эту глупую ошибку. Я пропустил это, так как все мои удаленные машины - это версия 3.0. Я предположил, что это тоже будет. Но вызывает ли это много различий? – sanya

6

Одна из приятных вещей о PowerShell (в отличие от DOS) поддерживает UNC-пути. Так что вы можете только литературно:

Copy-Item -Path <local file path> -Destination \\<server IP>\<share>\<path> 

Возможно, у вашей учетной записи должен быть доступ к этому местоположению. Если вам нужно ввести альтернативные учетные данные, вы можете предварительно аутентифицироваться с помощью net use \\<server IP>\<share> /user:[<domain>\]<user> <password>

+1

Не относится к вопросу, но DOS поддерживает UNC-пути, вы просто не можете изменить текущий каталог ('cd') в каталог UNC. – BACON

+0

Также не имеет значения, но DOS был почти убит десять лет назад. Командная строка! = DOS. – alroc

+1

@BACON Вы можете! Попробуйте 'pushd \\ server \ share' –