Скопируйте файл с квадратными скобками [] в имя файла и используйте * подстановочный знак
Я использую 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