Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops pdf文件未在文件夹中移动:无法将参数绑定到参数';路径';因为它是null-ForEach对象cmdlet与ForEach循环_Loops_Powershell_Syntax - Fatal编程技术网

Loops pdf文件未在文件夹中移动:无法将参数绑定到参数';路径';因为它是null-ForEach对象cmdlet与ForEach循环

Loops pdf文件未在文件夹中移动:无法将参数绑定到参数';路径';因为它是null-ForEach对象cmdlet与ForEach循环,loops,powershell,syntax,Loops,Powershell,Syntax,我使用一个脚本创建文件夹,从文本文件(.txt)中提取年份。我在C:\Path中有一些pdf文件,就像这样 Ben - Hur.pdf Ben 10 - Corsa contro il tempo.pdf Ben Hur - Dvd2.pdf Ben-Hur - Dvd1.pdf Bolide Rosso - Johnny Dark (1954).pdf Hard Night (Permanent Midnight).pdf The Dark Valley.pdf 相反,文件文本(Text4.

我使用一个脚本创建文件夹,从文本文件(.txt)中提取年份。
我在C:\Path中有一些pdf文件,就像这样

Ben - Hur.pdf
Ben 10 - Corsa contro il tempo.pdf
Ben Hur - Dvd2.pdf
Ben-Hur - Dvd1.pdf
Bolide Rosso - Johnny Dark (1954).pdf
Hard Night (Permanent Midnight).pdf
The Dark Valley.pdf
相反,文件文本(
Text4.txt
)是

Hard Night (Permanent Midnight 1998)
Ben-Hur (1925) 
Ben Hur (1959) [Storico [CURA] 
Ben Hur Dvd2 (1959) 
Ben Hur - Dvd1 (1959)[Top 250 - Ita Eng]
The Dark Valley (2014) [ - Ita Deu Aac] Western
Bolide Rosso - Johnny Dark (1954) [it] Azione
Ben - Hur (1959) 
脚本从Text4.txt中提取年份,并使此文件夹如下

1925
1950
1998
但当它应该移动pdf文件时,powershell脚本会返回此错误

Move.Iten:无法将参数绑定到参数“Path”,因为它为null

此错误很奇怪(我使用Powershell 5)。脚本可以正确创建文件夹,但不能在其中移动文件。剧本是这样的吗

$movies = @()
(get-content C:\Path\Test4.txt) | foreach($_){
$properties = @{
date = $_.substring($_.IndexOf("(")+1,4)
name = $_.substring(0,$_.IndexOf("("))
}
write-host $date
write-host $name

$movies += New-Object PSObject -Property $properties
}

$torrentFiles = dir $torrentPath

foreach($movie in $movies){
$datePath = "C:\Path\$($movie.date)"
if(-not(test-path $datePath)) {
new-item $datePath -ItemType "directory"
}
$words = ($movie.name -split '\s') | ?{ $_.Length -gt 1}
$significant = $words.Count
 foreach($torrentFile in $torrentFiles){
 $matchingWords = 0
  foreach($word in $words){
   if($torrentFile.BaseName -match $word){
    $matchingWords += 1
   }
  }
  if($matchingWords -ge $significant){
  $_ | Move-Item -Destination $datePath
  }
 }
}

您可以使用
Foreach
循环,然后尝试使用管道对象访问属性,就像在
Foreach对象
循环中一样。您需要将
$\uuuu
更改为具有实际值的内容,我猜
$torrentFile

if($matchingWords -ge $significant){
  Move-Item -path $torrentfile -Destination $datePath
}

您可以使用
Foreach
循环,然后尝试使用管道对象访问属性,就像在
Foreach对象
循环中一样。您需要将
$\uuuu
更改为具有实际值的内容,我猜
$torrentFile

if($matchingWords -ge $significant){
  Move-Item -path $torrentfile -Destination $datePath
}
要补充一些背景信息

  • ForEach对象
    是一个cmdlet,您可以在管道中使用它来迭代处理输入,每个输入对象表示为自动变量
    $\ucode>或
    $PSItem
    。您可以将其视为一个隐式循环

  • foreach
    是一个语言关键字,它启动流控制语句,用于在脚本中编写显式循环选择迭代变量的名称以及要循环的集合,例如
    foreach($move in$movies){…}

    • 不能(直接)在管道中使用
      foreach
      语句
    • $在
      foreach
      循环中没有意义
二者不同,在不同的情况下使用;不幸的是,PowerShell为
ForEach对象
cmdlet(也称为
ForEach
)提供别名这一事实有点令人困惑

如果使用
foreach
,PowerShell会从解析上下文中知道您是在引用cmdlet还是language关键字-请参阅

cmdlet是以所谓的参数模式进行解析的,粗略地说,就是命令行语法:命令名后跟空格分隔的参数。(另一种模式类似于传统编程语言,即表达式模式)


请注意,您尝试使用
。|foreach($){…}
实际上通过其
foreach
别名调用了
foreach对象
cmdlet,尽管-externeous-
($)
部分碰巧使它看起来像
foreach
语句

再次说明:
$\u
自动设置为手头的管道对象-无需声明迭代器变量

您的命令的
($)
部分实际上被悄悄地忽略了
(实际上,它最终将
$null
-因为
$\u
在脚本块之外的那一点上没有值-绑定到
-Begin
脚本块,这是一个无操作)。

用一些背景信息来补充:

  • ForEach对象
    是一个cmdlet,您可以在管道中使用它来迭代处理输入,每个输入对象表示为自动变量
    $\ucode>或
    $PSItem
    。您可以将其视为一个隐式循环

  • foreach
    是一个语言关键字,它启动流控制语句,用于在脚本中编写显式循环选择迭代变量的名称以及要循环的集合,例如
    foreach($move in$movies){…}

    • 不能(直接)在管道中使用
      foreach
      语句
    • $在
      foreach
      循环中没有意义
二者不同,在不同的情况下使用;不幸的是,PowerShell为
ForEach对象
cmdlet(也称为
ForEach
)提供别名这一事实有点令人困惑

如果使用
foreach
,PowerShell会从解析上下文中知道您是在引用cmdlet还是language关键字-请参阅

cmdlet是以所谓的参数模式进行解析的,粗略地说,就是命令行语法:命令名后跟空格分隔的参数。(另一种模式类似于传统编程语言,即表达式模式)


请注意,您尝试使用
。|foreach($){…}
实际上通过其
foreach
别名调用了
foreach对象
cmdlet,尽管-externeous-
($)
部分碰巧使它看起来像
foreach
语句

再次说明:
$\u
自动设置为手头的管道对象-无需声明迭代器变量

您的命令的
($)
部分实际上被悄悄地忽略了
(实际上,它最终将
$null
——因为
$\u
在脚本块之外的那一点上没有值——绑定到
-Begin
脚本块,这是一个无操作)。

它可以工作!但请帮助我理解:错误是管道对象像foreach对象循环一样使用,因为它是未定义的?对于