2017-10-04 24 views
0

私はすでにこれを検索しており、多くの回答が見つかりました。しかし、そのうちどれもうまくいかないようです。powershellを使用してリモートシステムにファイル/フォルダが存在するかどうか確認してください。

ローカルマシンからリモートサーバーにファイルをコピーするために使用されるスクリプトを作成しています。ファイルをコピーする前に、ファイル/フォルダが既に存在するかどうかを確認する必要があります。フォルダが存在しない場合は、新しいフォルダを作成し、ファイルをコピーします。ファイルが指定された場所に既に存在する場合は、ファイルを上書きします。

私はこれを行う方法についての論理を得ました。しかし、何らかの理由でTest-Pathが機能していないようです。

$server = #list of servers 
$username = #username 
$password = #password 
$files = #list of files path to be copied 
foreach($server in $servers) { 
    $pw = ConvertTo-SecureString $password -AsPlainText -Force 
    $cred = New-Object Management.Automation.PSCredential ($username, $pw) 
    $s = New-PSSession -computerName $server -credential $cred 
    foreach($item in $files){ 
     $regex = $item | Select-String -Pattern '(^.*)\\(.*)$' 
     $destinationPath = $regex.matches.groups[1] 
     $filename = $regex.matches.groups[2]   
     #check if the file exists on local system 
     if(Test-Path $item){ 
      #check if the path/file already exists on remote machine 
      #First convert the path to UNC format before checking it 
      $regex = $item | Select-String -Pattern '(^.*)\\(.*)$' 
      $filename = $regex.matches.groups[2] 
      $fullPath = $regex.matches.groups[1] 
      $fullPath = $fullPath -replace '(.):', '$1$' 
      $unc = '\\' + $server + '\' + $fullPath 
      Write-Host $unc 
      Test-Path $unC#This always returns false even if file/path exists 
      if(#path exists){ 
       Write-Host "Copying $filename to server $server" 
       Copy-Item -ToSession $s -Path $item -Destination $destinationPath 
      } 
      else{ 
       #create the directory and then copy the files 
      } 
     } 
     else{ 
      Write-Host "$filename does not exists at the local machine. Skipping this file" 
     }   
    } 
    Remove-PSSession -Session $s 
} 

リモートマシン上にファイル/パスが存在するかどうかを確認する条件は、常に失敗します。理由は分かりません。

私はpowershellで以下のコマンドを手動で試してみました。コマンドはリモートマシンでtrueを返し、ローカルマシンでfalseを返します。ローカルマシン上の

:リモートマシン上

Test-Path '\\10.207.xxx.XXX\C$\TEST' 
False 

Test-Path '\\10.207.xxx.xxx\C$\TEST' 
True 
Test-Path '\\localhost\C$\TEST' 
True 

だから、コマンドが、私は手動またはスクリプトを使用してみてください場合でも、失敗したことは明らかです。しかし、リモートのシステムやサーバーからコマンドを実行しようとすると、コマンドは成功します。

しかし、ファイルがローカルシステムのリモートマシンに存在するかどうかを確認する必要があります。

何か不足していますか?誰かがここで何が起こっているのか理解できるように助けることができますか?

ありがとうございます!

+0

Robocopyでコピーを扱うのはなぜですか? – Snak3d0c

+0

私はこの問題を見ると思いますが、 '$ Files'からいくつかの行がどのように見えるか教えてください。 – FoxDeploy

答えて

1

まず、PSSessionを何も使用していません。彼らは冗長に見えます。

ローカルパスが宛先と同じで、WMF/Powershell 4以降を使用している場合は、あなたの正規表現とUNCパスを止めて、コードを単純化して削除することをお勧めします。

$existsOnRemote = Invoke-Command -Session $s {param($fullpath) Test-Path $fullPath } -argumentList $item.Fullname; 
if(-not $existsOnRemote){ 
    Copy-Item -Path $item.FullName -ToSession $s -Destination $item.Fullname; 
} 
+0

ありがとう。出来た! – jayaganthan

+0

完了:@CmdrTchort – jayaganthan

関連する問題