从powershell中的csv文件创建注册表项不起作用

时间:2016-12-27 15:15:41

标签: powershell csv registry

我正在尝试编写一个powershell脚本,该脚本从包含要创建的注册表列表的csv文件创建注册表项及其值。

问题是我收到了错误。仅创建了注册表项,而不是它们的属性。

这是我的csv文件“listeRegistre.csv”:

Path,Name,Value,Type
"HKCU:\Software\Clients\StartMenuInternet",(Default),"[ProductName].exe",String
"HKCU:\Software\Clients\StartMenuInternet\[ProductName].exe",(Default),"[ProductName]",String
"HKCU:\Software\Clients\StartMenuInternet\[ProductName].exe",LocalizedString,"[ProductName]",String
"HKCU:\Software\Clients\StartMenuInternet\[ProductName].exe\Capabilities",ApplicationDescription,"description",String
"HKCU:\Software\Clients\StartMenuInternet\[ProductName].exe\Capabilities","ApplicationIcon","[ProgramFilesFolder][Manufacturer]\[ProductName]\[ProductName].exe,0",String
"HKCU:\Software\Clients\StartMenuInternet\[ProductName].exe\Capabilities","ApplicationName","[ProductName]",String
"HKCU:\Software\Clients\StartMenuInternet\[ProductName].exe\Capabilities\FileAssociation","","",""
"HKCU:\Software\Clients\StartMenuInternet\[ProductName].exe\Capabilities\StartMenu","StartMenuInternet","[ProductName].exe",String
"HKCU:\Software\Clients\StartMenuInternet\[ProductName].exe\Capabilities\URLAssociations","ftp","[ProductName]URL",String
"HKCU:\Software\Clients\StartMenuInternet\[ProductName].exe\Capabilities\URLAssociations","ftps","[ProductName]URL",String
"HKCU:\Software\Clients\StartMenuInternet\[ProductName].exe\Capabilities\URLAssociations","http","[ProductName]URL",String
"HKCU:\Software\Clients\StartMenuInternet\[ProductName].exe\Capabilities\URLAssociations","https","[ProductName]URL",String
"HKCU:\Software\Clients\StartMenuInternet\[ProductName].exe\Capabilities\URLAssociations","url","[ProductName]URL",String
"HKCU:\Software\Clients\StartMenuInternet\[ProductName].exe\DefaultIcon","(Default)","[ProgramFilesFolder][Manufacturer]\[ProductName]\[ProductName].exe,0",String
"HKCU:\Software\Clients\StartMenuInternet\[ProductName].exe\InstallInfo","HideIconsCommand","[ProgramFilesFolder][Manufacturer]\[ProductName]\[ProductName].exe "--hideicons,String
"HKCU:\Software\Clients\StartMenuInternet\[ProductName].exe\InstallInfo","IconsVisible",1,DWord
"HKCU:\Software\Clients\StartMenuInternet\[ProductName].exe\InstallInfo","ReinstallCommand","[ProgramFilesFolder][Manufacturer]\[ProductName]\[ProductName].exe" --reinstall,String
"HKCU:\Software\Clients\StartMenuInternet\[ProductName].exe\InstallInfo","ShowIconsCommand","[ProgramFilesFolder][Manufacturer]\[ProductName]\[ProductName].exe" --showicons,String
"HKCU:\Software\Clients\StartMenuInternet\[ProductName].exe\shell\open\command","(Default)","[ProgramFilesFolder][Manufacturer]\[ProductName]\[ProductName].exe",String
"HKCU:\Software\Classes\[ProductName]HTML\shell\open\command",,"",""

csv文件的标题:

  • 路径:要创建的注册表项的路径
  • 名称:要创建的属性项的名称
  • 值:属性“名称”的值
  • 类型:属性的类型(REG_SZ OR DWORD)

关注我的csv文件的屏幕截图

this is my csv file

这是powershell脚本:

 $registries = import-csv "c:\registre\listeRegistre.csv"

    ForEach ($registry in $registries){

        $registryPath = $($registry.Path)
        $name = $($registry.Name)
        $value = $($registry.Value)
        $type = $($registry.Type)
        Write-host $registryPath $name $value $type

        #If the registry doesn't exist : creates it 
        #Else creates only the properties
        IF(!(Test-Path $registryPath)){
            New-Item -Path $registryPath -Force | Out-Null
            New-ItemProperty -Path $registryPath -Name $name -Value $value -PropertyType $type -Force | Out-Null}
        ELSE {
            New-ItemProperty -Path $registryPath -Name $name -Value $value -PropertyType $type -Force | Out-Null
        }

    }

数据在屏幕上正确显示。

我收到以下错误

New-ItemProperty : Impossible de lier l'argument au paramètre « Name », car il s'agit d'une chaîne vide.
Au niveau de ligne : 15 Caractère : 51
+         New-ItemProperty -Path $registryPath -Name <<<<  $name -Value $value -PropertyType $type -Force | Out-Null
    + CategoryInfo          : InvalidData: (:) [New-ItemProperty], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.NewItemPropertyCommand

错误的第一行的翻译: New-ItemProperty:由于Name为空,无法将Name与参数关联。

Test-Path : Impossible de lier l'argument au paramètre « Path », car il s'agit d'une chaîne vide.
    Au niveau de ligne : 13 Caractère : 19
    +     IF(!(Test-Path <<<<  $registryPath)){
        + CategoryInfo          : InvalidData: (:) [Test-Path], ParameterBindingValidationException
        + FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.TestPathCommand

错误的第一行的翻译: Test-Path:无法将参数与Path关联,因为Path为空。

按照我的剧本截图

This my script

跟踪与我的脚本相关的错误:

errors part1

errors part2

请有人可以帮助我,我是powershell的新手,因为这段代码适用于这样的一个注册表项,所以我陷入了困境:

$registryPath = "HKCU:\Software\ScriptingGuys\Scripts"

$name = "Version"

$value = "1"

$type = "DWORD"

IF(!(Test-Path $registryPath)){

    New-Item -Path $registryPath -Force | Out-Null

    New-ItemProperty -Path $registryPath -Name $name -Value $value -PropertyType $type -Force | Out-Null}
ELSE {
$value = "5"

    New-ItemProperty -Path $registryPath -Name $name -Value $value -PropertyType DWORD -Force | Out-Null
}

上面的脚本作为注册表项工作,它的属性都是没有问题的。

因此,针对上述问题,我使用了bert发布​​的脚本

$registries = import-csv "c:\registre\listeRegistre.csv"

    ForEach ($registry in $registries){

        $registryPath = $($registry.Path)
        $name = $($registry.Name)
        $value = $($registry.Value)
        $type = $($registry.Type)
        Write-host $registryPath $name $value $type

        #If the registry doesn't exist : creates it 
        #Else creates only the properties
        IF(!(Test-Path $registryPath)){
            New-Item -Path $registryPath -Force | Out-Null
            New-ItemProperty -Path $registryPath -Name $name -Value $value -PropertyType $type -Force | Out-Null}
        ELSE {
            New-ItemProperty -Path $registryPath -Name $name -Value $value -PropertyType $type -Force | Out-Null
        }

    }

但是当我发布这个脚本时,我得到了很多错误我无法理解,请你帮我解决这个问题。

我得到的错误:

Get-ItemProperty : Le membre « (default) » est déjà présent.
Au niveau de C:\registre\registry_scriptv3.ps1 : 15 Caractère : 24
+         if ((Get-ItemProperty <<<<  -Path $Path -Name $Name) -ne $Null)
    + CategoryInfo          : NotSpecified: (:) [Get-ItemProperty], ExtendedTy
   peSystemException
    + FullyQualifiedErrorId : AlreadyPresentPSMemberInfoInternalCollectionAdd,
   Microsoft.PowerShell.Commands.GetItemPropertyCommand

Remove-ItemProperty : La propriété (Default) n'existe pas dans le chemin d'accè
s HKEY_CURRENT_USER\Software\Clients\StartMenuInternet\[Product Name].e
xe.
Au niveau de C:\registre\registry_scriptv3.ps1 : 18 Caractère : 23
+             Remove-ItemProperty <<<<  -Path $Path -Name "$Name" -Force | out-
null
    + CategoryInfo          : InvalidArgument: ((Default):String) [Remove-Item
   Property], PSArgumentException
    + FullyQualifiedErrorId : System.Management.Automation.PSArgumentException
   ,Microsoft.PowerShell.Commands.RemoveItemPropertyCommand

Remove-ItemProperty : La propriété (Default) n'existe pas dans le chemin d'accè
s HKEY_CURRENT_USER\Software\Clients\StartMenuInternet\[Product Name].e
xe\DefaultIcon.
Au niveau de C:\registre\registry_scriptv3.ps1 : 18 Caractère : 23
+             Remove-ItemProperty <<<<  -Path $Path -Name "$Name" -Force | out-
null
    + CategoryInfo          : InvalidArgument: ((Default):String) [Remove-Item
   Property], PSArgumentException
    + FullyQualifiedErrorId : System.Management.Automation.PSArgumentException
   ,Microsoft.PowerShell.Commands.RemoveItemPropertyCommand

Remove-ItemProperty : La propriété (Default) n'existe pas dans le chemin d'accè
s HKEY_CURRENT_USER\Software\Clients\StartMenuInternet\[Product Name].e
xe\shell\open\command.
Au niveau de C:\registre\registry_scriptv3.ps1 : 18 Caractère : 23
+             Remove-ItemProperty <<<<  -Path $Path -Name "$Name" -Force | out-
null
    + CategoryInfo          : InvalidArgument: ((Default):String) [Remove-Item
   Property], PSArgumentException
    + FullyQualifiedErrorId : System.Management.Automation.PSArgumentException
   ,Microsoft.PowerShell.Commands.RemoveItemPropertyCommand

Remove-ItemProperty : La propriété (Default) n'existe pas dans le chemin d'accè
s HKEY_CURRENT_USER\Software\Classes\[Product Name]\DefaultIcon.
Au niveau de C:\registre\registry_scriptv3.ps1 : 18 Caractère : 23
+             Remove-ItemProperty <<<<  -Path $Path -Name "$Name" -Force | out-
null
    + CategoryInfo          : InvalidArgument: ((Default):String) [Remove-Item
   Property], PSArgumentException
    + FullyQualifiedErrorId : System.Management.Automation.PSArgumentException
   ,Microsoft.PowerShell.Commands.RemoveItemPropertyCommand

Remove-ItemProperty : La propriété (Default) n'existe pas dans le chemin d'accè
s HKEY_CURRENT_USER\Software\Classes\[Product Name]\shell\open\comm
and.
Au niveau de C:\registre\registry_scriptv3.ps1 : 18 Caractère : 23
+             Remove-ItemProperty <<<<  -Path $Path -Name "$Name" -Force | out-
null
    + CategoryInfo          : InvalidArgument: ((Default):String) [Remove-Item
   Property], PSArgumentException
    + FullyQualifiedErrorId : System.Management.Automation.PSArgumentException
   ,Microsoft.PowerShell.Commands.RemoveItemPropertyCommand

Remove-ItemProperty : La propriété (Default) n'existe pas dans le chemin d'accè
s HKEY_CURRENT_USER\Software\Classes\[Product Name]\DefaultIcon.
Au niveau de C:\registre\registry_scriptv3.ps1 : 18 Caractère : 23
+             Remove-ItemProperty <<<<  -Path $Path -Name "$Name" -Force | out-
null
    + CategoryInfo          : InvalidArgument: ((Default):String) [Remove-Item
   Property], PSArgumentException
    + FullyQualifiedErrorId : System.Management.Automation.PSArgumentException
   ,Microsoft.PowerShell.Commands.RemoveItemPropertyCommand

Remove-ItemProperty : La propriété (Default) n'existe pas dans le chemin d'accè
s HKEY_CURRENT_USER\Software\Classes\[Product Name]\shell\open\comma
nd.
Au niveau de C:\registre\registry_scriptv3.ps1 : 18 Caractère : 23
+             Remove-ItemProperty <<<<  -Path $Path -Name "$Name" -Force | out-
null
    + CategoryInfo          : InvalidArgument: ((Default):String) [Remove-Item
   Property], PSArgumentException
    + FullyQualifiedErrorId : System.Management.Automation.PSArgumentException
   ,Microsoft.PowerShell.Commands.RemoveItemPropertyCommand

Remove-ItemProperty : La propriété (Default) n'existe pas dans le chemin d'accè
s HKEY_CURRENT_USER\Software\Classes\Applications\[Product Name].exe\sh
ell\open\command.
Au niveau de C:\registre\registry_scriptv3.ps1 : 18 Caractère : 23
+             Remove-ItemProperty <<<<  -Path $Path -Name "$Name" -Force | out-
null
    + CategoryInfo          : InvalidArgument: ((Default):String) [Remove-Item
   Property], PSArgumentException
    + FullyQualifiedErrorId : System.Management.Automation.PSArgumentException
   ,Microsoft.PowerShell.Commands.RemoveItemPropertyCommand

Remove-ItemProperty : La propriété (Default) n'existe pas dans le chemin d'accè
s HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\App Paths\[Product Name].exe.
Au niveau de C:\registre\registry_scriptv3.ps1 : 18 Caractère : 23
+             Remove-ItemProperty <<<<  -Path $Path -Name "$Name" -Force | out-
null
    + CategoryInfo          : InvalidArgument: ((Default):String) [Remove-Item
   Property], PSArgumentException
    + FullyQualifiedErrorId : System.Management.Automation.PSArgumentException
   ,Microsoft.PowerShell.Commands.RemoveItemPropertyCommand

Remove-ItemProperty : Accès au registre demandé non autorisé.
Au niveau de C:\registre\registry_scriptv3.ps1 : 18 Caractère : 23
+             Remove-ItemProperty <<<<  -Path $Path -Name "$Name" -Force | out-
null
    + CategoryInfo          : PermissionDenied: (HKEY_CURRENT_US....htm\UserCh
   oice:String) [Remove-ItemProperty], SecurityException
    + FullyQualifiedErrorId : System.Security.SecurityException,Microsoft.Powe
   rShell.Commands.RemoveItemPropertyCommand

New-ItemProperty : Accès au registre demandé non autorisé.
Au niveau de C:\registre\registry_scriptv3.ps1 : 20 Caractère : 19
+         New-ItemProperty <<<<  -Path $Path -Name "$Name" -Value $Value -Prope
rtyType $Type -ErrorAction Stop -Force | Out-Null
    + CategoryInfo          : PermissionDenied: (HKEY_CURRENT_US....htm\UserCh
   oice:String) [New-ItemProperty], SecurityException
    + FullyQualifiedErrorId : System.Security.SecurityException,Microsoft.Powe
   rShell.Commands.NewItemPropertyCommand

我真的很感谢你的帮助,

谢谢。

等待你的回复

2 个答案:

答案 0 :(得分:2)

首先关闭csv文件的所有路径都不正确!正如Randip所说。 第二个是csv文件中的最后一行

"HKCU:\Software\Clients\StartMenuInternet\[ProductName].exe\Capabilities\FileAssociation","","",""

没有名称/类型/值,因此您无法创建没有名称的itemproperty!

这是我建议的一点代码更改:

$CsvFile = 'c:\listeRegistre.csv'



    import-csv -Path $CsvFile | ForEach-Object {
        $Name = $_.Name
        $Path = $_.Path
        $Type = $_.Type
        $Value = $_.Value
        IF(($_.Path -ne '') -and (!(Test-Path -Path $Path))) # If the registery path doesn't exist, create it
        {
            New-Item -Path $Path -Force | Out-Null
        }
        if (($Path -ne '') -and ($Name -ne ''))# if the property name is provided
        {
            if ((Get-ItemProperty -Path $Path -Name $Name) -ne $Null)
            {
                Remove-ItemProperty -Path $Path -Name "$Name" -Force | out-null

            }
            New-ItemProperty -Path $Path -Name "$Name" -Value $Value -PropertyType $Type -ErrorAction Stop -Force | Out-Null
        }
    }

答案 1 :(得分:0)

它只是输入中的错误。请仔细检查一下。

而不是:

$registries = import-csv "c:listeRegistre.csv"

执行此操作:

$ registries = import-csv&#39; c:\ listeRegistre.csv&#39;

这应该做你的工作。

还要使用 write-host $ registry write-host $ registryPath

检查循环中每个组件的输出结果

希望它有所帮助。