使用Perl删除整个Reg目录

使用Perl删除整个Reg目录,perl,registry,regedit,Perl,Registry,Regedit,我想使用perl命令删除Windows机器中的注册表。 我该怎么做呢。我尝试了一些来自互联网的命令,它正在被执行,但没有被删除 请提供帮助!! 下面的代码执行,但不删除注册表项 use warnings; use strict; use Win32::TieRegistry( Delimiter=>"/", ArrayValues=>0 ); my $myway= delete $Registry->{"HKEY_LOCAL_MACHINE/S

我想使用perl命令删除Windows机器中的注册表。 我该怎么做呢。我尝试了一些来自互联网的命令,它正在被执行,但没有被删除 请提供帮助!! 下面的代码执行,但不删除注册表项

use warnings;
use strict;

use Win32::TieRegistry( Delimiter=>"/", ArrayValues=>0 );

my $myway= delete $Registry->{"HKEY_LOCAL_MACHINE/SOFTWARE/Keypath"};

print "Done";

首先,您需要正确的权限来删除注册表项(尝试使用管理员权限从CMD运行Perl脚本),其次,根据,您只能删除不包含任何子项的项:

可以使用Perl delete函数从注册表中删除值 键或删除子键,只要该子键不包含 它自己的

第三,即使您以管理员权限运行,也可能存在无法删除的密钥,有关更多信息,请参阅Q&A

因此,如果要删除整个子树,则需要在树中进行自底向上的迭代,并分别删除每个子键。以下是一个例子:

use feature qw(say);
use warnings;
use strict;
use Data::Dumper qw(Dumper);
use Win32::RunAsAdmin qw(force);
use Win32API::Registry qw(regLastError KEY_READ KEY_WRITE);
use Win32::TieRegistry( Delimiter=>"/", ArrayValues=>0 );
{
    # Choose the top root node that should be deleted
    # Note: This and all its subkeys will be deleted from the registry.
    # Note: Will only succeed if you have permission to write to each sub key
    my $top_key_name = "HKEY_CLASSES_ROOT/Directory/Background/shell/Foo";
    my $tree = $Registry->Open(
        $top_key_name,  
       { Access=>KEY_READ()|KEY_WRITE(), Delimiter=>"/" } 
    );
    die "Could not open key $top_key_name: $^E" if !defined $tree;
    delete_subtree( $tree, my $level = 0);
}

sub delete_subtree {
    my ($tree, $level) = @_;
    my $path = $tree->Path();
    my @subkeys = $tree->SubKeyNames();
    for my $name (@subkeys) {
        my $subtree = $tree->{$name."/"};
        if (!defined $subtree) {
            die "Cannot access subkey $name for $path: " . regLastError() . ". Abort.";
        }
        if (ref $subtree) {
            delete_subtree($subtree, $level + 1);
        }
        else {
            die "Subkey $name for $path is not a hash ref. Abort.";
        }
    }
    
    # assuming the previous recursive code has deleted all sub keys of the 
    # current key, we can now try delete this key
    say "Trying to delete $path ..";
    my $res = delete $Registry->{$path};
    if (!defined $res) {
        die "..Failed to delete key : $^E";
    }
    else {
        say "  -> success";
    }
}

首先,您需要正确的权限来删除注册表项(尝试使用管理员权限从CMD运行Perl脚本),其次,根据,您只能删除不包含任何子项的项:

可以使用Perl delete函数从注册表中删除值 键或删除子键,只要该子键不包含 它自己的

第三,即使您以管理员权限运行,也可能存在无法删除的密钥,有关更多信息,请参阅Q&A

因此,如果要删除整个子树,则需要在树中进行自底向上的迭代,并分别删除每个子键。以下是一个例子:

use feature qw(say);
use warnings;
use strict;
use Data::Dumper qw(Dumper);
use Win32::RunAsAdmin qw(force);
use Win32API::Registry qw(regLastError KEY_READ KEY_WRITE);
use Win32::TieRegistry( Delimiter=>"/", ArrayValues=>0 );
{
    # Choose the top root node that should be deleted
    # Note: This and all its subkeys will be deleted from the registry.
    # Note: Will only succeed if you have permission to write to each sub key
    my $top_key_name = "HKEY_CLASSES_ROOT/Directory/Background/shell/Foo";
    my $tree = $Registry->Open(
        $top_key_name,  
       { Access=>KEY_READ()|KEY_WRITE(), Delimiter=>"/" } 
    );
    die "Could not open key $top_key_name: $^E" if !defined $tree;
    delete_subtree( $tree, my $level = 0);
}

sub delete_subtree {
    my ($tree, $level) = @_;
    my $path = $tree->Path();
    my @subkeys = $tree->SubKeyNames();
    for my $name (@subkeys) {
        my $subtree = $tree->{$name."/"};
        if (!defined $subtree) {
            die "Cannot access subkey $name for $path: " . regLastError() . ". Abort.";
        }
        if (ref $subtree) {
            delete_subtree($subtree, $level + 1);
        }
        else {
            die "Subkey $name for $path is not a hash ref. Abort.";
        }
    }
    
    # assuming the previous recursive code has deleted all sub keys of the 
    # current key, we can now try delete this key
    say "Trying to delete $path ..";
    my $res = delete $Registry->{$path};
    if (!defined $res) {
        die "..Failed to delete key : $^E";
    }
    else {
        say "  -> success";
    }
}

您是否以管理员权限运行perl脚本?如果没有,您可能无权删除key@HåkonHægland,我怎么能做到这一点,你的意思是从cmd运行,打开它作为administrator@HåkonHægland我尝试了这个命令,它正在被执行,但最终,密钥没有被删除。我认为,这是由于管理员特权,如你所说。但是,我尝试从Admin:cmd运行脚本。没用。有什么建议吗?您是否以管理员权限运行perl脚本?如果没有,您可能无权删除key@HåkonHægland,我怎么能做到这一点,你的意思是从cmd运行,打开它作为administrator@HåkonHægland我尝试了这个命令,它正在被执行,但最终,密钥没有被删除。我认为,这是由于管理员特权,如你所说。但是,我尝试从Admin:cmd运行脚本。没用。有什么建议吗?