【问题标题】:powershell - Variable reference is not valid. ':' was not followed by a valid variable name characterpowershell - 变量引用无效。 ':' 后面没有有效的变量名字符
【发布时间】:2020-05-03 21:14:04
【问题描述】:

我试图做的是,在将网络客户端请求的电影移动到个人文件夹后,让雷达删除它,所以如果默认路径是 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

【问题讨论】:

    标签: powershell


    【解决方案1】:

    当您使用 unquoted 复合字符串作为命令参数时,PowerShell 会隐式将其视为 可扩展字符串,即好像它是用双引号 ( "...")

    This answer 全面概述了 PowerShell 中的可扩展字符串(字符串插值)。

    相关方面是 : 跟在 $RADARRIP 等变量引用之后被视为该变量引用的部分$: 被认为是(PowerShell)驱动器的名称,而遵循: 应该是项目的名称或路径 在那个驱动器中;也就是说,变量引用被解释为 PowerShell 的 namespace variable notation 的一个实例。

    因此,PowerShell 必须明确告知$RADARRIP 后面的: 不是变量引用的一部分,对此您有多种选择:

    • 最常用的 PowerShell 选项是使用 {...} 来描述变量名:
    Invoke-WebRequest -Uri http://${RADARRIP}:$RADARRPORT/api/movie/$radarr_movie_id ...
    
    • 或者,使用 PowerShell 的转义字符 ` 转义 : 以便将其视为文字
    Invoke-WebRequest -Uri http://$RADARRIP`:$RADARRPORT/api/movie/$radarr_movie_id ...
    
    • 最后,quoting : selectively 也有效;但是,请注意,此类复合字符串仅在第一个组件未被引用时才有效(请参阅this answer):
    Invoke-WebRequest -Uri http://$RADARRIP':'$RADARRPORT/api/movie/$radarr_movie_id ...
    

    【讨论】:

      【解决方案2】:

      没有错误,完成得简化一下

      $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"
      }
      

      【讨论】:

      • 我很抱歉 mklement0 如果你不接受人们在那里发布可能会在未来帮助人们的成品,分解事情看看我的工作方式,并将始终发布我完成的代码与大家分享如果我在接受所有建议后在网站/论坛上提出问题,我将发布最终项目以鼓励人们操纵我的代码以使他们受益
      • 您是否发布自己的答案不是接受的问题,而是要达成共同的理解:我试图争论为什么我的答案更有可能对未来的读者有用,因此接受它是有意义的。这并不妨碍您发布自己的答案,尽管 - 再次 - 这对您来说似乎很特别。更重要的是,您的答案令人困惑,因为冒犯的 : 不再是其中的一部分。
      • 总结:-1 用于发布未解决原始问题的解决方案(如问题标题中突出显示的那样),以及对原始代码的细节进行令人困惑的更改。一般而言,SO 的价值不在于发布完整解决方案,其中包含附带问题:它是关于集中问题只有尽可能多的代码来描述问题,以及类似的重点答案。
      猜你喜欢
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      • 2020-05-17
      • 1970-01-01
      • 2012-09-27
      • 1970-01-01
      相关资源
      最近更新 更多