2017-02-27 1 views
0

J'essaie d'utiliser la cmdlet PowerShell Invoke-Expression pour lancer RoboCopy.Robocopy n'a pas reconnu les options lors du lancement depuis PowerShell

Dans le script ci-dessous, RoboCopy fonctionnait correctement lorsque l'option était simplement ''. 'mais dès que l'option'/MIR 'a été ajoutée j'ai eu cette erreur "Invalid Parameter # 3".

Il semble que RoboCopy rencontre des problèmes d'analyse de '/ MIR' et s'est étouffé sur la barre oblique dans l'option. J'ai essayé d'utiliser toutes sortes de caractères d'échappement en vain!

# Source & Destination paths 
# 
    [string]$srcPath = 'C:\folderSrc' 
    [string]$desPath = 'C:\folderDes' 

# Example 1 
# ---------- 
# This works - note how $option1 contains only '*.*' 
# 
    [string]$option1 = '*.*' 
    [string]$line = 'RoboCopy $srcPath $desPath $option1' 
    Invoke-Expression "$line" 

# Example 2: 
# ---------- 
# This doesn't work - after '/MIR' is added to the option, RoboCopy seems to choke on the forward slash in '/MIR' 
# 
    [string]$option2 = '*.* /MIR' 
    [string]$line = 'RoboCopy $srcPath $desPath $option2' 
    Invoke-Expression "$line" 
+0

Dans ma question, l'exemple 1 fonctionne, mais pas l'exemple 2. et la seule différence est $ option1 = '\ *. \ *' et $ option2 = '\ *. \ */MIR' – user3657462

+0

Je ne pense pas qu'il y avait un problème d'expansion variable parce que l'exemple 1 ne fonctionnerait pas si les variables ne pas se développer correctement – user3657462

+0

Tout d'abord, s'il vous plaît [modifier votre question] (http://stackoverflow.com/posts/42496558/edit), n'ajoutez pas de commentaires pour essayer de le modifier. Deuxièmement, sachant qu'il s'agit d'un interprète et non d'un PowerShell direct, comme vous le dites dans votre réponse à la réponse de Christopher G. Lewis, je pense que c'est un problème avec votre interprète et non avec PowerShell lui-même. Il semblerait que l'interprète ne gère pas correctement la barre oblique. – TheMadTechnician

Répondre

0

Powershell ne développe pas les variables $ lors de l'utilisation de guillemets simples.

Utilisez des guillemets doubles ici:

[string]$line = "RoboCopy $srcPath $desPath $option1" 

Et il pourrait faire un meilleur sens de ne pas utiliser InvokeExpression

RoboCopy.exe $srcPath $desPath *.* /MIR 

Si le travail

+0

J'ai besoin de l'Invoke-Expression car il s'agit en fait d'un interpréteur de script PowerShell où le interprète lire un fichier texte de script PowerShell et exécuter le script ligne par ligne – user3657462

+0

Je ne sais pas exactement ce que vous voulez dire. Explorez les guillemets sur chaque commande '[string] $ line' –

+0

Merci, Chris. Je vais jouer avec ça – user3657462

0

je trouve que ce (en utilisant le double InvokeExpression) travaillé:

[string]$srcPath = 'C:\folderSrc' 
    [string]$desPath = 'C:\folderDes' 
    [string]$option = '*.* /MIR' 
    [string]$line = 'Invoke-Expression "RoboCopy $srcPath $desPath $option"' 

    Invoke-Expression "$line" 

Mais ne pouvait pas expliquer pourquoi cela (en utilisant seule Invoke-Expression) fonctionne aussi:

[string]$srcPath = 'C:\folderSrc' 
    [string]$desPath = 'C:\folderDes' 
    [string]$option = '*.*' 
    [string]$line = 'RoboCopy $srcPath $desPath $option' 

    Invoke-Expression "$line" 

Notez que la seule différence dans les 2 scénarios est la variable $ option:

'*.*' vs. '*.* /MIR' 

Incohérence comme c'est complètement démoralisant ...