Powershell-Invoke-Command의 scriptblock에있는 "Copy-item"명령

Sep 02 2020

powershell 스크립트를 사용하여 한 원격 서버에서 다른 서버로 파일을 복사해야합니다.

내가 시도한 것 :-

다음 powershell 명령을 사용하는 동안 잘 작동합니다. (한 서버에서 다른 서버로 파일이 복사되었음을 의미합니다)

하지만 다음 스크립트를 사용하는 동안 다음과 같이 "경로를 찾을 수 없습니다 ..."라는 오류가 발생합니다.

실제로 해당 경로에 파일이 있습니다.

나는 이미 질문에 대한 답변을 스택 오버플로를 참조하려고했습니다.

  • 자격 증명을 사용하여 파일을 원격 서버에 복사하기위한 PowerShell 명령 오류
  • 'Session'매개 변수가 PowerShell 스크립트에서 null이거나 비어 있습니다.
  • powershell 원격
  • 원격 세션이있는 Invoke-Command : 매개 변수의 인수를 확인할 수 없습니다.
  • 바이너리를 원격 Azure VM에 복사 할 수 없습니다.
  • 원격 컴퓨터에서 파일을 복사하는 PowerShell 명령

나는 또한 사용하여 도움을 얻으려고 노력했습니다.

 Get-Help Invoke-Command

질문 :-

  1. script (2)의 "Invoke-Command (Scriptblock)"에서 "Copy-Item"명령을 사용하여 파일을 복사하려면 어떻게해야합니까?
  2. 이것을 달성하는 더 좋은 방법이 있습니까 (모범 사례를 의미합니다)?

답변

T-Me Sep 03 2020 at 19:50

Invoke-Command-ArgumentList원격 세션에서 로컬 변수의 값을 제공하는 데 사용할 수있는 매개 변수 가 있습니다. 문제는 변수의 가치 일뿐입니다. 파일 없음!

당신이 할 수 있습니다
사용을 Get-Content -Raw작은 파일에하는 변수에의 상수를 저장합니다. 대상 시스템에를 만들 New-Item-Value해당 파일의. 그러나 그것은 그다지 효율적이지 않습니다.

예:

$txt = Get-Content -Raw -Path "C:\test\oldFile.txt" $Session = New-PSSession 127.0.0.1
Invoke-Command -Session $Session -ScriptBlock { Param($Txt) New-Item -Path c:\test\newFile.txt -Value $txt } -ArgumentList $txt 
#Get-PSSession | Remove-PSSession

결과:

   Verzeichnis: C:\test    # Sry german OS


Mode                LastWriteTime         Length Name                      PSComputerName           
----                -------------         ------ ----                      --------------           
-a----       03.09.2020     12:23         658033 newFile.txt               127.0.0.1  

당신은 무엇을해야합니까 :
내가 사용을 생각하기 Copy-Item -ToSession $Session는 IS 올바른 방법으로 그것을 할. 그것은 당신의 목적을 위해 만들어졌습니다. 단점은 대상 디렉토리가 존재해야한다는 것입니다. 그러나 어쨌든 두 cmdlet 모두에 대해 PSSession이 필요합니다. 따라서 Invoke-Command동일한 PSSession과 함께 사용할 수 있습니다 . 먼저 PSSession을 만듭니다. Invoke-Command디렉토리를 만드는 데 사용 합니다. 그런 다음을 사용 Copy-Item하여 파일을 올바른 위치로 이동하십시오. 마지막으로 Invoke-Command몇 가지 마무리 단계를 수행 하는 데 사용할 수 있습니다 . 그리고 Remove-PSSession끝났을 때 잊지 마세요 :

$DestinationPath = "C:\test"
Invoke-Command -Session $Session -ScriptBlock { Param($Destination) New-Item -Path $Destination -ItemType Directory } -ArgumentList $DestinationPath
Copy-Item -Path "C:\test\oldFile.txt" -ToSession $Session -Destination "c:\test\newFile.txt" Invoke-Command -Session $Session -ScriptBlock { write-host "Do some stuff" }
$Session | Remove-PSSession