Powershell - 使用 for each 循环将文件名分配给变量时缺少属性错误
Powershell - Missing attribute error when assign file names to a variable with a for each loop
我正在尝试遍历一个文件夹,获取文件夹中每个文件的文件名,然后将该文件名分配给一个变量。稍后我会在散列 table 中使用该变量。这是我遇到问题并不断收到此错误的地方:
At C:\Users\jnwankwo\Documents\IUR.ps1:19 char:16
+ Files.Add(fName, Counter)
+ ~
Missing argument in parameter list.
代码如下:
$folder = 'C:\Users\jnwankwo\Documents\IUR Test\r' # Enter the root path you want to monitor.
$Failedfolder = 'C:\Users\jnwankwo\Documents\IUR Test\r'
$filter = '*.*' # You can enter a wildcard filter here.
$Files = @{}
$Counter = 1
# In the following line, you can change 'IncludeSubdirectories to $true if required.
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}
Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
ForEach ($file in folder) {
$fName = file.Name
if (Files.ContainsKey(fName) = false)
{
Files.Add(fName, Counter)
}
if ((Files.ContainsKey(fName) = true) -and (Files.Item(fName) -lt 3))
{
Move-Item C:\Users\jnwankwo\Documents\IUR Test\r\*.txt C:\Users\jnwankwo\Documents\IUR Test -force
Files.Set_Item(fName, Counter++)
}
ElseIf ((Files.ContainsKey(fName) = true) -and (Files.Item(fName) == 3))
{
Files.Remove(fName)
Move-Item C:\Users\jnwankwo\Documents\IUR Test\r\*.txt Failedfolder -force
}
}
}
有人可以帮忙吗?
您缺少变量前的 $
。
所以将所有 fName
替换为 $fName
。您还必须将 file.Name
重命名为 $file.Name
。您还错过了 Files.Add($fName, Counter)
中 Counter
上的 $
,您必须写 $false
而不是 false
...
这应该是固定版本:
$folder = 'C:\Users\jnwankwo\Documents\IUR Test\r' # Enter the root path you want to monitor.
$Failedfolder = 'C:\Users\jnwankwo\Documents\IUR Test\r'
$filter = '*.*' # You can enter a wildcard filter here.
$Files = @{}
$Counter = 1
# In the following line, you can change 'IncludeSubdirectories to $true if required.
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}
Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
ForEach ($file in $folder)
{
$fName = $file.Name
if (-not $Files.ContainsKey($fName))
{
$Files.Add($fName, $Counter)
}
if (($Files.ContainsKey($fName)) -and ($Files.Item($fName) -lt 3))
{
Move-Item 'C:\Users\jnwankwo\Documents\IUR Test\r\*.txt' 'C:\Users\jnwankwo\Documents\IUR Test' -force
$Files.Set_Item($fName, $Counter++)
}
ElseIf (($Files.ContainsKey($fName)) -and ($Files.Item($fName) -eq 3))
{
$Files.Remove($fName)
Move-Item 'C:\Users\jnwankwo\Documents\IUR Test\r\*.txt' $Failedfolder -force
}
}
}
是的,正如 jisaak 所说,您错过了带有表达式的变量。
所以用变量替换所有声明可能会解决问题。
此外,还有一件事,当您下次尝试创建任何 powershell 脚本时,请尝试使用 PSDebug cmdlet 来调试您的脚本。它非常方便。我觉得很有用。
只需在 运行 脚本之前或脚本顶部添加以下代码。
Set-PSDebug -Trace 1
我正在尝试遍历一个文件夹,获取文件夹中每个文件的文件名,然后将该文件名分配给一个变量。稍后我会在散列 table 中使用该变量。这是我遇到问题并不断收到此错误的地方:
At C:\Users\jnwankwo\Documents\IUR.ps1:19 char:16
+ Files.Add(fName, Counter)
+ ~
Missing argument in parameter list.
代码如下:
$folder = 'C:\Users\jnwankwo\Documents\IUR Test\r' # Enter the root path you want to monitor.
$Failedfolder = 'C:\Users\jnwankwo\Documents\IUR Test\r'
$filter = '*.*' # You can enter a wildcard filter here.
$Files = @{}
$Counter = 1
# In the following line, you can change 'IncludeSubdirectories to $true if required.
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}
Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
ForEach ($file in folder) {
$fName = file.Name
if (Files.ContainsKey(fName) = false)
{
Files.Add(fName, Counter)
}
if ((Files.ContainsKey(fName) = true) -and (Files.Item(fName) -lt 3))
{
Move-Item C:\Users\jnwankwo\Documents\IUR Test\r\*.txt C:\Users\jnwankwo\Documents\IUR Test -force
Files.Set_Item(fName, Counter++)
}
ElseIf ((Files.ContainsKey(fName) = true) -and (Files.Item(fName) == 3))
{
Files.Remove(fName)
Move-Item C:\Users\jnwankwo\Documents\IUR Test\r\*.txt Failedfolder -force
}
}
}
有人可以帮忙吗?
您缺少变量前的 $
。
所以将所有 fName
替换为 $fName
。您还必须将 file.Name
重命名为 $file.Name
。您还错过了 Files.Add($fName, Counter)
中 Counter
上的 $
,您必须写 $false
而不是 false
...
这应该是固定版本:
$folder = 'C:\Users\jnwankwo\Documents\IUR Test\r' # Enter the root path you want to monitor.
$Failedfolder = 'C:\Users\jnwankwo\Documents\IUR Test\r'
$filter = '*.*' # You can enter a wildcard filter here.
$Files = @{}
$Counter = 1
# In the following line, you can change 'IncludeSubdirectories to $true if required.
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'}
Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
ForEach ($file in $folder)
{
$fName = $file.Name
if (-not $Files.ContainsKey($fName))
{
$Files.Add($fName, $Counter)
}
if (($Files.ContainsKey($fName)) -and ($Files.Item($fName) -lt 3))
{
Move-Item 'C:\Users\jnwankwo\Documents\IUR Test\r\*.txt' 'C:\Users\jnwankwo\Documents\IUR Test' -force
$Files.Set_Item($fName, $Counter++)
}
ElseIf (($Files.ContainsKey($fName)) -and ($Files.Item($fName) -eq 3))
{
$Files.Remove($fName)
Move-Item 'C:\Users\jnwankwo\Documents\IUR Test\r\*.txt' $Failedfolder -force
}
}
}
是的,正如 jisaak 所说,您错过了带有表达式的变量。
所以用变量替换所有声明可能会解决问题。
此外,还有一件事,当您下次尝试创建任何 powershell 脚本时,请尝试使用 PSDebug cmdlet 来调试您的脚本。它非常方便。我觉得很有用。
只需在 运行 脚本之前或脚本顶部添加以下代码。
Set-PSDebug -Trace 1