Скопируйте файл с квадратными скобками [] в имя файла и используйте * подстановочный знак

Я использую PowerShell в Windows 7 и пишу сценарий для копирования группы файлов из одной структуры папок в другую. Вроде как компиляция. В PowerShell считает, что квадратные скобки, [ ], являются своего рода подстановочными знаками, и я не могу избежать их по какой-то причине.

Я не могу использовать -LiteralPath, потому что я хочу использовать подстановочный знак звездочки*, так как имя файла имеет дату как часть имени файла, и дата изменяется. Дата используется в качестве версии число.

этот пост было полезно, но никакое количество тиков (2x или 4x на скобку) не ускользает от квадратных скобок.

Я не получаю ошибку; PowerShell ведет себя так же, как если бы я ввел неправильное имя файла.

это конкретная строка, над которой я работаю:

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

и в этом все дело:

# 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"
SMDoc  = "0.HardwareTPMC-3SM.Documentation"
SMDoc  = "0.HardwareTPMC-4SM.Documentation"
SMDDoc = "0.HardwareTPMC-4SM-FD.Documentation"
0Doc  = "0.HardwareTSW-730.Documentation"
0OLH  = "0.HardwareTSW-730.OLH"
$CENRVS  = "0.HardwareCEN-RVS.Notes"

$ProjMgmt = "0.Project Management"

$SW            = "0.Software"
$RVLicensing   = "0.Software.RoomView.License"
$RVNotes       = "0.Software.RoomView.Notes"
$SQLLicensing  = "0.Softwaredatabase.SQL.Licensing"
$SQLNotes      = "0.Softwaredatabase.SQL.Notes"
$FRVMarketing  = "0.SoftwareFusion RV.Marketing"
$FRVNetworking = "0.SoftwareFusion RV.Networking"
$FRVNotes      = "0.SoftwareFusion 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:fso110314.log -Destination c:fsoxmylog.log

#To the root
Copy-item -Path $FSG$ProjMgmtstarter"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$SWxpanel.Notesstarter*.* -Destination $FSG$containerFolder$rootFolder"eControl and xPanels"

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

что я могу сделать, чтобы избежать квадратных скобок и по-прежнему использовать подстановочный знак имени файла Copy-Item командлет?

7 ответов


Да, вы правы, подход с двойной обратной связью работает. Но проблема в том, что вы используете двойные кавычки вместо одинарных кавычек, чтобы заключить свою строку. Решение double-backtick, похоже, работает только с одинарными кавычками.

таким образом, Фиксированная строка кода:

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

еще один хороший ресурс на пути к файлам и проводным символам и т. д. стоит прочитать эту статью:Принимая Вещи (Например, Пути К Файлам) Буквально


на PowerShell v 2.0 и выше escape-символ для использования является обратной косой чертой. Например, если мы хотим удалить скобки из этой строки " [Имя_сервера: QA01]", которая является результатом действия командлета PowerShell администратора Exchange в System Center Orchestrator, мы используем следующую логику:

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

Это довольно странно. См., вы должны использовать одинарную кавычку (что обычно подразумевает в PowerShell "оценить это точно так, как написано", поэтому это очень странно синтаксис.)

Не чувствуйте себя плохо, не выясняя это самостоятельно, это очень странный синтаксис.


способ, которым Powershell автоматически заполняет вкладку-имя файла, обычно является лучшим способом,

пример:

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

по-видимому, квадратные скобки нужны двойные спинки, чтобы убежать, что необычно. Ссылка здесь.

вы уверены, что это не сработает? Я видел, как об этом упоминали несколько раз.

Edit: Да, это работает, вы использовали двойные кавычки вместо backticks.

двойная кавычка над символом Апострофа, рядом с клавишей Enter. Backtick находится прямо под ключом Escape, разделяя ключ с Тильдой,~.


один из вариантов-получить имена файлов с помощью устаревшего dir, который позволит вам использовать подстановочный знак*, но не пытается "blob" квадратные скобки. Потом кормить этого списка, чтобы переместить элемент, используя -literalpath командлета

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

есть разница между ' и `:

  • первая-это одинарная кавычка, которая является символом без сдвига на " ключ.
  • второй-это backtick, который я думал, что использую, но на самом деле не был. Это символ nonshift на ~ ключ.

это работает:

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

предполагая, что ничего больше не соответствует, вы можете использовать ? вместо скобок. Файл с именем " a[h-j]", копирование в каталог "foo":

 copy-item a?h-j? foo