通过系统配置文件将文件复制到文件夹中
Copying file into folder via system profile
我正在尝试替换 Firefox 配置文件中的 prefs.js 文件,以更改 firefox 在大约 5k 台机器上的行为方式。
我杀了firefox,用脚本删除了文件
Remove-Item -Path "C:\Users\*\AppData\Roaming\Mozilla\Firefox\Profiles\*\prefs.js" -Force -Recurse
这没有问题。然后我使用 copy-item 将所需的 prefs.js 副本拉入机器上的所有 firefox 配置文件。这是我要问的脚本。
$Target = Get-ChildItem -path "C:\Users\*\AppData\Roaming\Mozilla\Firefox\Profiles\*"
Copy-Item "C:\DTS\BMC\ReplacePrefsjs\prefs.js" -Destination $Target -Force -Recurse
当我在自己的(域管理员)帐户上手动 运行 脚本时,我收到所有不是我的用户配置文件的访问被拒绝错误,但文件已成功复制到我的 firefox 配置文件。这似乎很正常,因为它只是 运行 普通权限。这是该执行的日志摘录:
Get-ChildItem : Access is denied
At C:\DTS\BMC\ReplacePrefsjs\PrefsJSReplace.ps1:2 char:11
+ $Target = Get-ChildItem -path "C:\Users\*\AppData\Roaming\Mozilla\Fir ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (C:\Users\<removed>\AppData:String) [Get-ChildItem], UnauthorizedAccessException
+ FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand
Get-ChildItem : Access is denied
At C:\DTS\BMC\ReplacePrefsjs\PrefsJSReplace.ps1:2 char:11
+ $Target = Get-ChildItem -path "C:\Users\*\AppData\Roaming\Mozilla\Fir ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (C:\Users\<removed>\AppData:String) [Get-ChildItem], UnauthorizedAccessException
+ FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand
但是,当我用我们的部署解决方案(如 SCCM 等)发送脚本时,我收到以下错误:
PS>TerminatingError(Copy-Item): "Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 'Destination'. Specified method is not supported."
Copy-Item : Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 'Destination'. Specified
method is not supported.
At C:\DTS\BMC\ReplacePrefsjs\PrefsJSReplace.ps1:3 char:61
+ ... tem "C:\DTS\BMC\ReplacePrefsjs\prefs.js" -Destination $Target -Force ...
+ ~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Copy-Item], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.CopyItemCommand
Copy-Item : Cannot convert 'System.Object[]' to the type 'System.String'
required by parameter 'Destination'. Specified method is not supported.
At C:\DTS\BMC\ReplacePrefsjs\PrefsJSReplace.ps1:3 char:61
+ ... tem "C:\DTS\BMC\ReplacePrefsjs\prefs.js" -Destination $Target -Force ...
+ ~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Copy-Item], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.CopyItemCommand
当我第一次注意到这一点时,我认为脚本需要类似 'foreach' 的东西来处理 $Target 将提取的每个条目(运行 为所有 firefox 配置文件设置脚本),而不是-递归。
如果是这样,那么当我手动 运行 它时它也不应该工作,但是当我这样做时它会遍历每个配置文件,让我无法访问我可以访问的位置'在没有提升权限的情况下进行编辑,适用于我的个人资料,并在没有转换错误的情况下完成。
任何人都可以帮助我理解为什么我的 Copy-Item 无法通过系统配置文件 运行 解析目标 $Target 吗?
您正在使用 $Targets
创建对象数组
$Target = Get-ChildItem -path "C:\Users\*\AppData\Roaming\Mozilla\Firefox\Profiles\*"
这样您就不会通过管道传输输出,而只是将数组放入新命令中。
试试这个
Get-ChildItem "C:\Users\*\AppData\Roaming\Mozilla\Firefox\Profiles\*" -Directory | foreach-object{Copy-Item "C:\DTS\BMC\ReplacePrefsjs\prefs.js" -Destination $_ -Force -Recurse}
我正在尝试替换 Firefox 配置文件中的 prefs.js 文件,以更改 firefox 在大约 5k 台机器上的行为方式。
我杀了firefox,用脚本删除了文件
Remove-Item -Path "C:\Users\*\AppData\Roaming\Mozilla\Firefox\Profiles\*\prefs.js" -Force -Recurse
这没有问题。然后我使用 copy-item 将所需的 prefs.js 副本拉入机器上的所有 firefox 配置文件。这是我要问的脚本。
$Target = Get-ChildItem -path "C:\Users\*\AppData\Roaming\Mozilla\Firefox\Profiles\*"
Copy-Item "C:\DTS\BMC\ReplacePrefsjs\prefs.js" -Destination $Target -Force -Recurse
当我在自己的(域管理员)帐户上手动 运行 脚本时,我收到所有不是我的用户配置文件的访问被拒绝错误,但文件已成功复制到我的 firefox 配置文件。这似乎很正常,因为它只是 运行 普通权限。这是该执行的日志摘录:
Get-ChildItem : Access is denied
At C:\DTS\BMC\ReplacePrefsjs\PrefsJSReplace.ps1:2 char:11
+ $Target = Get-ChildItem -path "C:\Users\*\AppData\Roaming\Mozilla\Fir ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (C:\Users\<removed>\AppData:String) [Get-ChildItem], UnauthorizedAccessException
+ FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand
Get-ChildItem : Access is denied
At C:\DTS\BMC\ReplacePrefsjs\PrefsJSReplace.ps1:2 char:11
+ $Target = Get-ChildItem -path "C:\Users\*\AppData\Roaming\Mozilla\Fir ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (C:\Users\<removed>\AppData:String) [Get-ChildItem], UnauthorizedAccessException
+ FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand
但是,当我用我们的部署解决方案(如 SCCM 等)发送脚本时,我收到以下错误:
PS>TerminatingError(Copy-Item): "Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 'Destination'. Specified method is not supported."
Copy-Item : Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 'Destination'. Specified
method is not supported.
At C:\DTS\BMC\ReplacePrefsjs\PrefsJSReplace.ps1:3 char:61
+ ... tem "C:\DTS\BMC\ReplacePrefsjs\prefs.js" -Destination $Target -Force ...
+ ~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Copy-Item], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.CopyItemCommand
Copy-Item : Cannot convert 'System.Object[]' to the type 'System.String'
required by parameter 'Destination'. Specified method is not supported.
At C:\DTS\BMC\ReplacePrefsjs\PrefsJSReplace.ps1:3 char:61
+ ... tem "C:\DTS\BMC\ReplacePrefsjs\prefs.js" -Destination $Target -Force ...
+ ~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Copy-Item], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.CopyItemCommand
当我第一次注意到这一点时,我认为脚本需要类似 'foreach' 的东西来处理 $Target 将提取的每个条目(运行 为所有 firefox 配置文件设置脚本),而不是-递归。
如果是这样,那么当我手动 运行 它时它也不应该工作,但是当我这样做时它会遍历每个配置文件,让我无法访问我可以访问的位置'在没有提升权限的情况下进行编辑,适用于我的个人资料,并在没有转换错误的情况下完成。
任何人都可以帮助我理解为什么我的 Copy-Item 无法通过系统配置文件 运行 解析目标 $Target 吗?
您正在使用 $Targets
创建对象数组$Target = Get-ChildItem -path "C:\Users\*\AppData\Roaming\Mozilla\Firefox\Profiles\*"
这样您就不会通过管道传输输出,而只是将数组放入新命令中。 试试这个
Get-ChildItem "C:\Users\*\AppData\Roaming\Mozilla\Firefox\Profiles\*" -Directory | foreach-object{Copy-Item "C:\DTS\BMC\ReplacePrefsjs\prefs.js" -Destination $_ -Force -Recurse}