J'essaie d'utiliser la commande PowerShell Copy-Item pour copier un fichier dans un chemin UNC. Malheureusement, le chemin UNC sur ce serveur de production comporte des espaces et une esperluette dans le nom. J'ai essayé un tas de choses, mais je n'ai pas encore eu de chance. Pourriez-vous suggérer un moyen de résoudre ce problème.
\\servername\This : The term '\\servername\This' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. At line:1 char:1 + \\servername\This Folder Has Spaces "&" Ampersand\Folder + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (\\servername\This:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException DEBUG: This is the value of TransfersSharePathFile - \\servername\This Folder Has Spaces & Ampersand\Folder\file.zip Copy-Item : Illegal characters in path. At E:\Scripts\CopyFile_Test.ps1:36 char:5 + Copy-Item -Path $CheckFileExists -Destination $TransfersSharePathFile -Force ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Copy-Item], ArgumentException + FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.Commands.CopyItemCommand
Voici le message d'erreur que j'obtiens:
Invoke-Expression : At line:1 char:41 + \\servername\This Folder Has Spaces & Ampersand\Folder + ~ The ampersand (&) character is not allowed. The & operator is reserved for future use; wrap an ampersand in double quotation marks ("&") to pass it as part of a string. At E:\Scripts\CopyFile_Test.ps1:33 char:27 + $TransfersSharePath = Invoke-Expression $InvokeExpressionPath + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ParserError: (:) [Invoke-Expression], ParseException + FullyQualifiedErrorId : AmpersandNotAllowed,Microsoft.PowerShell.Commands.InvokeExpressionCommand
Si j'essaie de envelopper l'esperluette entre guillemets doubles ("" & ""), j'obtiens cette erreur lorsque le code s'exécute.
$InvokeExpressionPath = "\\servername\This Folder Has Spaces & Ampersand\Folder" $TransfersSharePath = Invoke-Expression $InvokeExpressionPath $TransfersSharePathFile = $InvokeExpressionPath + "\" + $FileName Copy-Item -Path $CheckFileExists -Destination $TransfersSharePathFile -Force -ErrorAction SilentlyContinue
Merci d'avance pour votre aide. p >
3 Réponses :
Essayez :
$InvokeExpressionPath = '\\servername\This Folder Has Spaces & Ampersand\Folder'
Devrait faire le travail
OU, si vous devez passer une esperluette à Invoke-Expression, vous pouvez essayer d'utiliser $ InvokeExpressionPath = "" "\\ servername \ This Folder Has Spaces & Ampersand \ Folder" ""
cela fera l'affaire avec invoke ... mais plus tard, vous devrez supprimer qoute supplémentaire ... $ TransfersSharePathFile = $ ($ InvokeExpressionPath -replace "" "") + "\" + $ FileName
L'esperluette ou les espaces dans le chemin ne sont pas le problème. Vous essayez d'utiliser Invoke-Expression
en fournissant le chemin comme paramètre, ce qui n'est pas une commande valide. Débarrassez-vous de la ligne $ TransfersSharePath
et utilisez ce qui se trouve dans $ InvokeExpressionPath
directement. Changez simplement les guillemets doubles en simples au cas où. Je vous suggère également de créer un chemin en utilisant Join-Path
au lieu de contaténer les chaînes.
Merci beaucoup à AdamL et à dread1 pour leur aide. J'ai utilisé les deux suggestions. Pour référence, voici à quoi ressemble le code de travail.
$InvokeExpressionPath = "\\servername\This Folder Has Spaces & Ampersand\Folder" $TransfersSharePathFile = Join-Path -Path $InvokeExpressionPath -ChildPath $FileName $TransfersSharePathFile = $InvokeExpressionPath + "\" + $FileName Copy-Item -Path $CheckFileExists -Destination $TransfersSharePathFile -Force -ErrorAction SilentlyContinue