web-dev-qa-db-fra.com

Copiez le fichier avec les crochets [] dans le nom du fichier et utilisez * le caractère générique

J'utilise PowerShell sous Windows 7 et j'écris un script pour copier plusieurs fichiers d'une structure de dossiers à une autre. Un peu comme compiler. La cmdlet PowerShell Copy-Item pense que les crochets, [], sont des caractères génériques, et je ne suis pas en mesure de les échapper pour une raison quelconque.

Je ne peux pas utiliser -LiteralPath car je souhaite utiliser un caractère générique astérisque *, car le nom du fichier a une date qui fait partie du nom du fichier, et la date change. La date est utilisée comme numéro de version.

Ce post était utile, mais aucune quantité de ticks (2x ou 4x par support) n’échappe aux crochets.

Je ne reçois pas d'erreur PowerShell se comporte comme si j'avais entré un nom de fichier incorrect.

C'est la ligne spécifique sur laquelle je travaille:

#to Fusion Server
Copy-item -Path $FSG\$SW\0.RoomView.Notes\starter\"[RoomView] Versions explained*.pdf" -Destination $FSG\$containerFolder\$rootFolder\"Fusion Server"\

Et voici le tout:

# Compiles the Fusion packet for distribution

###############################
###########Variables###########
###############################

#folder structure
$FSG = "F:\FSG"
$containerFolder = "Packet.Fusion for IT and AV Professionals"
$rootFolder      = "Fusion for IT and AV pros $(Get-Date -format “MM-dd-yyyy”)"
$subRoot1        = "Fusion Server"
$subRoot2        = "Scheduling Enhancement and Panels"
$subRoot2sub1    = "Scheduling Panels"
$subRoot3        = "SQL Server"

#source folders
$HW      = "0.Hardware"
$3SMDoc  = "0.Hardware\TPMC-3SM.Documentation"
$4SMDoc  = "0.Hardware\TPMC-4SM.Documentation"
$4SMDDoc = "0.Hardware\TPMC-4SM-FD.Documentation"
$730Doc  = "0.Hardware\TSW-730.Documentation"
$730OLH  = "0.Hardware\TSW-730.OLH"
$CENRVS  = "0.Hardware\CEN-RVS.Notes"

$ProjMgmt = "0.Project Management"

$SW            = "0.Software"
$RVLicensing   = "0.Software\0.RoomView.License"
$RVNotes       = "0.Software\0.RoomView.Notes"
$SQLLicensing  = "0.Software\database.SQL.Licensing"
$SQLNotes      = "0.Software\database.SQL.Notes"
$FRVMarketing  = "0.Software\Fusion RV.Marketing"
$FRVNetworking = "0.Software\Fusion RV.Networking"
$FRVNotes      = "0.Software\Fusion RV.Notes"


###############################
#create the directory structure
###############################

md -Path $FSG\$containerFolder -Name $rootFolder

cd $FSG\$containerFolder\$rootFolder
md "eControl and xPanels"
md "Fusion Server" #$subRoot1
md "Getting Started as a User"
md "Project Management"
md "RoomView Connected Displays"
md "Scheduling Enhancement and Panels" #$subRoot2
md "SQL Server" #$subRoot3

cd $FSG\$containerFolder\$rootFolder\$subRoot1
md "CEN-RVS"
md "Licenseing Information"
md "Networking"
md "Official Documentation"
md "Prerequisites, including powerShell script"
md "Product Info"
md "Requirements"
md "Tech Info"
md "Windows Authentication to Fusion RV"

cd $FSG\$containerFolder\$rootFolder\$subRoot2
md "Outlook Add-in"
md "Scheduling Panels" #$subRoot2sub1

cd $FSG\$containerFolder\$rootFolder\$subRoot2\$subRoot2sub1
md "TPMC-3SM"
md "TPMC-4SM"
md "TPMC-4SM-FD"
md "TSW-730"

cd $FSG\$containerFolder\$rootFolder\$subRoot3
md "Multi-database model only"
md "SQL Licensing"

cd $FSG\$containerFolder
#reset current folder


###############################
#copy the files
###############################

#Copy-Item -Path C:\fso\20110314.log -Destination c:\fsox\mylog.log

#To the root
Copy-item -Path $FSG\$ProjMgmt\starter\"Fusion Support Group Contact info*.pdf" -Destination $FSG\$containerFolder\$rootFolder\
Copy-item -Path $FSG\$containerFolder\"Fusion for IT and AV professionals release notes.txt" -Destination $FSG\$containerFolder\$rootFolder\

#to eControl and xPanels
Copy-item -Path $FSG\$SW\xpanel.Notes\starter\*.* -Destination $FSG\$containerFolder\$rootFolder\"eControl and xPanels"\

#to Fusion Server
Copy-item -Path $FSG\$SW\0.RoomView.Notes\starter\"[RoomView] Versions explained*.pdf" -Destination $FSG\$containerFolder\$rootFolder\"Fusion Server"\

Que puis-je faire pour échapper aux crochets et continuer à utiliser une partie du nom de fichier générique de la cmdlet Copy-Item?

11

Il y a une différence entre ' et `:

  • Le premier est la citation simple qui est le caractère de non décalage sur la " clé.
  • La seconde est le backtick que je pensais utiliser mais qui ne l’était pas. C'est le personnage non-shift sur le ~ clé.

Cela marche:

#to Fusion Server
Copy-item -Path $FSG\$SW\0.RoomView.Notes\starter\'``[RoomView``] Versions explained*.pdf' -Destination $FSG\$containerFolder\$rootFolder\"Fusion Server"\
0

Oui, vous avez raison, l'approche du double backtick fonctionne. Mais le problème est que vous utilisez des guillemets doubles au lieu de guillemets simples pour entourer votre chaîne. La solution de double backtick semble ne fonctionner qu'avec des guillemets simples.

La ligne de code fixe est donc:

Copy-item -Path $FSG\$SW\0.RoomView.Notes\starter\'``[RoomView``] Versions explained*.pdf' -Destination $FSG\$containerFolder\$rootFolder\'Fusion Server'\

Une autre bonne ressource sur les chemins de fichiers et les caractères câblés, etc. est de lire cet article: Prendre des choses (comme des chemins de fichiers)

13
HAL9256

Sur PowerShell version 2.0 et ultérieure, le caractère d'échappement à utiliser est la barre oblique inversée. Par exemple, si nous souhaitons supprimer les crochets de cette chaîne "[Nom du serveur: QA01]", qui correspond au type de sortie obtenu à partir de l'activité de la cmdlet Exchange Admin PowerShell dans System Center Orchestrator, nous utilisons la logique suivante:

$string -replace '\[','' -replace '\]',''
>Servername: QA01

C'est assez bizarre. Vous voyez, vous devez utiliser un guillemet simple (ce qui implique normalement dans PowerShell «d'évaluer ceci exactement comme il est écrit», donc c'est une syntaxe très étrange).

Ne vous sentez pas mal à l'aise de ne pas le savoir vous-même, c'est une syntaxe très étrange.

3
FoxDeploy

Apparemment, les crochets ont besoin de doubles coudes pour s'échapper, ce qui est inhabituel. Référence ici .

Vous êtes sûr que ça ne marche pas? Je l'ai vu mentionné plusieurs fois.

Edit: Oui, cela fonctionne, vous avez utilisé des guillemets doubles au lieu de backticks.

Les guillemets doubles sont au-dessus du caractère apostrophe, à côté de la touche Entrée. Backtick est juste sous la touche Échap, partageant la clé avec le tilde, ~.

1
Keeler

La manière dont Powershell complète automatiquement le nom de fichier par tabulation est généralement la meilleure,

Exemple:

copy-item '.\file`[test`].txt'
1
Vasili Syrakis

J'utilise ceci:

 Copy-Item  $file.fullname.replace("[", "``[").replace("]", "``]") $DestDir
0
Matteo1010

Une option consiste à obtenir les noms de fichiers en utilisant le répertoire hérité, ce qui vous permettra d'utiliser le caractère générique *, mais n'essaie pas de "masquer" les crochets. Puis alimentez cette liste pour déplacer un élément à l'aide de -literalpath

 cmd /c dir *]* /b |
  foreach { Move-Item -LiteralPath $_ -Destination <destination path>  }
0
mjolinor

En supposant que rien ne corresponde, vous pouvez utiliser? au lieu des crochets. Un fichier nommé "a [h-j]", copiant dans le répertoire "foo":

 copy-item a?h-j? foo 
0
js2010