2015-08-26 2 views
0

J'archive des fichiers à partir d'un partage réseau à l'aide de PowerShell & robocopy. Les dossiers peuvent exister ou non, mais s'ils existent, je veux les déplacer vers un autre emplacement. J'essaye d'exécuter une série de commandes robocopy qui sont prédéfinies dans un fichier CSV. Ce fichier contient également un chemin sur lequel je voudrais lancer une vérification (Test-Path) pour supprimer les dossiers qui n'existent pas. Ensuite, je peux m'en occuper à une date ultérieure.Impossible de résoudre le jeu de paramètres Invoke-Command - la commande fonctionne correctement en dehors du script

Certaines parties semblent bien fonctionner, mais la Invoke-commande me donne une erreur:

Invoke-Command : Parameter set cannot be resolved using the specified named parameters. 

Quand j'ai googlé cette erreur, je dois admettre que je ne comprends pas les réponses qu'ils ne se rapporte pas à mon scénario. La ligne de commande invoke a bien fonctionné quand elle n'était pas dans l'instruction if dans laquelle elle se trouve maintenant.

Ceci est mon code:

$csv = Import-Csv C:\paths.csv 
foreach ($folder in $csv) { 
    $path = $folder.LMCLF #full path to be checked 
    $command = $folder.robo #this is the column name in the CSV which contains the robocopy command 
    if (Test-path -Path "$path" -pathtype container) { #check whether path exists 
     Invoke-command $folder.robo #run the robocopy command from the CSV 
    } else { 
     echo $path " Does not exist!" 
    } 

    if($LASTEXITCODE) { #check for a robocopy exit code & set relevant message 
     If (($LASTEXITCODE -eq 0)) { 
      $RoboCopyMessage = "EXITCODE: 0, Succeeded"    
     } elseif (($LASTEXITCODE -gt 0) -and ($LASTEXITCODE -lt 16)) { 
      $RoboCopyMessage = "EXITCODE: 1-15, Warning" 
     } elseif ($LASTEXITCODE -eq 16) { 
      $RoboCopyMessage = "EXITCODE: 16, Error" 
     } 
    } else { 
     $RoboCopyMessage = "Robocopy did not work :(" 
    } 

    Write-Host $RoboCopyMessage " at location: " $folder.LMCLF #some output to the console detailing the robocopy message 
    $folder.LMCLF + " |==========| ", $robocopyMessage | out-file c:\fail.txt -Append  #put the folder & robocopy code into a text file            
} 
+0

Quelle est la valeur de $ folder.robo'? –

+0

La valeur serait quelque chose comme: Robocopy.exe "W: \ Dossier 1 \ Dossier 2" "Q: \ Dossier 1 \ Dossier 2"/V/S/E/NP/MOVE/R: 3/W: 5 /LOG+:C:\RobocopyBatch6.log –

Répondre

0

problème Vous est que votre passage une chaîne au paramètre -ScriptBlock dans l'applet de commande Invoke-Command, quand il attend un bloc de script.

Invoke-Command [-ScriptBlock] <ScriptBlock> [-ArgumentList <Object[]>] 
       [-InputObject <PSObject>] [-NoNewScope] [<CommonParameters>] 

Vous pouvez essayer de le convertir en un bloc de script avant d'exécuter la commande:

Invoke-Command ([scriptblock]::Create($folder.robo)) 
+0

Merci - cela a fonctionné. Je ne suis pas sûr de comprendre pourquoi! –

1

Si votre commande est une utilisation de chaîne Invoke-Expression au lieu de Invoke-Command.