1

私は次の構造を持っています:

C:\one\web.config
C:\two\web_rollback.config
C:\three\    ( this is empty , it is where I want to copy to

私の Powershell file.ps1 には、次のコードがあります。

$Folder1 = Get-childitem  "C:\one\"
$Folder2 = Get-childitem  "C:\two\"
$Folder3 = Get-childItem  "C:\three\"

Compare-Object $Folder1 $Folder2 -Property Name, Length | Where-Object {$_.SideIndicator -eq "=>"} | ForEach-Object {
    Copy-Item "$Folder1\$($_.name)" -Destination $Folder3 -Force}

ただし、なぜこのエラーが表示されるのですか?

PS C:\windows\system32> C:\pscripts\compareobject.ps1
Copy-Item : Cannot find path 'C:\windows\system32\Web.config\Web_Rollback.config' because it does not exist.
4

2 に答える 2

3

誤解を招くような変数名を選択し、自分で掘った穴に落ちました。

$Folder1 = Get-childitem  "C:\one\"
$Folder2 = Get-childitem  "C:\two\"
$Folder3 = Get-childItem  "C:\three\"

これらの命令は、指定されたフォルダーの子項目で変数を埋めます。

Copy-Item "$Folder1\$($_.name)" -Destination $Folder3 -Force

ただし、この命令では、フォルダ パスが含まれているかのように$Folder1andを使用します(含まれていません)。$Folder3

その上、サイド インジケーターの結果としてCompare-Object -Property Name, Length常に生成されるため (ファイル サイズが異なっていても、とのアイテムの名前が異なるため)、その名前のファイルが存在しないため、コードは失敗します。で。web_rollback.config=>C:\oneC:\twoC:\one

あなたのアプローチのもう 1 つの欠点は、2 つのファイル間の変更を検出するためにサイズの違いに依存していることです。たとえば、値が から に変更された場合、このチェックは失敗し0ます1

コードを次のように変更します。

$config   = "C:\one\web.config"
$rollback = "C:\two\web_rollback.config"
$target   = Join-Path "C:\three" (Get-Item $config).Name

if ([IO.File]::ReadAllText($config) -ne [IO.File]::ReadAllText($rollback)) {
  Copy-Item $rollback -Destination $target -Force
}
于 2013-09-20T10:30:00.377 に答える