我正在尝试编写一个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文件的标题:
关注我的csv文件的屏幕截图
这是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为空。
按照我的剧本截图
跟踪与我的脚本相关的错误:
请有人可以帮助我,我是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
我真的很感谢你的帮助,
谢谢。
等待你的回复
答案 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
检查循环中每个组件的输出结果希望它有所帮助。