Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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
Powershell-未为每个循环输入脚本_Shell_Loops_Powershell_Foreach_Hashtable - Fatal编程技术网

Powershell-未为每个循环输入脚本

Powershell-未为每个循环输入脚本,shell,loops,powershell,foreach,hashtable,Shell,Loops,Powershell,Foreach,Hashtable,我有一个脚本集,可以在每次创建文件时为每个循环输入一个。一旦进入循环,它会将一个文件移动到另一个文件夹中,如果同一个文件必须移动3次,它会将该文件移动到另一个表中,并从哈希表中删除该文件的记录 我的问题是,当我运行脚本时,它不会执行我在for-each循环中编写的任何操作。除非我在上面写脚本。有人能给点建议吗 $folder = 'C:\Users\jnwankwo\Documents\IUR Test\r' # Enter the root path you want

我有一个脚本集,可以在每次创建文件时为每个循环输入一个。一旦进入循环,它会将一个文件移动到另一个文件夹中,如果同一个文件必须移动3次,它会将该文件移动到另一个表中,并从哈希表中删除该文件的记录

我的问题是,当我运行脚本时,它不会执行我在for-each循环中编写的任何操作。除非我在上面写脚本。有人能给点建议吗

$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


$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.clear()
            Move-Item 'C:\Users\jnwankwo\Documents\Failed\' $Failedfolder -force
        }
    }
} 

# To stop the monitoring, run the following commands: 
# Unregister-Event FileCreated 

我在你的代码中发现了一件事


ForEach($folder中的文件)更改为ForEach($gci$folder中的文件))

我在您的代码中发现了一件事


ForEach($folder中的文件)更改为ForEach($gci$folder中的文件))

在这里,您必须将文件夹更改回:)

补充:

要将哈希表存储到文件并在下次运行时重新导入,可以使用以下代码:

#store hashtable to file
$Files.GetEnumerator() | % { "$($_.Name)=$($_.Value)" } | Out-File files_ht.txt

#to import again
$Files = Get-Content files_ht.txt | Convertfrom-StringData

这将使您能够持久保存哈希表中的数据

在这里,您将不得不更改文件夹:)

补充:

要将哈希表存储到文件并在下次运行时重新导入,可以使用以下代码:

#store hashtable to file
$Files.GetEnumerator() | % { "$($_.Name)=$($_.Value)" } | Out-File files_ht.txt

#to import again
$Files = Get-Content files_ht.txt | Convertfrom-StringData

这应该使您能够将哈希表中的数据持久化

假设$folder中的
$file是什么意思?您在scriptblock外部声明文件夹变量,并且不将其作为参数传递,因此scriptblock中的
$folder
为空(对于
$counter
$Files
也是如此)。将其作为参数传递或在scriptblock中声明,还有@AgentK wrote,你能告诉我你的意思吗?到目前为止,我没有得到一个不同的结果。假设$folder中的
$file
是什么意思?您在scriptblock外部声明文件夹变量,并且不将其作为参数传递,因此scriptblock中的
$folder
为空(对于
$counter
$Files
也是如此)。将其作为参数传递或在scriptblock中声明,还有@AgentK wrote,你能告诉我你的意思吗?到目前为止,我没有得到一个不同的结果。哈希表每次都被重新创建,从而阻止foreach循环到达elseif。我认为如果所有变量和哈希表都是全局的,那就更好了。你能告诉我怎么做吗?@user3162426问题是,你只需将scriptblock交给它一次,从那时起,每次它被触发时,它都会在自己的上下文中运行。如果需要在一次运行到下一次运行时接管数据,则需要将其存储在脚本之外,例如在注册表中。Powershell变量仅在afaik、全局或全局环境中创建会话时有效not@user3162426我添加了一些代码,允许您从文件中存储和加载哈希表,这样您就可以在运行过程中保持它。不过,在清空哈希表时不要忘记清空文件,否则会遇到问题;)每次都会重新创建哈希表,因此会阻止foreach循环到达elseif。我认为如果所有变量和哈希表都是全局的,那就更好了。你能告诉我怎么做吗?@user3162426问题是,你只需将scriptblock交给它一次,从那时起,每次它被触发时,它都会在自己的上下文中运行。如果需要在一次运行到下一次运行时接管数据,则需要将其存储在脚本之外,例如在注册表中。Powershell变量仅在afaik、全局或全局环境中创建会话时有效not@user3162426我添加了一些代码,允许您从文件中存储和加载哈希表,这样您就可以在运行过程中保持它。不过,在清空哈希表时不要忘记清空文件,否则会遇到问题;)