powershell - недопустимая ссылка на переменную ':' не сопровождался допустимым символом имени переменной - PullRequest
1 голос
/ 04 мая 2020

Что я пытаюсь сделать, это заставить Radarr удалить MOV ie, запрошенный у веб-клиента, после того, как он переместит его в папку лиц, поэтому, если путь по умолчанию - D: \ Movies \, просто зарегистрируйте его, если он идет В любом другом месте, кроме D: \ Movies \, он удалит его из Клиента.

в поисках некоторых советов, поскольку я совершенно новичок в powershell.

$movie_path = $env:radarr_moviefile_relativepath
$default_path = "D:\Movies\"

$RADARRIP="localhost"
$RADARRPORT="7878"
$RADARRAPIKEY="******"

$Logfile = "C:\Custom Scripts\Radarr.log"

Function LogWrite
{
   Param ([string]$logstring)

   Add-content $Logfile -value $logstring
}

if ($default_path == $movie_path)
{
LogWrite $movie_path $radarr_movie_id "added to server"
LogWrite " "
}
else
{
Invoke-WebRequest -Uri http://$RADARRIP:$RADARRPORT/api/movie/$radarr_movie_id" -X GET -H "X-Api-Key: $RADARRAPIKEY -k
LogWrite $movie_path $radarr_movie_id "added to server"
LogWrite $radarr_movie_id "selected movie from server"
Invoke-WebRequest -Uri http://$RADARRIP:$RADARRPORT/api/movie/$radarr_movie_id" -X DELETE -H "X-Api-Key: $RADARRAPIKEY -k
LogWrite $radarr_movie_id "movie removed from list"
LogWrite " "
}

Ошибки

+ Invoke-WebRequest -Uri http://$RADARRIP:$RADARRPORT/api/movie/$radarr ...
+                               ~~~~~~~~~~
Variable reference is not valid. ':' was not followed by a valid variable name character. Consider using ${} to delimit the name.
At \\WIN-TQS12RTGKSQ\Custom Scripts\radarr.ps1:29 char:31
+ Invoke-WebRequest -Uri http://$RADARRIP:$RADARRPORT/api/movie/$radarr ...
+                               ~~~~~~~~~~
Variable reference is not valid. ':' was not followed by a valid variable name character. Consider using ${} to delimit the name.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : InvalidVariableReferenceWithDrive

Ответы [ 2 ]

2 голосов
/ 04 мая 2020

Когда вы используете составную строку без кавычек в качестве аргумента команды, PowerShell неявно обрабатывает ее как расширяемую строку , т. Е. Как если бы она была передана в двойных кавычках ("...")

Этот ответ предоставляет исчерпывающий обзор расширяемых строк (интерполяция строк) в PowerShell.

Соответствующий аспект заключается в том, что a : после ссылка на переменную, такая как $RADARRIP, считается часть ссылки на эту переменную : часть между $ и : считается именем (PowerShell) диска и то, что следует , :, как ожидается, будет именем или путем элемента на этом диске; то есть ссылка на переменную интерпретируется как экземпляр нотации пространства имен PowerShell .

Следовательно, PowerShell следует явно указать, что : после $RADARRIP является не часть ссылки на переменную , для которой у вас есть несколько опций:

  • Самый вариант PowerShell-idiomati c заключается в использовании {...} для определения переменной name:
Invoke-WebRequest -Uri http://${RADARRIP}:$RADARRPORT/api/movie/$radarr_movie_id ...
  • В качестве альтернативы, используйте `, escape-символ PowerShell, для экранирования :, чтобы рассматривать его как литерал :
Invoke-WebRequest -Uri http://$RADARRIP`:$RADARRPORT/api/movie/$radarr_movie_id ...
  • Наконец, цитирование : тоже выборочно работает, как показано в ваш собственный ответ ; однако, хорошая привычка к формированию - использовать одинарное -цитирование ('...') для строк, которые должны использоваться буквально (дословно), то есть если интерполяция строки не необходимо:
Invoke-WebRequest -Uri http://$RADARRIP':'$RADARRPORT/api/movie/$radarr_movie_id ...
0 голосов
/ 04 мая 2020

Нет ошибок, Завершено пришлось упростить

$movie_path = $env:radarr_movie_path
$movie_id = $env:radarr_movie_id
$movie_name = $env:radarr_movie_title

function Get-TimeStamp {

    return "[{0:MM/dd/yy} {0:HH:mm:ss}]" -f (Get-Date)

}

Function LogWrite
{
   Param ([string]$logstring)

   Add-content $Logfile -value $logstring
}

$Logfile = "C:\Custom Scripts\Radarr.log"


if ($movie_path.contains("D:\Movies\"))
{
LogWrite "$(Get-TimeStamp) | $movie_path | $movie_id | added to server"
}
else
{
Invoke-WebRequest -Uri http://127.0.0.1:7878/api/movie/"$movie_id"?apikey=YourAPIkey -Method Delete
LogWrite "$(Get-TimeStamp) | $movie_path | $movie_id | $movie_name | movie removed from list"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...