Пользовательский ввод в переменную, содержащую специальные символы и подстановочные знаки, не передается в команду Powershell - PullRequest
0 голосов
/ 20 июня 2020

Я застрял на этой проблеме некоторое время и не могу найти решение, которое работает. У меня есть ситуация, когда я не могу заставить переменную, созданную на основе ввода данных пользователем для нескольких расширений файлов, работать внутри команды в Power Shell. В приведенном ниже скрипте, если я вручную ввожу аргументы для расширений файлов с использованием подстановочных знаков и заключу каждый из них в кавычки, разделенные запятой, это сработает, но если я попытаюсь заменить переменную $ Extensions, созданную с помощью функции read-host если ввести ту же самую строку, это не сработает. Ниже приведены два примера кода. Первый работает, а второй нет.

#This works
$AllVariables = Get-Variable
function CompareVariables {
Compare-Object (Get-Variable) $AllVariables -Property Name -PassThru | Where -Property Name -ne "AllVariables"
}

#write-host 'Enter Extensions'
#$Script:getsomeinput = read-host

$Script:File_Path = "E:\Play Station1 Roms\_1 New Downloads"
#$Script:Extensions = "$getsomeinput"
$Script:Output_Path = "R:\"
$Script:Output_File = "List.txt"

$Script:numfilescount = (Get-ChildItem -path "$File_Path" -recurs -include "*.bin", "*.pbp").count
$Script:ListFiles = Get-ChildItem -path "$File_Path" -recurse -include "*.bin", "*.pbp" | format-list | Out-File -Append -FilePath $Output_Path$Output_File

CompareVariables
""
'{0}{1}' -f $Output_Path,$Output_File
write-host "$Output_Path$Output_File"
""
read-host
#*******************************************************************************************


#This Does Not work when "*.bin", "*.pbp" is typed as input into the variable from the console.
$AllVariables = Get-Variable
function CompareVariables {
Compare-Object (Get-Variable) $AllVariables -Property Name -PassThru | Where -Property Name -ne "AllVariables"
}

write-host 'Enter Extensions'
$Script:getsomeinput = read-host

$Script:File_Path = "E:\Play Station1 Roms\_1 New Downloads"
$Script:Extensions = "$getsomeinput"
$Script:Output_Path = "R:\"
$Script:Output_File = "List.txt"

$Script:numfilescount = (Get-ChildItem -path "$File_Path" -recurs -include "$Extensions").count
$Script:ListFiles = Get-ChildItem -path "$File_Path" -recurse -include "$Extensions" | format-list | Out-File -Append -FilePath $Output_Path$Output_File

CompareVariables
""
'{0}{1}' -f $Output_Path,$Output_File
write-host "$Output_Path$Output_File"
""
read-host

Я пробовал много разных вещей. Я пробовал разбивать струны. Я попытался поместить ввод из переменной в массив. Я пробовал форматирование строк, одинарные кавычки, двойные кавычки ... все, что я мог найти в Интернете, чтобы вывести данные из ввода в формат, который переменная передала бы команде правильно и безрезультатно. Я объявил все переменные в скрипте как скрипт, чтобы избежать проблем с областью видимости при устранении неполадок, и добавил функции сравнения переменных, чтобы я мог видеть вывод и форму всех переменных, созданных во время теста.

Мне удалось получить переменную $ Extensions для отображения правильного формата, с подстановочными знаками и всем остальным, несколько раз, используя несколько методов, но я никогда не мог заставить этот ввод работать в команде, даже если вывод внутри переменная кажется правильной. Пожалуйста, помогите, так как я новичок. Это последнее препятствие на моем пути, мешающее мне закончить сценарий.

...