Scripts/SteamToggleUpdate/ToggleUpdates.ps1

69 lines
2.8 KiB
PowerShell

# function that takes in an app id as a number and returns the path to the steam library folder that contains the app id
function parseVDFforPath([int]$appId) {
# Steam libary folder vdf if using scoop
$scoopVDF = "$env:USERPROFILE\scoop\apps\steam\current\steamapps\libraryfolders.vdf"
# Steam library folders vdf absolute path
$normalVDF = "C:\Program Files (x86)\Steam\steamapps\libraryfolders.vdf"
# Set the path to the vdf file based on whether you are using scoop or not
$steamLibraryFoldersVDF = if (Test-Path $scoopVDF) { $scoopVDF } else { $normalVDF }
# convert the app id to a string
$appIdString = $appId.ToString()
# Get the contents of the vdf file
$steamLibraryFoldersVDFContents = Get-Content $steamLibraryFoldersVDF
# loop through each line of the vdf file
foreach ($line in $steamLibraryFoldersVDFContents) {
# if the line contains the app id
if ($line.Contains($appIdString)) {
# Take not of the line number
$lineNumber = $steamLibraryFoldersVDFContents.IndexOf($line)
# Get the line that contains the path, which you need to iterate backwards through the file, finding the first line that starts with "path"
for ($i = $lineNumber; $i -gt 0; $i--) {
# if the line starts with "path"
if ($steamLibraryFoldersVDFContents[$i].contains("path")) {
# take note of the line number
$pathLineNumber = $i
# get the line that contains the path
$pathLine = $steamLibraryFoldersVDFContents[$pathLineNumber]
# split the line by the quotation marks
$pathLineSplit = $pathLine.Split('"')
# the path is the 4th item in the array, because the keys are separated by quotation marks, and the values are separated by quotation marks
$path = $pathLineSplit[3]
# replace all the double backslashes with single backslashes, looks weird because each backslash needs to be escaped
$path = $path.Replace("\\\\", "\\")
# add on the actual manifest file name
$path = $path + "\steamapps\appmanifest_" + $appIdString + ".acf"
# return the path
return $path
}
}
}
}
}
# function that changes the read only attribute of the manifest file
function toggleUpdate($Manifest) {
# Get the read only attribute
$ReadOnly = (Get-Item $Manifest).IsReadOnly
# If the file is read only, remove the read only attribute, If the file is not read only, set the read only attribute
If ($ReadOnly) { Set-ItemProperty $Manifest -Name IsReadOnly -Value $false } Else { Set-ItemProperty $Manifest -Name IsReadOnly -Value $true }
# Display the read only attribute for reference
Write-Host "Manifest file's read only attribute is now $((Get-Item $Manifest).IsReadOnly)"
# Pause the script to see the output
Read-Host -Prompt "Press Enter to exit"
}
toggleUpdate(parseVDFforPath($args[0]))