如何在 PowerShell 中创建 desktop.ini?
How to create desktop.ini in PowerShell?
我的目标是如果文件夹名称以“_S”结尾,则自定义所有文件夹图标
所以我写了一个 PowerShell 函数,但自定义不起作用。
我的灵感来自:
Website to set attribute on desktop.ini
Function that sets a custom folder icon
function Set-icon_Folder_S($path)
{
$ini = '[.ShellClassInfo]
IconIndex = 0
IconResource=C:\private.ico,0
ConfirmFileOp = 0
DefaultDropEffect = 1'
Set-Location $path
#List all folder end with _S
$items = Get-ChildItem -Recurse | Where-Object {($_.Attributes -match "Directory") -and ($_.Name.EndsWith("_S"))} | Select-Object -ExpandProperty FullName
#For each folder _S ...
foreach ($item in $items)
{
Set-Location $item
#Init. Delete desktop.ini if exist
try {
Remove-Item desktop.ini -Force -erroraction stop
}
catch {
}
#Write desktop.ini
Write-Host "Go to $($item)"
$ini | Out-File desktop.ini -Force
Set-ItemProperty desktop.ini -Name Attributes -Value “ReadOnly,System,Hidden”
}
}
我没有发现错误。
以下调整后的脚本对我有用:将 empty-line 添加到 desktop.ini
尾部本身就可以解决问题(调用 attrib.exe
我先试过了,所以它 可能过剩):
function Set-icon_Folder_S($path)
{
$ini = '[.ShellClassInfo]
IconIndex = 0
IconResource=D:\Remote\icons\folderBlue.ico,0
ConfirmFileOp = 0
DefaultDropEffect = 1
' ### empty line: important
Push-Location "$path" ### Push-Location instead of Set-Location
#List all folder end with _S
$items = Get-ChildItem -Recurse |
Where-Object {
($_.Attributes -match "Directory") -and ($_.Name.EndsWith("es"))} |
Select-Object -ExpandProperty FullName ### ↑↑ change!!!
#For each folder _S ...
foreach ($item in $items)
{
Push-Location "$item" ### Push-Location instead of Set-Location
#Init. Delete desktop.ini if exist
try {
Remove-Item desktop.ini -Force -erroraction stop
}
catch { ### Write-Host "error removing $($item)"
}
#Write desktop.ini
Write-Host "Go to $($item)"
$ini | Out-File desktop.ini -Force
Set-ItemProperty desktop.ini -Name Attributes -Value “ReadOnly,System,Hidden”
Pop-Location ### Pop-Location for corresponding Push-Location
attrib.exe +R +S "$item" ### Follow DESKTOP.INI CUSTOMIZATIONS DO NOT …
}
Pop-Location ### Pop-Location for corresponding Push-Location
}
Set-icon_Folder_S "D:\PShell" ### call function declared above
更改在上面的代码中使用###注释进行了描述(except IconResource
):
### another IconResource used to match my testing environment
### empty line: important
### Push-Location instead of Set-Location
### used `"es"` suffix instead of `"_S"` one to match my testing environment
### Pop-Location for corresponding Push-Location
attrib.exe +R +S "$item" ### Follow DESKTOP.INI CUSTOMIZATIONS DO NOT TAKE EFFECT
Set-icon_Folder_S "D:\PShell" ### call function declared above
我的目标是如果文件夹名称以“_S”结尾,则自定义所有文件夹图标 所以我写了一个 PowerShell 函数,但自定义不起作用。
我的灵感来自:
Website to set attribute on desktop.ini
Function that sets a custom folder icon
function Set-icon_Folder_S($path)
{
$ini = '[.ShellClassInfo]
IconIndex = 0
IconResource=C:\private.ico,0
ConfirmFileOp = 0
DefaultDropEffect = 1'
Set-Location $path
#List all folder end with _S
$items = Get-ChildItem -Recurse | Where-Object {($_.Attributes -match "Directory") -and ($_.Name.EndsWith("_S"))} | Select-Object -ExpandProperty FullName
#For each folder _S ...
foreach ($item in $items)
{
Set-Location $item
#Init. Delete desktop.ini if exist
try {
Remove-Item desktop.ini -Force -erroraction stop
}
catch {
}
#Write desktop.ini
Write-Host "Go to $($item)"
$ini | Out-File desktop.ini -Force
Set-ItemProperty desktop.ini -Name Attributes -Value “ReadOnly,System,Hidden”
}
}
我没有发现错误。
以下调整后的脚本对我有用:将 empty-line 添加到 desktop.ini
尾部本身就可以解决问题(调用 attrib.exe
我先试过了,所以它 可能过剩):
function Set-icon_Folder_S($path)
{
$ini = '[.ShellClassInfo]
IconIndex = 0
IconResource=D:\Remote\icons\folderBlue.ico,0
ConfirmFileOp = 0
DefaultDropEffect = 1
' ### empty line: important
Push-Location "$path" ### Push-Location instead of Set-Location
#List all folder end with _S
$items = Get-ChildItem -Recurse |
Where-Object {
($_.Attributes -match "Directory") -and ($_.Name.EndsWith("es"))} |
Select-Object -ExpandProperty FullName ### ↑↑ change!!!
#For each folder _S ...
foreach ($item in $items)
{
Push-Location "$item" ### Push-Location instead of Set-Location
#Init. Delete desktop.ini if exist
try {
Remove-Item desktop.ini -Force -erroraction stop
}
catch { ### Write-Host "error removing $($item)"
}
#Write desktop.ini
Write-Host "Go to $($item)"
$ini | Out-File desktop.ini -Force
Set-ItemProperty desktop.ini -Name Attributes -Value “ReadOnly,System,Hidden”
Pop-Location ### Pop-Location for corresponding Push-Location
attrib.exe +R +S "$item" ### Follow DESKTOP.INI CUSTOMIZATIONS DO NOT …
}
Pop-Location ### Pop-Location for corresponding Push-Location
}
Set-icon_Folder_S "D:\PShell" ### call function declared above
更改在上面的代码中使用###注释进行了描述(except IconResource
):
### another IconResource used to match my testing environment
### empty line: important
### Push-Location instead of Set-Location
### used `"es"` suffix instead of `"_S"` one to match my testing environment
### Pop-Location for corresponding Push-Location
attrib.exe +R +S "$item" ### Follow DESKTOP.INI CUSTOMIZATIONS DO NOT TAKE EFFECT
Set-icon_Folder_S "D:\PShell" ### call function declared above