From 5c66da1038f024ca82c1d5ce499b7329d98c0038 Mon Sep 17 00:00:00 2001 From: Roy <59626501+RDMacLachlan@users.noreply.github.com> Date: Thu, 15 Feb 2024 13:52:34 -0800 Subject: [PATCH 01/13] Create #658 - WinGet Download.md (#2953) --- .github/actions/spelling/expect.txt | 1 + doc/specs/#658 - WinGet Download.md | 159 ++++++++++++++++++++++++++++ 2 files changed, 160 insertions(+) create mode 100644 doc/specs/#658 - WinGet Download.md diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt index b127b2d957..60877b3909 100644 --- a/.github/actions/spelling/expect.txt +++ b/.github/actions/spelling/expect.txt @@ -478,6 +478,7 @@ VALUENAMECASE vclib VERSI VERSIE +visualstudiocode vns vsconfig vstest diff --git a/doc/specs/#658 - WinGet Download.md b/doc/specs/#658 - WinGet Download.md new file mode 100644 index 0000000000..b3bcb1071f --- /dev/null +++ b/doc/specs/#658 - WinGet Download.md @@ -0,0 +1,159 @@ +--- +author: Roy MacLachlan @RDMaclachlan, Ryan Fu @ryfu-msft +created on: 2023-02-09 +last updated: 2024-02-15 +issue id: 658 +--- + +# `Download` command + +"For [#658](https://github.com/microsoft/winget-cli/issues/658)" + +## Abstract + +This spec describes the functionality and high-level implementation design for downloading package installers using the Windows Package Manager. + +## Inspiration + +This is inspired by customer feedback, and a need for broader application deployments: +* Customers want to share the installer with an offline device. + +## Solution Design + +The `download` command will provide users with the ability to download any installer from a single package. The following command options are available: + +``` + -d,--download-directory Directory where the installers are downloaded to + -m,--manifest The path to the manifest of the package + --id Filter results by id + --name Filter results by name + --moniker Filter results by moniker + -v,--version Use the specified version; default is the latest version + -s,--source Find package using the specified source + --scope Select install scope (user or machine) + -a,--architecture Select the architecture + --installer-type Select the installer type + -e,--exact Find package using exact match + --locale Locale to use (BCP47 format) + --ignore-security-hash Ignore the installer hash check failure + --skip-dependencies Skips processing package dependencies and Windows features + --header Optional Windows-Package-Manager REST source HTTP header + --authentication-mode Specify authentication window preference (silent, silentPreferred or interactive) + --authentication-account Specify the account to be used for authentication + --accept-package-agreements Accept all license agreements for packages + --accept-source-agreements Accept all source agreements during source operations + -?,--help Shows help about the selected command + --wait Prompts the user to press any key before exiting + --logs,--open-logs Open the default logs location + --verbose,--verbose-logs Enables verbose logging for winget + --disable-interactivity Disable interactive prompts + ``` + +### Selecting the installer +A new command argument for `--installer-type` has been added to support selecting a specific installer type to download. A package installer should also be able to be selected by `--scope`, `--architecture`, and `--locale`. + +### Downloading the installer +Downloading the package's installer will still require that the package's installer hash be verified before becoming available to the user to interact with. By default, installers will be downloaded to a unique folder name located in the `%USERPROFILE%/Downloads` directory. The default download directory can be modified in the user's settings. The unique folder name is comprised of the package identifier and package version. The installer will be comprised of the package identifier, package version, scope, architecture, and locale. This naming pattern ensures that the installer is unique and identifiable based on the installer filters applied: + +> Example installer download path name: `%USER_PROFILE%\Downloads\Microsoft.PowerToys_0.78.0\PowerToys (Preview)_0.78.0_User_X64_burn_en-US.exe` + +When downloading the package's installer, if a file with the same name exists the new download will overwrite the existing file. + +### Downloading the manifest +Along with downloading the installer, a merged manifest will be generated and outputted in the same installer download directory. The naming of the file will be exactly the same as the installer except for the extension which will be `.yaml`. The manifest is useful for providing information about the installer such as scope, product code, installer switches, etc. + +## UI/UX Design + +### WinGet Command Line +Downloading an installer will output information relative to each step performed. Informing the user of any license agreements that must be accepted prior to download. Acceptance of license agreements will trigger the download to begin, displaying a progress bar that shows the download status. Upon download, the user will then be informed of the file hash validation status before being notified of the download status. + +The following is representative of the user experience. + +```PowerShell +PS C:\> WinGet download --id Microsoft.VisualStudioCode +Found Microsoft Visual Studio Code [Microsoft.VisualStudioCode] Version 1.73.1 +This application is licensed to you by its owner. +Microsoft is not responsible for, nor does it grant any licenses to, third-party packages. +Starting package download... + \ +Successfully verified installer hash +Installer downloaded:%USERPROFILE%\Downloads\Microsoft.VisualStudioCode_1.86.1\Microsoft Visual Studio Code_1.86.1_User_X64_inno_en-US.exe +``` + +When the user runs `download` command with the `--help` argument, the following information will be provided: + +``` +PS C:\> WinGet Download --help +Windows Package Manager v1.1.1 +Copyright (c) Microsoft Corporation. All rights reserved. + +Downloads the installer from the selected package, either found by searching a configured source or directly from a manifest. By default, the query must case-insensitively match the id, name, or moniker of the package. Other fields can be used by passing their appropriate option. By default, download command will download the appropriate installer to the user's Downloads folder. + +usage: winget download [[-q] ] [] +``` + +### WinGet Setting - Default Download Output + +The following items will be included in the WinGet Settings Schema + +```json +"DownloadBehavior: { + "defaultDownloadDirectory":"%USERPROFILE%/Downloads/" +}" +``` + +The "defaultDownloadDirectory" setting will be used as the default folder where the package installer and manifest is downloaded to. + +### WinGet PowerShell Cmdlet +WinGet PowerShell cmdlet will download the identified package's installer and manifest based on the user specified parameters. While downloading the package's installer, PowerShell will show a progress bar displaying the progress. Afterwards, it will return the downloaded directory where the files were downloaded to.: + +```PS +PS C:\> Get-Help Save-WinGetPackage + +NAME + Save-WinGetPackage + +SYNOPSIS + Downloads a package installer from a WinGet configured source. + +SYNTAX + Save-WinGetPackage [-ID ] [-Name ] [-Moniker ] + [-Scope ] [-Locale ] [-FileName ] + [-Version ] [-Source ] [-Architecture ] [-Exact] + [-Output ] [InstallerType ] [-IgnoreSecurityHash] + [-AcceptPackageAgreement] [-Wait] [-Verbose] + +DESCRIPTION + Downloads a package installer and manifest, either found by searching a configured source or + directly from a manifest. By default, the query must case-insensitively match the id, name, or + moniker of the package. Other fields can be used by passing their appropriate option. + +``` + +## Capabilities + +### Accessibility + +Accessibility should not be impacted by this change. There will be a new column in WinGet search that will appear if an application is downloadable. + +### Security + +Security of the Windows Package Manager should not be impacted by this change. + +### Reliability + +There will be no change to the reliability of the Windows Package Manager. + +### Compatibility + +There will be no breaking changes to the code. A subsection of the WinGet Install functionality will be leveraged for this new functionality. + +### Performance, Power, and Efficiency + +## Potential Issues + +## Future considerations + +* AAD Authentication + +## Resources From 030d998bc0a11d9ecffc49d8f22818a00954e07b Mon Sep 17 00:00:00 2001 From: yao-msft <50888816+yao-msft@users.noreply.github.com> Date: Thu, 15 Feb 2024 20:34:47 -0800 Subject: [PATCH 02/13] Log configuration input hash in configuration summary telemetry (#4173) --- .../ConfigurationProcessor.cpp | 2 ++ .../ConfigurationSet.cpp | 10 ++++++++++ .../ConfigurationSet.h | 4 ++++ .../Telemetry/Telemetry.cpp | 11 +++++++---- .../Telemetry/Telemetry.h | 1 + 5 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.Management.Configuration/ConfigurationProcessor.cpp b/src/Microsoft.Management.Configuration/ConfigurationProcessor.cpp index e558748685..0ddd5f9d20 100644 --- a/src/Microsoft.Management.Configuration/ConfigurationProcessor.cpp +++ b/src/Microsoft.Management.Configuration/ConfigurationProcessor.cpp @@ -22,6 +22,7 @@ #include #include +#include #include using namespace std::chrono_literals; @@ -288,6 +289,7 @@ namespace winrt::Microsoft::Management::Configuration::implementation auto configurationSet = parser->GetConfigurationSet(); PropagateLifetimeWatcher(configurationSet.as()); + configurationSet->SetInputHash(AppInstaller::Utility::SHA256::ConvertToString(AppInstaller::Utility::SHA256::ComputeHash(inputString))); result->Initialize(*configurationSet); } diff --git a/src/Microsoft.Management.Configuration/ConfigurationSet.cpp b/src/Microsoft.Management.Configuration/ConfigurationSet.cpp index d3b64ae93f..8f7aa3f233 100644 --- a/src/Microsoft.Management.Configuration/ConfigurationSet.cpp +++ b/src/Microsoft.Management.Configuration/ConfigurationSet.cpp @@ -183,4 +183,14 @@ namespace winrt::Microsoft::Management::Configuration::implementation { return AppInstaller::WinRT::LifetimeWatcherBase::SetLifetimeWatcher(watcher); } + + void ConfigurationSet::SetInputHash(std::string inputHash) + { + m_inputHash = std::move(inputHash); + } + + const std::string& ConfigurationSet::GetInputHash() const + { + return m_inputHash; + } } diff --git a/src/Microsoft.Management.Configuration/ConfigurationSet.h b/src/Microsoft.Management.Configuration/ConfigurationSet.h index 97fcaad8d9..0c4900d6d0 100644 --- a/src/Microsoft.Management.Configuration/ConfigurationSet.h +++ b/src/Microsoft.Management.Configuration/ConfigurationSet.h @@ -68,6 +68,9 @@ namespace winrt::Microsoft::Management::Configuration::implementation HRESULT STDMETHODCALLTYPE SetLifetimeWatcher(IUnknown* watcher); #if !defined(INCLUDE_ONLY_INTERFACE_METHODS) + void SetInputHash(std::string inputHash); + const std::string& GetInputHash() const; + private: hstring m_name; hstring m_origin; @@ -81,6 +84,7 @@ namespace winrt::Microsoft::Management::Configuration::implementation Windows::Foundation::Collections::IVector m_parameters{ winrt::multi_threaded_vector() }; Windows::Foundation::Collections::ValueSet m_variables; Windows::Foundation::Uri m_schemaUri = nullptr; + std::string m_inputHash; #endif }; } diff --git a/src/Microsoft.Management.Configuration/Telemetry/Telemetry.cpp b/src/Microsoft.Management.Configuration/Telemetry/Telemetry.cpp index 54f8b3bf85..95866bab27 100644 --- a/src/Microsoft.Management.Configuration/Telemetry/Telemetry.cpp +++ b/src/Microsoft.Management.Configuration/Telemetry/Telemetry.cpp @@ -295,6 +295,7 @@ namespace winrt::Microsoft::Management::Configuration::implementation void TelemetryTraceLogger::LogConfigProcessingSummary( const guid& setIdentifier, + std::string_view inputHash, bool fromHistory, ConfigurationUnitIntent runIntent, hresult result, @@ -308,6 +309,7 @@ namespace winrt::Microsoft::Management::Configuration::implementation AICLI_TraceLoggingWriteActivity( "ConfigProcessingSummary", TraceLoggingGuid(setIdentifier, "SetID"), + AICLI_TraceLoggingStringView(inputHash, "InputHash"), TraceLoggingBool(fromHistory, "FromHistory"), TraceLoggingInt32(static_cast(runIntent), "RunIntent"), TraceLoggingHResult(result, "Result"), @@ -322,6 +324,7 @@ namespace winrt::Microsoft::Management::Configuration::implementation WinGet_WriteEventToDiagnostics( "ConfigProcessingSummary", WinGet_EventItem(setIdentifier, "SetID"), + WinGet_EventItem(inputHash, "InputHash"), WinGet_EventItem(fromHistory, "FromHistory"), WinGet_EventItem(static_cast(runIntent), "RunIntent"), WinGet_EventItem(result, "Result"), @@ -344,7 +347,7 @@ namespace winrt::Microsoft::Management::Configuration::implementation ConfigRunSummaryData summaryData = ProcessRunResult(result.UnitResults()); - LogConfigProcessingSummary(configurationSet.InstanceIdentifier(), configurationSet.IsFromHistory(), ConfigurationUnitIntent::Assert, + LogConfigProcessingSummary(configurationSet.InstanceIdentifier(), configurationSet.GetInputHash(), configurationSet.IsFromHistory(), ConfigurationUnitIntent::Assert, summaryData.Result, summaryData.FailurePoint, summaryData.AssertSummary, summaryData.InformSummary, summaryData.ApplySummary); } CATCH_LOG(); @@ -361,7 +364,7 @@ namespace winrt::Microsoft::Management::Configuration::implementation ConfigRunSummaryData summaryData = ProcessRunResult(result.UnitResults()); - LogConfigProcessingSummary(configurationSet.InstanceIdentifier(), configurationSet.IsFromHistory(), ConfigurationUnitIntent::Assert, + LogConfigProcessingSummary(configurationSet.InstanceIdentifier(), configurationSet.GetInputHash(), configurationSet.IsFromHistory(), ConfigurationUnitIntent::Assert, error, ConfigurationUnitResultSource::Internal, summaryData.AssertSummary, summaryData.InformSummary, summaryData.ApplySummary); } CATCH_LOG(); @@ -377,7 +380,7 @@ namespace winrt::Microsoft::Management::Configuration::implementation ConfigRunSummaryData summaryData = ProcessRunResult(result.UnitResults()); - LogConfigProcessingSummary(configurationSet.InstanceIdentifier(), configurationSet.IsFromHistory(), ConfigurationUnitIntent::Apply, + LogConfigProcessingSummary(configurationSet.InstanceIdentifier(), configurationSet.GetInputHash(), configurationSet.IsFromHistory(), ConfigurationUnitIntent::Apply, result.ResultCode(), summaryData.FailurePoint, summaryData.AssertSummary, summaryData.InformSummary, summaryData.ApplySummary); } CATCH_LOG(); @@ -394,7 +397,7 @@ namespace winrt::Microsoft::Management::Configuration::implementation ConfigRunSummaryData summaryData = ProcessRunResult(result.UnitResults()); - LogConfigProcessingSummary(configurationSet.InstanceIdentifier(), configurationSet.IsFromHistory(), ConfigurationUnitIntent::Apply, + LogConfigProcessingSummary(configurationSet.InstanceIdentifier(), configurationSet.GetInputHash(), configurationSet.IsFromHistory(), ConfigurationUnitIntent::Apply, error, ConfigurationUnitResultSource::Internal, summaryData.AssertSummary, summaryData.InformSummary, summaryData.ApplySummary); } CATCH_LOG(); diff --git a/src/Microsoft.Management.Configuration/Telemetry/Telemetry.h b/src/Microsoft.Management.Configuration/Telemetry/Telemetry.h index 3079f16546..894e2fe4e6 100644 --- a/src/Microsoft.Management.Configuration/Telemetry/Telemetry.h +++ b/src/Microsoft.Management.Configuration/Telemetry/Telemetry.h @@ -85,6 +85,7 @@ namespace winrt::Microsoft::Management::Configuration::implementation // Logs a processing summary event for a configuration set. void LogConfigProcessingSummary( const guid& setIdentifier, + std::string_view inputHash, bool fromHistory, ConfigurationUnitIntent runIntent, hresult result, From 7b28fb42cb7a15d5f9145155ea73c410c7146599 Mon Sep 17 00:00:00 2001 From: Ryan <69221034+ryfu-msft@users.noreply.github.com> Date: Sat, 17 Feb 2024 17:37:18 -0800 Subject: [PATCH 03/13] Implement Export-WinGetPackage powershell cmdlet for `winget download` (#3977) --- .github/actions/spelling/excludes.txt | 1 + .../Cmdlets/Common/InstallCmdlet.cs | 10 +- .../Cmdlets/Common/PackageCmdlet.cs | 6 - .../Cmdlets/ExportPackageCmdlet.cs | 64 +++++++ .../Cmdlets/InstallPackageCmdlet.cs | 81 ++++----- .../Cmdlets/InstallerSelectionCmdlet.cs | 55 ++++++ .../PSObjects/PSPackageFieldMatchOption.cs | 0 .../PSObjects/PSPackageInstallMode.cs | 0 .../PSObjects/PSPackageInstallScope.cs | 0 .../PSObjects/PSPackageInstallerType.cs | 69 ++++++++ .../PSObjects/PSPackageUninstallMode.cs | 0 .../PSObjects/PSProcessorArchitecture.cs | 0 .../Cmdlets/UninstallPackageCmdlet.cs | 10 +- .../Cmdlets/UpdatePackageCmdlet.cs | 5 +- .../Commands/Common/InstallCommand.cs | 16 +- .../Commands/Common/PackageCommand.cs | 7 +- .../Commands/DownloadCommand.cs | 165 ++++++++++++++++++ .../Commands/InstallerPackageCommand.cs | 51 ++++-- .../Commands/UninstallPackageCommand.cs | 13 +- .../Commands/UserSettingsCommand.cs | 1 - .../Helpers/DownloadOperationWithProgress.cs | 42 +++++ .../Helpers/ManagementDeploymentFactory.cs | 2 +- .../Helpers/PSEnumHelpers.cs | 34 ++++ .../Helpers/PackageManagerWrapper.cs | 13 ++ .../PSObjects/PSDownloadResult.cs | 115 ++++++++++++ .../Properties/Resources.Designer.cs | 9 + .../Properties/Resources.resx | 4 + .../ModuleFiles/Format.ps1xml | 52 ++++++ .../ModuleFiles/Microsoft.WinGet.Client.psd1 | 1 + .../tests/Microsoft.WinGet.Client.Tests.ps1 | 74 ++++++++ 30 files changed, 815 insertions(+), 85 deletions(-) create mode 100644 src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/ExportPackageCmdlet.cs create mode 100644 src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/InstallerSelectionCmdlet.cs rename src/PowerShell/Microsoft.WinGet.Client.Cmdlets/{ => Cmdlets}/PSObjects/PSPackageFieldMatchOption.cs (100%) rename src/PowerShell/Microsoft.WinGet.Client.Cmdlets/{ => Cmdlets}/PSObjects/PSPackageInstallMode.cs (100%) rename src/PowerShell/Microsoft.WinGet.Client.Cmdlets/{ => Cmdlets}/PSObjects/PSPackageInstallScope.cs (100%) create mode 100644 src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/PSObjects/PSPackageInstallerType.cs rename src/PowerShell/Microsoft.WinGet.Client.Cmdlets/{ => Cmdlets}/PSObjects/PSPackageUninstallMode.cs (100%) rename src/PowerShell/Microsoft.WinGet.Client.Cmdlets/{ => Cmdlets}/PSObjects/PSProcessorArchitecture.cs (100%) create mode 100644 src/PowerShell/Microsoft.WinGet.Client.Engine/Commands/DownloadCommand.cs create mode 100644 src/PowerShell/Microsoft.WinGet.Client.Engine/Helpers/DownloadOperationWithProgress.cs create mode 100644 src/PowerShell/Microsoft.WinGet.Client.Engine/PSObjects/PSDownloadResult.cs diff --git a/.github/actions/spelling/excludes.txt b/.github/actions/spelling/excludes.txt index 85f68f1435..fbabf579ad 100644 --- a/.github/actions/spelling/excludes.txt +++ b/.github/actions/spelling/excludes.txt @@ -89,6 +89,7 @@ ^src/Xlang/ ^src/YamlCppLib/ # Because it doesn't handle argument -Words well +^src/PowerShell/tests/ ^tools/CorrelationTestbed/.*\.ps1$ ^tools/COMTrace/ComTrace.wprp$ ignore$ diff --git a/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/Common/InstallCmdlet.cs b/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/Common/InstallCmdlet.cs index 6a59eb902b..8d430c6aa3 100644 --- a/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/Common/InstallCmdlet.cs +++ b/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/Common/InstallCmdlet.cs @@ -14,7 +14,7 @@ namespace Microsoft.WinGet.Client.Commands.Common /// This is the base class for all commands that parse a FindPackagesOptions result /// from the provided parameters i.e., the "install" and "upgrade" commands. /// - public abstract class InstallCmdlet : PackageCmdlet + public abstract class InstallCmdlet : InstallerSelectionCmdlet { private string location; @@ -49,13 +49,13 @@ public string Location ? value : this.SessionState.Path.CurrentFileSystemLocation + @"\" + value; } - } - + } + /// - /// Gets or sets a value indicating whether to skip the installer hash validation check. + /// Gets or sets the path to the logging file. /// [Parameter(ValueFromPipelineByPropertyName = true)] - public SwitchParameter AllowHashMismatch { get; set; } + public string Log { get; set; } /// /// Gets or sets a value indicating whether to continue upon non security related failures. diff --git a/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/Common/PackageCmdlet.cs b/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/Common/PackageCmdlet.cs index 0862e0d467..afef05f574 100644 --- a/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/Common/PackageCmdlet.cs +++ b/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/Common/PackageCmdlet.cs @@ -42,11 +42,5 @@ public PackageCmdlet() /// [Parameter(ValueFromPipelineByPropertyName = true)] public string Version { get; set; } - - /// - /// Gets or sets the path to the logging file. - /// - [Parameter(ValueFromPipelineByPropertyName = true)] - public string Log { get; set; } } } diff --git a/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/ExportPackageCmdlet.cs b/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/ExportPackageCmdlet.cs new file mode 100644 index 0000000000..ac6c6929eb --- /dev/null +++ b/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/ExportPackageCmdlet.cs @@ -0,0 +1,64 @@ +// ----------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. Licensed under the MIT License. +// +// ----------------------------------------------------------------------------- + +namespace Microsoft.WinGet.Client.Commands +{ + using System.Management.Automation; + using Microsoft.WinGet.Client.Common; + using Microsoft.WinGet.Client.Engine.Commands; + using Microsoft.WinGet.Client.Engine.PSObjects; + + /// + /// Downloads a package installer from the pipeline or from a configured source. + /// + [Cmdlet( + VerbsData.Export, + Constants.WinGetNouns.Package, + DefaultParameterSetName = Constants.FoundSet, + SupportsShouldProcess = true)] + [OutputType(typeof(PSDownloadResult))] + public sealed class ExportPackageCmdlet : InstallerSelectionCmdlet + { + private DownloadCommand command = null; + + /// + /// Gets or sets the directory where the installer will be downloaded to. + /// + [Parameter(ValueFromPipelineByPropertyName = true)] + public string DownloadDirectory { get; set; } + + /// + /// Installs a package from the pipeline or from a configured source. + /// + protected override void ProcessRecord() + { + this.command = new DownloadCommand( + this, + this.PSCatalogPackage, + this.Version, + this.Id, + this.Name, + this.Moniker, + this.Source, + this.Query, + this.AllowHashMismatch.ToBool(), + this.SkipDependencies.ToBool(), + this.Locale); + this.command.Download(this.DownloadDirectory, this.MatchOption.ToString(), this.Scope.ToString(), this.Architecture.ToString(), this.InstallerType.ToString()); + } + + /// + /// Interrupts currently running code within the command. + /// + protected override void StopProcessing() + { + if (this.command != null) + { + this.command.Cancel(); + } + } + } +} diff --git a/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/InstallPackageCmdlet.cs b/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/InstallPackageCmdlet.cs index 3e6da96965..b5d07718ed 100644 --- a/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/InstallPackageCmdlet.cs +++ b/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/InstallPackageCmdlet.cs @@ -1,47 +1,34 @@ -// ----------------------------------------------------------------------------- -// -// Copyright (c) Microsoft Corporation. Licensed under the MIT License. -// -// ----------------------------------------------------------------------------- - -namespace Microsoft.WinGet.Client.Commands -{ +// ----------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. Licensed under the MIT License. +// +// ----------------------------------------------------------------------------- + +namespace Microsoft.WinGet.Client.Commands +{ using System.Management.Automation; - using Microsoft.WinGet.Client.Commands.Common; - using Microsoft.WinGet.Client.Common; - using Microsoft.WinGet.Client.Engine.Commands; + using Microsoft.WinGet.Client.Commands.Common; + using Microsoft.WinGet.Client.Common; + using Microsoft.WinGet.Client.Engine.Commands; using Microsoft.WinGet.Client.Engine.PSObjects; - using Microsoft.WinGet.Client.PSObjects; - /// - /// Installs a package from the pipeline or from a configured source. - /// - [Cmdlet( - VerbsLifecycle.Install, - Constants.WinGetNouns.Package, - DefaultParameterSetName = Constants.FoundSet, - SupportsShouldProcess = true)] - [OutputType(typeof(PSInstallResult))] - public sealed class InstallPackageCmdlet : InstallCmdlet - { - private InstallerPackageCommand command = null; - - /// - /// Gets or sets the scope to install the application under. - /// - [Parameter(ValueFromPipelineByPropertyName = true)] - public PSPackageInstallScope Scope { get; set; } = PSPackageInstallScope.Any; - - /// - /// Gets or sets the architecture of the application to be installed. - /// - [Parameter(ValueFromPipelineByPropertyName = true)] - public PSProcessorArchitecture Architecture { get; set; } = PSProcessorArchitecture.Default; - - /// - /// Installs a package from the pipeline or from a configured source. - /// - protected override void ProcessRecord() + /// + /// Installs a package from the pipeline or from a configured source. + /// + [Cmdlet( + VerbsLifecycle.Install, + Constants.WinGetNouns.Package, + DefaultParameterSetName = Constants.FoundSet, + SupportsShouldProcess = true)] + [OutputType(typeof(PSInstallResult))] + public sealed class InstallPackageCmdlet : InstallCmdlet + { + private InstallerPackageCommand command = null; + + /// + /// Installs a package from the pipeline or from a configured source. + /// + protected override void ProcessRecord() { this.command = new InstallerPackageCommand( this, @@ -58,8 +45,10 @@ protected override void ProcessRecord() this.Name, this.Moniker, this.Source, - this.Query); - this.command.Install(this.Scope.ToString(), this.Architecture.ToString(), this.MatchOption.ToString(), this.Mode.ToString()); + this.Query, + this.SkipDependencies.ToBool()); + + this.command.Install(this.MatchOption.ToString(), this.Scope.ToString(), this.Architecture.ToString(), this.Mode.ToString(), this.InstallerType.ToString()); } /// @@ -71,6 +60,6 @@ protected override void StopProcessing() { this.command.Cancel(); } - } - } -} + } + } +} diff --git a/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/InstallerSelectionCmdlet.cs b/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/InstallerSelectionCmdlet.cs new file mode 100644 index 0000000000..7f4735fcac --- /dev/null +++ b/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/InstallerSelectionCmdlet.cs @@ -0,0 +1,55 @@ +// ----------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. Licensed under the MIT License. +// +// ----------------------------------------------------------------------------- + +namespace Microsoft.WinGet.Client.Commands +{ + using System.Management.Automation; + using Microsoft.WinGet.Client.Commands.Common; + using Microsoft.WinGet.Client.PSObjects; + + /// + /// This is the base class for all commands that select an installer from a given package. + /// Contains shared arguments for the install, update, and download commands. + /// + public abstract class InstallerSelectionCmdlet : PackageCmdlet + { + /// + /// Gets or sets a value indicating whether to skip the installer hash validation check. + /// + [Parameter(ValueFromPipelineByPropertyName = true)] + public SwitchParameter AllowHashMismatch { get; set; } + + /// + /// Gets or sets the architecture of the installer to be downloaded. + /// + [Parameter(ValueFromPipelineByPropertyName = true)] + public PSProcessorArchitecture Architecture { get; set; } = PSProcessorArchitecture.Default; + + /// + /// Gets or sets the installer type to be downloaded. + /// + [Parameter(ValueFromPipelineByPropertyName = true)] + public PSPackageInstallerType InstallerType { get; set; } = PSPackageInstallerType.Default; + + /// + /// Gets or sets the locale of the installer to be downloaded. + /// + [Parameter(ValueFromPipelineByPropertyName = true)] + public string Locale { get; set; } + + /// + /// Gets or sets the scope of the installer to be downloaded. + /// + [Parameter(ValueFromPipelineByPropertyName = true)] + public PSPackageInstallScope Scope { get; set; } = PSPackageInstallScope.Any; + + /// + /// Gets or sets a value indicating whether skip dependencies. + /// + [Parameter(ValueFromPipelineByPropertyName = true)] + public SwitchParameter SkipDependencies { get; set; } + } +} diff --git a/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/PSObjects/PSPackageFieldMatchOption.cs b/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/PSObjects/PSPackageFieldMatchOption.cs similarity index 100% rename from src/PowerShell/Microsoft.WinGet.Client.Cmdlets/PSObjects/PSPackageFieldMatchOption.cs rename to src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/PSObjects/PSPackageFieldMatchOption.cs diff --git a/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/PSObjects/PSPackageInstallMode.cs b/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/PSObjects/PSPackageInstallMode.cs similarity index 100% rename from src/PowerShell/Microsoft.WinGet.Client.Cmdlets/PSObjects/PSPackageInstallMode.cs rename to src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/PSObjects/PSPackageInstallMode.cs diff --git a/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/PSObjects/PSPackageInstallScope.cs b/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/PSObjects/PSPackageInstallScope.cs similarity index 100% rename from src/PowerShell/Microsoft.WinGet.Client.Cmdlets/PSObjects/PSPackageInstallScope.cs rename to src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/PSObjects/PSPackageInstallScope.cs diff --git a/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/PSObjects/PSPackageInstallerType.cs b/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/PSObjects/PSPackageInstallerType.cs new file mode 100644 index 0000000000..5c7ccfbc4b --- /dev/null +++ b/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/PSObjects/PSPackageInstallerType.cs @@ -0,0 +1,69 @@ +// ----------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. Licensed under the MIT License. +// +// ----------------------------------------------------------------------------- + +namespace Microsoft.WinGet.Client.PSObjects +{ + /// + /// The installer type of the package. + /// + public enum PSPackageInstallerType + { + /// + /// Let winget decide. + /// + Default, + + /// + /// Inno, + /// + Inno, + + /// + /// Wix. + /// + Wix, + + /// + /// Msi. + /// + Msi, + + /// + /// Nullsoft. + /// + Nullsoft, + + /// + /// Zip. + /// + Zip, + + /// + /// Msix. + /// + Msix, + + /// + /// Exe. + /// + Exe, + + /// + /// Burn. + /// + Burn, + + /// + /// MSStore, + /// + MSStore, + + /// + /// Portable. + /// + Portable, + } +} \ No newline at end of file diff --git a/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/PSObjects/PSPackageUninstallMode.cs b/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/PSObjects/PSPackageUninstallMode.cs similarity index 100% rename from src/PowerShell/Microsoft.WinGet.Client.Cmdlets/PSObjects/PSPackageUninstallMode.cs rename to src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/PSObjects/PSPackageUninstallMode.cs diff --git a/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/PSObjects/PSProcessorArchitecture.cs b/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/PSObjects/PSProcessorArchitecture.cs similarity index 100% rename from src/PowerShell/Microsoft.WinGet.Client.Cmdlets/PSObjects/PSProcessorArchitecture.cs rename to src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/PSObjects/PSProcessorArchitecture.cs diff --git a/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/UninstallPackageCmdlet.cs b/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/UninstallPackageCmdlet.cs index 46730308c2..f2b93beecf 100644 --- a/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/UninstallPackageCmdlet.cs +++ b/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/UninstallPackageCmdlet.cs @@ -36,7 +36,13 @@ public sealed class UninstallPackageCmdlet : PackageCmdlet /// Gets or sets a value indicating whether to continue upon non security related failures. /// [Parameter(ValueFromPipelineByPropertyName = true)] - public SwitchParameter Force { get; set; } + public SwitchParameter Force { get; set; } + + /// + /// Gets or sets the path to the logging file. + /// + [Parameter(ValueFromPipelineByPropertyName = true)] + public string Log { get; set; } /// /// Uninstalls a package from the local system. @@ -53,7 +59,7 @@ protected override void ProcessRecord() this.Moniker, this.Source, this.Query); - this.command.Uninstall(this.Mode.ToString(), this.MatchOption.ToString(), this.Force.ToBool()); + this.command.Uninstall(this.MatchOption.ToString(), this.Mode.ToString(), this.Force.ToBool()); } /// diff --git a/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/UpdatePackageCmdlet.cs b/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/UpdatePackageCmdlet.cs index 32b55865da..2dcc785975 100644 --- a/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/UpdatePackageCmdlet.cs +++ b/src/PowerShell/Microsoft.WinGet.Client.Cmdlets/Cmdlets/UpdatePackageCmdlet.cs @@ -49,8 +49,9 @@ protected override void ProcessRecord() this.Name, this.Moniker, this.Source, - this.Query); - command.Update(this.IncludeUnknown.ToBool(), this.MatchOption.ToString(), this.Mode.ToString()); + this.Query, + this.SkipDependencies); + command.Update(this.IncludeUnknown.ToBool(), this.MatchOption.ToString(), this.Scope.ToString(), this.Architecture.ToString(), this.Mode.ToString(), this.InstallerType.ToString()); } } } diff --git a/src/PowerShell/Microsoft.WinGet.Client.Engine/Commands/Common/InstallCommand.cs b/src/PowerShell/Microsoft.WinGet.Client.Engine/Commands/Common/InstallCommand.cs index fc7ecdbef5..5de949291a 100644 --- a/src/PowerShell/Microsoft.WinGet.Client.Engine/Commands/Common/InstallCommand.cs +++ b/src/PowerShell/Microsoft.WinGet.Client.Engine/Commands/Common/InstallCommand.cs @@ -9,7 +9,6 @@ namespace Microsoft.WinGet.Client.Engine.Commands.Common using System.Management.Automation; using Microsoft.Management.Deployment; using Microsoft.WinGet.Client.Engine.Helpers; - using Windows.Foundation; /// /// This is the base class for all commands that parse a result @@ -26,6 +25,16 @@ internal InstallCommand(PSCmdlet psCmdlet) { } + /// + /// Gets or sets a value indicating whether to skip the installer hash validation check. + /// + protected bool AllowHashMismatch { get; set; } + + /// + /// Gets or sets a value indicating whether to skip dependencies. + /// + protected bool SkipDependencies { get; set; } + /// /// Gets or sets the override arguments to be passed on to the installer. /// @@ -42,9 +51,9 @@ internal InstallCommand(PSCmdlet psCmdlet) protected string? Location { get; set; } /// - /// Gets or sets a value indicating whether to skip the installer hash validation check. + /// Gets or sets the path to the logging file. /// - protected bool AllowHashMismatch { get; set; } + protected string? Log { get; set; } /// /// Gets or sets a value indicating whether to continue upon non security related failures. @@ -69,6 +78,7 @@ protected virtual InstallOptions GetInstallOptions(PackageVersionId? version, st { InstallOptions options = ManagementDeploymentFactory.Instance.CreateInstallOptions(); options.AllowHashMismatch = this.AllowHashMismatch; + options.SkipDependencies = this.SkipDependencies; options.Force = this.Force; options.PackageInstallMode = PSEnumHelpers.ToPackageInstallMode(mode); if (version != null) diff --git a/src/PowerShell/Microsoft.WinGet.Client.Engine/Commands/Common/PackageCommand.cs b/src/PowerShell/Microsoft.WinGet.Client.Engine/Commands/Common/PackageCommand.cs index 8923926ce7..029bb51b50 100644 --- a/src/PowerShell/Microsoft.WinGet.Client.Engine/Commands/Common/PackageCommand.cs +++ b/src/PowerShell/Microsoft.WinGet.Client.Engine/Commands/Common/PackageCommand.cs @@ -18,7 +18,7 @@ namespace Microsoft.WinGet.Client.Engine.Commands.Common /// /// This is the base class for commands which operate on a specific package and version i.e., - /// the "install", "uninstall", and "upgrade" commands. + /// the "install", "uninstall", "download", and "upgrade" commands. /// public abstract class PackageCommand : FinderCommand { @@ -44,11 +44,6 @@ internal PackageCommand(PSCmdlet psCmdlet) /// protected string? Version { get; set; } - /// - /// Gets or sets the path to the logging file. - /// - protected string? Log { get; set; } - /// /// Executes a command targeting a specific package version. /// diff --git a/src/PowerShell/Microsoft.WinGet.Client.Engine/Commands/DownloadCommand.cs b/src/PowerShell/Microsoft.WinGet.Client.Engine/Commands/DownloadCommand.cs new file mode 100644 index 0000000000..e60c8bc1cb --- /dev/null +++ b/src/PowerShell/Microsoft.WinGet.Client.Engine/Commands/DownloadCommand.cs @@ -0,0 +1,165 @@ +// ----------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. Licensed under the MIT License. +// +// ----------------------------------------------------------------------------- + +namespace Microsoft.WinGet.Client.Engine.Commands +{ + using System.Management.Automation; + using System.Threading.Tasks; + using Microsoft.Management.Deployment; + using Microsoft.WinGet.Client.Engine.Commands.Common; + using Microsoft.WinGet.Client.Engine.Helpers; + using Microsoft.WinGet.Client.Engine.PSObjects; + using Microsoft.WinGet.Common.Command; + using Microsoft.WinGet.Resources; + + /// + /// Downloads a package installer. + /// + public sealed class DownloadCommand : PackageCommand + { + /// + /// Initializes a new instance of the class. + /// + /// Caller cmdlet. + /// PSCatalogPackage. + /// Version to install. + /// Package identifier. + /// Name of package. + /// Moniker of package. + /// Source to search. If null, all are searched. + /// Match against any field of a package. + /// To skip the installer hash validation check. + /// To skip package dependencies. + /// Locale of the package. + public DownloadCommand( + PSCmdlet psCmdlet, + PSCatalogPackage psCatalogPackage, + string version, + string id, + string name, + string moniker, + string source, + string[] query, + bool allowHashMismatch, + bool skipDependencies, + string locale) + : base(psCmdlet) + { + // PackageCommand + if (psCatalogPackage != null) + { + this.CatalogPackage = psCatalogPackage; + } + + this.Version = version; + + // FinderCommand + this.Id = id; + this.Name = name; + this.Moniker = moniker; + this.Source = source; + this.Query = query; + + // DownloadCommand + this.AllowHashMismatch = allowHashMismatch; + this.SkipDependencies = skipDependencies; + this.Locale = locale; + } + + /// + /// Gets or sets a value indicating whether to skip the installer hash validation check. + /// + private bool AllowHashMismatch { get; set; } + + /// + /// Gets or sets a value indicating whether to skip dependencies. + /// + private bool SkipDependencies { get; set; } + + /// + /// Gets or sets the locale to install. + /// + private string? Locale { get; set; } + + /// + /// Process download package. + /// + /// The target directory where the installer will be downloaded to. + /// PSPackageFieldMatchOption. + /// PSPackageInstallScope. + /// PSProcessorArchitecture. + /// PSPackageInstallerType. + public void Download( + string downloadDirectory, + string psPackageFieldMatchOption, + string psPackageInstallScope, + string psProcessorArchitecture, + string psPackageInstallerType) + { + var result = this.Execute( + async () => await this.GetPackageAndExecuteAsync( + CompositeSearchBehavior.RemotePackagesFromRemoteCatalogs, + PSEnumHelpers.ToPackageFieldMatchOption(psPackageFieldMatchOption), + async (package, version) => + { + DownloadOptions options = this.GetDownloadOptions(version); + + if (!string.IsNullOrEmpty(downloadDirectory)) + { + options.DownloadDirectory = downloadDirectory; + } + + if (!PSEnumHelpers.IsDefaultEnum(psProcessorArchitecture)) + { + options.Architecture = PSEnumHelpers.ToProcessorArchitecture(psProcessorArchitecture); + } + + if (!PSEnumHelpers.IsDefaultEnum(psPackageInstallerType)) + { + options.InstallerType = PSEnumHelpers.ToPackageInstallerType(psPackageInstallerType); + } + + options.Scope = PSEnumHelpers.ToPackageInstallScope(psPackageInstallScope); + + return await this.DownloadPackageAsync(package, options); + })); + + if (result != null) + { + this.Write(StreamType.Object, new PSDownloadResult(result.Item1, result.Item2)); + } + } + + private DownloadOptions GetDownloadOptions(PackageVersionId? version) + { + var options = ManagementDeploymentFactory.Instance.CreateDownloadOptions(); + if (version != null) + { + options.PackageVersionId = version; + } + + if (this.Locale != null) + { + options.Locale = this.Locale; + } + + options.AllowHashMismatch = this.AllowHashMismatch; + options.SkipDependencies = this.SkipDependencies; + + return options; + } + + private async Task DownloadPackageAsync( + CatalogPackage package, + DownloadOptions options) + { + var activity = string.Format(Resources.ProgressRecordActivityExporting, package.Name); + var progressOperation = new DownloadOperationWithProgress(this, activity); + return await progressOperation.ExecuteAsync( + () => PackageManagerWrapper.Instance.DownloadPackageAsync(package, options)); + } + } +} diff --git a/src/PowerShell/Microsoft.WinGet.Client.Engine/Commands/InstallerPackageCommand.cs b/src/PowerShell/Microsoft.WinGet.Client.Engine/Commands/InstallerPackageCommand.cs index 3ae169841a..4c21779f39 100644 --- a/src/PowerShell/Microsoft.WinGet.Client.Engine/Commands/InstallerPackageCommand.cs +++ b/src/PowerShell/Microsoft.WinGet.Client.Engine/Commands/InstallerPackageCommand.cs @@ -27,7 +27,7 @@ public sealed class InstallerPackageCommand : InstallCommand /// Override arguments to be passed on to the installer. /// Additional arguments. /// Installation location. - /// To skip the installer hash validation check. + /// To skip the installer hash validation check. /// To continue upon non security related failures. /// HTTP Header to pass on to the REST Source. /// PSCatalogPackage. @@ -38,12 +38,13 @@ public sealed class InstallerPackageCommand : InstallCommand /// Moniker of package. /// Source to search. If null, all are searched. /// Match against any field of a package. + /// To skip package dependencies. public InstallerPackageCommand( PSCmdlet psCmdlet, string @override, string custom, string location, - bool allowHashMisMatch, + bool allowHashMismatch, bool force, string header, PSCatalogPackage psCatalogPackage, @@ -53,16 +54,19 @@ public InstallerPackageCommand( string name, string moniker, string source, - string[] query) + string[] query, + bool skipDependencies) : base(psCmdlet) { // InstallCommand. this.Override = @override; this.Custom = custom; this.Location = location; - this.AllowHashMismatch = allowHashMisMatch; this.Force = force; this.Header = header; + this.AllowHashMismatch = allowHashMismatch; + this.SkipDependencies = skipDependencies; + this.Log = log; // PackageCommand. if (psCatalogPackage != null) @@ -71,7 +75,6 @@ public InstallerPackageCommand( } this.Version = version; - this.Log = log; // FinderCommand this.Id = id; @@ -84,15 +87,17 @@ public InstallerPackageCommand( /// /// Process install package command. /// + /// PSPackageFieldMatchOption. /// PSPackageInstallScope. /// PSProcessorArchitecture. - /// PSPackageFieldMatchOption. /// PSPackageInstallMode. + /// PSPackageInstallerType. public void Install( + string psPackageFieldMatchOption, string psPackageInstallScope, string psProcessorArchitecture, - string psPackageFieldMatchOption, - string psPackageInstallMode) + string psPackageInstallMode, + string psPackageInstallerType) { var result = this.Execute( async () => await this.GetPackageAndExecuteAsync( @@ -101,13 +106,19 @@ public void Install( async (package, version) => { InstallOptions options = this.GetInstallOptions(version, psPackageInstallMode); - if (psProcessorArchitecture != "Default") + if (!PSEnumHelpers.IsDefaultEnum(psProcessorArchitecture)) { options.AllowedArchitectures.Clear(); options.AllowedArchitectures.Add(PSEnumHelpers.ToProcessorArchitecture(psProcessorArchitecture)); } + if (!PSEnumHelpers.IsDefaultEnum(psPackageInstallerType)) + { + options.InstallerType = PSEnumHelpers.ToPackageInstallerType(psPackageInstallerType); + } + options.PackageInstallScope = PSEnumHelpers.ToPackageInstallScope(psPackageInstallScope); + return await this.InstallPackageAsync(package, options); })); @@ -122,11 +133,17 @@ public void Install( /// /// If updating to an unknown version is allowed. /// PSPackageFieldMatchOption. + /// PSPackageInstallScope. + /// PSProcessorArchitecture. /// PSPackageInstallMode. + /// PSPackageInstallerType. public void Update( bool includeUnknown, string psPackageFieldMatchOption, - string psPackageInstallMode) + string psPackageInstallScope, + string psProcessorArchitecture, + string psPackageInstallMode, + string psPackageInstallerType) { var result = this.Execute( async () => await this.GetPackageAndExecuteAsync( @@ -136,6 +153,20 @@ public void Update( { InstallOptions options = this.GetInstallOptions(version, psPackageInstallMode); options.AllowUpgradeToUnknownVersion = includeUnknown; + + if (!PSEnumHelpers.IsDefaultEnum(psProcessorArchitecture)) + { + options.AllowedArchitectures.Clear(); + options.AllowedArchitectures.Add(PSEnumHelpers.ToProcessorArchitecture(psProcessorArchitecture)); + } + + if (!PSEnumHelpers.IsDefaultEnum(psPackageInstallerType)) + { + options.InstallerType = PSEnumHelpers.ToPackageInstallerType(psPackageInstallerType); + } + + options.PackageInstallScope = PSEnumHelpers.ToPackageInstallScope(psPackageInstallScope); + return await this.UpgradePackageAsync(package, options); })); diff --git a/src/PowerShell/Microsoft.WinGet.Client.Engine/Commands/UninstallPackageCommand.cs b/src/PowerShell/Microsoft.WinGet.Client.Engine/Commands/UninstallPackageCommand.cs index 621af3b91a..c8455e6891 100644 --- a/src/PowerShell/Microsoft.WinGet.Client.Engine/Commands/UninstallPackageCommand.cs +++ b/src/PowerShell/Microsoft.WinGet.Client.Engine/Commands/UninstallPackageCommand.cs @@ -51,7 +51,6 @@ public UninstallPackageCommand( } this.Version = version; - this.Log = log; // FinderCommand this.Id = id; @@ -59,17 +58,25 @@ public UninstallPackageCommand( this.Moniker = moniker; this.Source = source; this.Query = query; + + // UninstallPackageCommand + this.Log = log; } + /// + /// Gets or sets the path to the logging file. + /// + private string? Log { get; set; } + /// /// Process uninstall package. /// - /// PSPackageUninstallMode. /// PSPackageFieldMatchOption. + /// PSPackageUninstallMode. /// Force. public void Uninstall( - string psPackageUninstallMode, string psPackageFieldMatchOption, + string psPackageUninstallMode, bool force) { var result = this.Execute( diff --git a/src/PowerShell/Microsoft.WinGet.Client.Engine/Commands/UserSettingsCommand.cs b/src/PowerShell/Microsoft.WinGet.Client.Engine/Commands/UserSettingsCommand.cs index 8c8f1a78c1..0c82256120 100644 --- a/src/PowerShell/Microsoft.WinGet.Client.Engine/Commands/UserSettingsCommand.cs +++ b/src/PowerShell/Microsoft.WinGet.Client.Engine/Commands/UserSettingsCommand.cs @@ -8,7 +8,6 @@ namespace Microsoft.WinGet.Client.Engine.Commands { using System; using System.Collections; - using System.Collections.Generic; using System.IO; using System.Linq; using System.Management.Automation; diff --git a/src/PowerShell/Microsoft.WinGet.Client.Engine/Helpers/DownloadOperationWithProgress.cs b/src/PowerShell/Microsoft.WinGet.Client.Engine/Helpers/DownloadOperationWithProgress.cs new file mode 100644 index 0000000000..90d82dad8e --- /dev/null +++ b/src/PowerShell/Microsoft.WinGet.Client.Engine/Helpers/DownloadOperationWithProgress.cs @@ -0,0 +1,42 @@ +// ----------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. Licensed under the MIT License. +// +// ----------------------------------------------------------------------------- + +namespace Microsoft.WinGet.Client.Engine.Helpers +{ + using System.Management.Automation; + using Microsoft.Management.Deployment; + using Microsoft.WinGet.Common.Command; + using Microsoft.WinGet.Resources; + using Windows.Foundation; + + /// + /// Handler progress for package download. + /// + internal class DownloadOperationWithProgress : OperationWithProgressBase + { + /// + /// Initializes a new instance of the class. + /// + /// A instance. + /// Activity. + public DownloadOperationWithProgress(PowerShellCmdlet pwshCmdlet, string activity) + : base(pwshCmdlet, activity) + { + } + + /// + public override void Progress(IAsyncOperationWithProgress operation, PackageDownloadProgress progress) + { + ProgressRecord record = new (this.ActivityId, this.Activity, progress.State.ToString()) + { + RecordType = ProgressRecordType.Processing, + }; + record.StatusDescription = Resources.DownloadingMessage; + record.PercentComplete = (int)(progress.DownloadProgress * 100); + this.PwshCmdlet.Write(StreamType.Progress, record); + } + } +} diff --git a/src/PowerShell/Microsoft.WinGet.Client.Engine/Helpers/ManagementDeploymentFactory.cs b/src/PowerShell/Microsoft.WinGet.Client.Engine/Helpers/ManagementDeploymentFactory.cs index 48bd7fccc2..9843fecd8f 100644 --- a/src/PowerShell/Microsoft.WinGet.Client.Engine/Helpers/ManagementDeploymentFactory.cs +++ b/src/PowerShell/Microsoft.WinGet.Client.Engine/Helpers/ManagementDeploymentFactory.cs @@ -60,7 +60,7 @@ internal sealed class ManagementDeploymentFactory private static readonly Guid InstallOptionsIid = Guid.Parse("6EE9DB69-AB48-5E72-A474-33A924CD23B3"); private static readonly Guid UninstallOptionsIid = Guid.Parse("3EBC67F0-8339-594B-8A42-F90B69D02BBE"); private static readonly Guid PackageMatchFilterIid = Guid.Parse("D981ECA3-4DE5-5AD7-967A-698C7D60FC3B"); - private static readonly Guid DownloadOptionsIid = Guid.Parse("B4D72A63-40FF-597D-A7DA-43580268DC96"); + private static readonly Guid DownloadOptionsIid = Guid.Parse("94C92C4B-43F5-5CA3-BBBE-9F432C9546BC"); private static readonly IEnumerable ValidArchs = new Architecture[] { Architecture.X86, Architecture.X64 }; diff --git a/src/PowerShell/Microsoft.WinGet.Client.Engine/Helpers/PSEnumHelpers.cs b/src/PowerShell/Microsoft.WinGet.Client.Engine/Helpers/PSEnumHelpers.cs index f6330a1e7f..8a00417fd4 100644 --- a/src/PowerShell/Microsoft.WinGet.Client.Engine/Helpers/PSEnumHelpers.cs +++ b/src/PowerShell/Microsoft.WinGet.Client.Engine/Helpers/PSEnumHelpers.cs @@ -15,6 +15,16 @@ namespace Microsoft.WinGet.Client.Engine.Helpers /// internal static class PSEnumHelpers { + /// + /// Checks if the provided enum string value matches the 'Default' value for PS Enums. + /// + /// Enum string value. + /// Boolean value. + public static bool IsDefaultEnum(string value) + { + return string.Equals(value, "Default", StringComparison.OrdinalIgnoreCase); + } + /// /// Converts PSPackageInstallMode string value to PackageInstallMode. /// @@ -98,5 +108,29 @@ public static PackageFieldMatchOption ToPackageFieldMatchOption(string value) _ => throw new InvalidOperationException(), }; } + + /// + /// Converts PSPackageInstallerType string value to PackageInstallerType. + /// + /// PSPackageInstallerType string value. + /// PackageInstallerType. + public static PackageInstallerType ToPackageInstallerType(string value) + { + return value switch + { + "Unknown" => PackageInstallerType.Unknown, + "Inno" => PackageInstallerType.Inno, + "Wix" => PackageInstallerType.Wix, + "Msi" => PackageInstallerType.Msi, + "Nullsoft" => PackageInstallerType.Nullsoft, + "Zip" => PackageInstallerType.Zip, + "Msix" => PackageInstallerType.Msix, + "Exe" => PackageInstallerType.Exe, + "Burn" => PackageInstallerType.Burn, + "MSStore" => PackageInstallerType.MSStore, + "Portable" => PackageInstallerType.Portable, + _ => throw new InvalidOperationException(), + }; + } } } diff --git a/src/PowerShell/Microsoft.WinGet.Client.Engine/Helpers/PackageManagerWrapper.cs b/src/PowerShell/Microsoft.WinGet.Client.Engine/Helpers/PackageManagerWrapper.cs index 4fcbe66b7f..451369fb57 100644 --- a/src/PowerShell/Microsoft.WinGet.Client.Engine/Helpers/PackageManagerWrapper.cs +++ b/src/PowerShell/Microsoft.WinGet.Client.Engine/Helpers/PackageManagerWrapper.cs @@ -75,6 +75,19 @@ public IAsyncOperationWithProgress Uninstall false); } + /// + /// Wrapper for DownloadPackageAsync. + /// + /// The package to download. + /// The download options. + /// An async operation with progress. + public IAsyncOperationWithProgress DownloadPackageAsync(CatalogPackage package, DownloadOptions options) + { + return this.Execute( + () => this.packageManager.DownloadPackageAsync(package, options), + false); + } + /// /// Wrapper for GetPackageCatalogs. /// diff --git a/src/PowerShell/Microsoft.WinGet.Client.Engine/PSObjects/PSDownloadResult.cs b/src/PowerShell/Microsoft.WinGet.Client.Engine/PSObjects/PSDownloadResult.cs new file mode 100644 index 0000000000..7e72e87de0 --- /dev/null +++ b/src/PowerShell/Microsoft.WinGet.Client.Engine/PSObjects/PSDownloadResult.cs @@ -0,0 +1,115 @@ +// ----------------------------------------------------------------------------- +// +// Copyright (c) Microsoft Corporation. Licensed under the MIT License. +// +// ----------------------------------------------------------------------------- + +namespace Microsoft.WinGet.Client.Engine.PSObjects +{ + using System; + using Microsoft.Management.Deployment; + + /// + /// PSDownloadResult. + /// + public sealed class PSDownloadResult + { + private readonly DownloadResult downloadResult; + private readonly CatalogPackage catalogPackage; + + /// + /// Initializes a new instance of the class. + /// + /// The download result COM object. + /// The catalog package COM object. + internal PSDownloadResult(DownloadResult downloadResult, CatalogPackage catalogPackage) + { + this.downloadResult = downloadResult; + this.catalogPackage = catalogPackage; + } + + /// + /// Gets the id of the downloaded package. + /// + public string Id + { + get + { + return this.catalogPackage.Id; + } + } + + /// + /// Gets the name of the downloaded package. + /// + public string Name + { + get + { + return this.catalogPackage.Name; + } + } + + /// + /// Gets the source name of the downloaded package. + /// + public string Source + { + get + { + return this.catalogPackage.DefaultInstallVersion.PackageCatalog.Info.Name; + } + } + + /// + /// Gets the correlation data of the downloaded result. + /// + public string CorrelationData + { + get + { + return this.downloadResult.CorrelationData; + } + } + + /// + /// Gets the extended error code exception of the failed download result. + /// + public Exception ExtendedErrorCode + { + get + { + return this.downloadResult.ExtendedErrorCode; + } + } + + /// + /// Gets the status of the download. + /// + public string Status + { + get + { + return this.downloadResult.Status.ToString(); + } + } + + /// + /// If the download succeeded. + /// + /// True if installation succeeded. + public bool Succeeded() + { + return this.downloadResult.Status == DownloadResultStatus.Ok; + } + + /// + /// Message with error information. + /// + /// Error message. + public string ErrorMessage() + { + return $"DownloadStatus '{this.Status}' ExtendedError '{this.ExtendedErrorCode.HResult}'"; + } + } +} diff --git a/src/PowerShell/Microsoft.WinGet.Client.Engine/Properties/Resources.Designer.cs b/src/PowerShell/Microsoft.WinGet.Client.Engine/Properties/Resources.Designer.cs index fe4b214231..68e607cfde 100644 --- a/src/PowerShell/Microsoft.WinGet.Client.Engine/Properties/Resources.Designer.cs +++ b/src/PowerShell/Microsoft.WinGet.Client.Engine/Properties/Resources.Designer.cs @@ -231,6 +231,15 @@ internal static string NoPackageFoundExceptionMessage { } } + /// + /// Looks up a localized string similar to Exporting '{0}'. + /// + internal static string ProgressRecordActivityExporting { + get { + return ResourceManager.GetString("ProgressRecordActivityExporting", resourceCulture); + } + } + /// /// Looks up a localized string similar to Installing '{0}'. /// diff --git a/src/PowerShell/Microsoft.WinGet.Client.Engine/Properties/Resources.resx b/src/PowerShell/Microsoft.WinGet.Client.Engine/Properties/Resources.resx index c78a19e6b1..44f29eee34 100644 --- a/src/PowerShell/Microsoft.WinGet.Client.Engine/Properties/Resources.resx +++ b/src/PowerShell/Microsoft.WinGet.Client.Engine/Properties/Resources.resx @@ -240,4 +240,8 @@ Cannot find asset {0} {Locked="{0}"} {0} - The asset name + + Exporting '{0}' + {Locked="{0}"} {0} - The name of the package being exported. + \ No newline at end of file diff --git a/src/PowerShell/Microsoft.WinGet.Client/ModuleFiles/Format.ps1xml b/src/PowerShell/Microsoft.WinGet.Client/ModuleFiles/Format.ps1xml index c1369c1ef7..0578d18083 100644 --- a/src/PowerShell/Microsoft.WinGet.Client/ModuleFiles/Format.ps1xml +++ b/src/PowerShell/Microsoft.WinGet.Client/ModuleFiles/Format.ps1xml @@ -215,6 +215,58 @@ + + Microsoft.WinGet.Client.Engine.PSObjects.PSDownloadResult + + Microsoft.WinGet.Client.Engine.PSObjects.PSDownloadResult + + + + + + + + + + + + + + + + + + + + + + + + + + + $_.Id + + + $_.Name + + + $_.Source + + + $_.Status + + + $_.ExtendedErrorCode + + + $_.CorrelationData + + + + + + Microsoft.WinGet.Client.Engine.PSObjects.PSSourceResult diff --git a/src/PowerShell/Microsoft.WinGet.Client/ModuleFiles/Microsoft.WinGet.Client.psd1 b/src/PowerShell/Microsoft.WinGet.Client/ModuleFiles/Microsoft.WinGet.Client.psd1 index 23cee53225..ffa344d55d 100644 --- a/src/PowerShell/Microsoft.WinGet.Client/ModuleFiles/Microsoft.WinGet.Client.psd1 +++ b/src/PowerShell/Microsoft.WinGet.Client/ModuleFiles/Microsoft.WinGet.Client.psd1 @@ -95,6 +95,7 @@ CmdletsToExport = @( 'Add-WinGetSource' 'Remove-WinGetSource' 'Reset-WinGetSource' + 'Export-WinGetPackage' ) # Variables to export from this module diff --git a/src/PowerShell/tests/Microsoft.WinGet.Client.Tests.ps1 b/src/PowerShell/tests/Microsoft.WinGet.Client.Tests.ps1 index 11cfe89ab3..3a90dea8ea 100644 --- a/src/PowerShell/tests/Microsoft.WinGet.Client.Tests.ps1 +++ b/src/PowerShell/tests/Microsoft.WinGet.Client.Tests.ps1 @@ -118,6 +118,11 @@ BeforeAll { } } } + + function GetRandomTestDirectory() + { + return Join-Path -Path $env:Temp -ChildPath "WingetPwshTest-$(New-Guid)" + } } Describe 'Get-WinGetVersion' { @@ -350,6 +355,75 @@ Describe 'Get-WinGetPackage' { } } +Describe 'Export-WinGetPackage' { + + BeforeAll { + AddTestSource + } + + It 'Download by Id' { + $testDirectory = GetRandomTestDirectory + $result = Export-WinGetPackage -Id AppInstallerTest.TestExeInstaller -Version '1.0.0.0' -DownloadDirectory $testDirectory + + $result | Should -Not -BeNullOrEmpty + $result.Id | Should -Be "AppInstallerTest.TestExeInstaller" + $result.Name | Should -Be "TestExeInstaller" + $result.Source | Should -Be "TestSource" + $result.Status | Should -Be 'Ok' + + # Download directory should be created and have exactly two files (installer and manifest file). + Test-Path -Path $testDirectory | Should -Be $true + (Get-ChildItem -Path $testDirectory -Force | Measure-Object).Count | Should -Be 2 + } + + It 'Download by Locale' { + $testDirectory = GetRandomTestDirectory + $result = Export-WinGetPackage -Id AppInstallerTest.TestMultipleInstallers -Locale 'zh-CN' -DownloadDirectory $testDirectory + + $result | Should -Not -BeNullOrEmpty + $result.Id | Should -Be "AppInstallerTest.TestMultipleInstallers" + $result.Name | Should -Be "TestMultipleInstallers" + $result.Source | Should -Be "TestSource" + $result.Status | Should -Be 'Ok' + + Test-Path -Path $testDirectory | Should -Be $true + (Get-ChildItem -Path $testDirectory -Force | Measure-Object).Count | Should -Be 2 + } + + It 'Download by InstallerType' { + $testDirectory = GetRandomTestDirectory + $result = Export-WinGetPackage -Id AppInstallerTest.TestMultipleInstallers -InstallerType 'msi' -DownloadDirectory $testDirectory + + $result | Should -Not -BeNullOrEmpty + $result.Id | Should -Be "AppInstallerTest.TestMultipleInstallers" + $result.Name | Should -Be "TestMultipleInstallers" + $result.Source | Should -Be "TestSource" + $result.Status | Should -Be 'Ok' + + Test-Path -Path $testDirectory | Should -Be $true + (Get-ChildItem -Path $testDirectory -Force | Measure-Object).Count | Should -Be 2 + } + + It 'Download by InstallerType that does not exist' { + $testDirectory = GetRandomTestDirectory + $result = Export-WinGetPackage -Id AppInstallerTest.TestExeInstaller -Version '1.0.0.0' -InstallerType 'zip' -DownloadDirectory $testDirectory + + $result | Should -Not -BeNullOrEmpty + $result.Id | Should -Be "AppInstallerTest.TestExeInstaller" + $result.Name | Should -Be "TestExeInstaller" + $result.Source | Should -Be "TestSource" + $result.Status | Should -Be 'NoApplicableInstallers' + $result.ExtendedErrorCode | Should -Not -BeNullOrEmpty + Test-Path -Path $testDirectory | Should -Be $false + } + + AfterEach { + if (Test-Path $testDirectory) { + Remove-Item $testDirectory -Force -Recurse + } + } +} + Describe 'Get-WinGetUserSettings' { It 'Get settings' { From 96974fbc383811617bfcc957d9d4b32126edb26f Mon Sep 17 00:00:00 2001 From: Madhusudhan-MSFT <53235553+Madhusudhan-MSFT@users.noreply.github.com> Date: Sat, 17 Feb 2024 22:25:24 -0800 Subject: [PATCH 04/13] winget repair cli implementation (#4168) Winget Repair CLI implementation. The changes include: - The initial support for the winget repair feature for the following installer types: - Burn, Exe, Inno - these require a repair behavior and a repair switch to perform the repair operation. - If the repair behavior is Modify, the repair switch will apply the ModifyPath command from the ARP registry flag. - If the repair behavior is Installer, the repair switch will apply to the matching downloaded installer from the search results. - If the repair behavior is Uninstaller, the repair switch will apply the UninstallString command from the ARP registry flag. - MSI/WIX - for these, msiexec /f will be used to perform the default repair supported by the platform. - MSStore - this will call the StartProductInstallAsync API with the repair flag set. - MSIX - this will call the RegisterPackage API. - Portable installation is not supported yet. **[How validated:]** **[Manual Tests:]** - Compile the code changes. - Deploy AppInstallerCLIPackage. **[Local Manifest Tests:]** - Execute the following local manifest scenarios: - wingetdev repair --manifest E:\Winget\WinGetRepair\Manifests\GDK_RB_Uninstall. - The manifest uses v 1.7.0 and points to the latest GDK installer where Repair Behavior = "Uninstaller" and Repair = "/repair". - wingetdev repair --manifest E:\Winget\WinGetRepair\Manifests\GDK_RB_Installer. - The manifest uses v 1.7.0 and points to the latest GDK installer where Repair Behavior = "Installer" and Repair = "/repair". - This is a little tricky because the latest GDK installer is not available on the winget-pkgs repo. It is necessary to replace the version downloaded zip file with the latest version as a zip file to test this scenario. - wingetdev repair --manifest E:\Winget\WinGetRepair\Manifests\GDK_RB_Modify. - The manifest uses v 1.7.0 and points to the latest GDK installer where Repair Behavior = "Modify" and Repair = "/repair". **[MSStore App Repair Test]** - wingetdev repair --id 9NBDXK71NK08. - This is to validate the MSStore repair scenario. **[MSI]** - wingetdev repair --manifest E:\Investigations\Winget\WinGetRepair\Manifests\TestMSI - This is to validate MSI package [TODOs:] - Add unit tests and E2E tests - [x] I have signed the [Contributor License Agreement](https://cla.opensource.microsoft.com/microsoft/winget-pkgs). - [x] This pull request is related to an issue. ----- ###### Microsoft Reviewers: [Open in CodeFlow](https://microsoft.github.io/open-pr/?codeflow=https://github.com/microsoft/winget-cli/pull/4168) --------- Co-authored-by: Yao Sun --- .github/actions/spelling/expect.txt | 1 + doc/Settings.md | 2 +- .../package-manager/winget/returnCodes.md | 5 + .../AppInstallerCLICore.vcxproj | 4 + .../AppInstallerCLICore.vcxproj.filters | 12 + .../Commands/RepairCommand.cpp | 121 +++++ .../Commands/RepairCommand.h | 25 + .../Commands/RootCommand.cpp | 2 + src/AppInstallerCLICore/ExecutionContext.h | 1 + .../ExecutionContextData.h | 14 + src/AppInstallerCLICore/Resources.h | 13 + .../Workflows/InstallFlow.cpp | 40 +- .../Workflows/MSStoreInstallerHandler.cpp | 41 ++ .../Workflows/MSStoreInstallerHandler.h | 6 + .../Workflows/RepairFlow.cpp | 506 ++++++++++++++++++ .../Workflows/RepairFlow.h | 78 +++ .../ShellExecuteInstallerHandler.cpp | 131 ++++- .../Workflows/ShellExecuteInstallerHandler.h | 12 + .../Workflows/WorkflowBase.cpp | 18 +- .../Workflows/WorkflowBase.h | 1 + .../Shared/Strings/en-us/winget.resw | 57 ++ .../AppInstallerTelemetry.cpp | 29 + src/AppInstallerCommonCore/Deployment.cpp | 18 +- src/AppInstallerCommonCore/MSStore.cpp | 8 +- .../Manifest/ManifestCommon.cpp | 9 + .../Public/AppInstallerDeployment.h | 5 + .../Public/AppInstallerTelemetry.h | 7 + .../Public/winget/MSStore.h | 1 + .../Public/winget/ManifestCommon.h | 3 + .../Microsoft/ARPHelper.cpp | 5 + .../Microsoft/ARPHelper.h | 6 + .../Public/winget/RepositorySearch.h | 6 + .../AppInstallerStrings.cpp | 20 + src/AppInstallerSharedLib/Errors.cpp | 5 + .../Public/AppInstallerErrors.h | 5 + .../Public/AppInstallerStrings.h | 3 + 36 files changed, 1205 insertions(+), 15 deletions(-) create mode 100644 src/AppInstallerCLICore/Commands/RepairCommand.cpp create mode 100644 src/AppInstallerCLICore/Commands/RepairCommand.h create mode 100644 src/AppInstallerCLICore/Workflows/RepairFlow.cpp create mode 100644 src/AppInstallerCLICore/Workflows/RepairFlow.h diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt index 60877b3909..83f53d39c0 100644 --- a/.github/actions/spelling/expect.txt +++ b/.github/actions/spelling/expect.txt @@ -310,6 +310,7 @@ nuffing objbase objidl ofile +omus onefuzz ools oop diff --git a/doc/Settings.md b/doc/Settings.md index b59007b253..fcd14080b0 100644 --- a/doc/Settings.md +++ b/doc/Settings.md @@ -311,4 +311,4 @@ You can enable the feature as shown below. "experimentalFeatures": { "configuration03": true }, -``` \ No newline at end of file +``` diff --git a/doc/windows/package-manager/winget/returnCodes.md b/doc/windows/package-manager/winget/returnCodes.md index 5ae4ab644b..dff6cd48eb 100644 --- a/doc/windows/package-manager/winget/returnCodes.md +++ b/doc/windows/package-manager/winget/returnCodes.md @@ -132,6 +132,11 @@ ms.localizationpriority: medium | 0x8A150076 | -1978335114 | APPINSTALLER_CLI_ERROR_AUTHENTICATION_INTERACTIVE_REQUIRED | Authentication failed. Interactive authentication required. | | 0x8A150077 | -1978335113 | APPINSTALLER_CLI_ERROR_AUTHENTICATION_CANCELLED_BY_USER | Authentication failed. User cancelled. | | 0x8A150078 | -1978335112 | APPINSTALLER_CLI_ERROR_AUTHENTICATION_INCORRECT_ACCOUNT | Authentication failed. Authenticated account is not the desired account. | +| 0x8A150079 | -1978335111 | APPINSTALLER_CLI_ERROR_NO_REPAIR_INFO_FOUND | Repair command not found. | +| 0x8A15007A | -1978335110 | APPINSTALLER_CLI_ERROR_REPAIR_NOT_APPLICABLE | Repair operation is not applicable. | +| 0x8A15007B | -1978335109 | APPINSTALLER_CLI_ERROR_EXEC_REPAIR_FAILED | Repair operation failed. | +| 0x8A15007C | -1978335108 | APPINSTALLER_CLI_ERROR_REPAIR_NOT_SUPPORTED | The installer technology in use doesn't support repair. | +| 0x8A15007D | -1978335107 | APPINSTALLER_CLI_ERROR_ADMIN_CONTEXT_REPAIR_PROHIBITED | Repair operations involving administrator privileges are not permitted on packages installed within the user scope. | ## Install errors. diff --git a/src/AppInstallerCLICore/AppInstallerCLICore.vcxproj b/src/AppInstallerCLICore/AppInstallerCLICore.vcxproj index 6aa9c0ee2f..1051018b14 100644 --- a/src/AppInstallerCLICore/AppInstallerCLICore.vcxproj +++ b/src/AppInstallerCLICore/AppInstallerCLICore.vcxproj @@ -368,6 +368,7 @@ + @@ -413,6 +414,7 @@ + @@ -437,6 +439,7 @@ + @@ -487,6 +490,7 @@ + diff --git a/src/AppInstallerCLICore/AppInstallerCLICore.vcxproj.filters b/src/AppInstallerCLICore/AppInstallerCLICore.vcxproj.filters index 96c267dbc1..a54df43884 100644 --- a/src/AppInstallerCLICore/AppInstallerCLICore.vcxproj.filters +++ b/src/AppInstallerCLICore/AppInstallerCLICore.vcxproj.filters @@ -242,6 +242,12 @@ Header Files + + Commands + + + Workflows + @@ -450,6 +456,12 @@ Commands + + + Commands + + + Workflows diff --git a/src/AppInstallerCLICore/Commands/RepairCommand.cpp b/src/AppInstallerCLICore/Commands/RepairCommand.cpp new file mode 100644 index 0000000000..58668a783b --- /dev/null +++ b/src/AppInstallerCLICore/Commands/RepairCommand.cpp @@ -0,0 +1,121 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. +#include "pch.h" +#include "RepairCommand.h" +#include "Workflows/RepairFlow.h" +#include "Workflows/CompletionFlow.h" +#include "Workflows/InstallFlow.h" + +namespace AppInstaller::CLI +{ + using namespace AppInstaller::CLI::Execution; + using namespace AppInstaller::CLI::Workflow; + + std::vector RepairCommand::GetArguments() const + { + return { + Argument::ForType(Args::Type::Query), // -q + Argument::ForType(Args::Type::Manifest), // -m + Argument::ForType(Args::Type::Id), // -id + Argument::ForType(Args::Type::Name), // -n + Argument::ForType(Args::Type::Channel), + Argument::ForType(Args::Type::Moniker), // -mn + Argument::ForType(Args::Type::Version), // -v + Argument::ForType(Args::Type::ProductCode), + Argument::ForType(Args::Type::InstallArchitecture), // -arch + Argument{ Execution::Args::Type::InstallScope, Resource::String::InstalledScopeArgumentDescription, ArgumentType::Standard, Argument::Visibility::Help }, + Argument::ForType(Args::Type::Source), // -s + Argument::ForType(Args::Type::Interactive), // -i + Argument::ForType(Args::Type::Silent), // -h + Argument::ForType(Args::Type::Log), // -o + Argument::ForType(Args::Type::IgnoreLocalArchiveMalwareScan), // -ignore-local-archive-malware-scan + Argument::ForType(Args::Type::AcceptSourceAgreements), // -accept-source-agreements + Argument::ForType(Args::Type::AcceptPackageAgreements), + Argument::ForType(Args::Type::Locale), + Argument::ForType(Args::Type::CustomHeader), + Argument::ForType(Args::Type::AuthenticationMode), + Argument::ForType(Args::Type::AuthenticationAccount), + Argument::ForType(Args::Type::Force), + Argument::ForType(Args::Type::HashOverride), + Argument::ForType(Args::Type::Exact), + }; + } + + Resource::LocString RepairCommand::ShortDescription() const + { + return { Resource::String::RepairCommandShortDescription }; + } + + Resource::LocString RepairCommand::LongDescription() const + { + return { Resource::String::RepairCommandLongDescription }; + } + + void RepairCommand::Complete(Execution::Context& context, Execution::Args::Type valueType) const + { + if (valueType == Execution::Args::Type::Manifest || + valueType == Execution::Args::Type::Log) + { + // Intentionally output nothing to allow pass through to filesystem. + return; + } + + switch (valueType) + { + case Execution::Args::Type::Id: + case Execution::Args::Type::Name: + case Execution::Args::Type::Moniker: + case Execution::Args::Type::Version: + case Execution::Args::Type::Channel: + case Execution::Args::Type::Source: + context << + Workflow::CompleteWithSingleSemanticsForValueUsingExistingSource(valueType); + break; + } + } + + Utility::LocIndView RepairCommand::HelpLink() const + { + // TODO: point to the right place + return "https://aka.ms/winget-command-repair"_liv; + } + + void RepairCommand::ValidateArgumentsInternal(Execution::Args& execArgs) const + { + Argument::ValidateCommonArguments(execArgs); + } + + void RepairCommand::ExecuteInternal(Execution::Context& context) const + { + context.SetFlags(Execution::ContextFlag::InstallerExecutionUseRepair); + + context << + Workflow::ReportExecutionStage(ExecutionStage::Discovery) << + Workflow::OpenSource() << + Workflow::OpenCompositeSource(DetermineInstalledSource(context)); + + if (context.Args.Contains(Args::Type::Manifest)) + { + context << + Workflow::GetManifestFromArg << + Workflow::ReportManifestIdentity << + Workflow::SearchSourceUsingManifest << + Workflow::EnsureOneMatchFromSearchResult(OperationType::Repair) << + Workflow::GetInstalledPackageVersion << + Workflow::SelectInstaller << + Workflow::EnsureApplicableInstaller << + Workflow::RepairSinglePackage; + } + else + { + context << + Workflow::SearchSourceForSingle << + Workflow::HandleSearchResultFailures << + Workflow::EnsureOneMatchFromSearchResult(OperationType::Repair) << + Workflow::ReportPackageIdentity << + Workflow::GetInstalledPackageVersion << + Workflow::SelectApplicablePackageVersion << + Workflow::RepairSinglePackage; + } + } +} diff --git a/src/AppInstallerCLICore/Commands/RepairCommand.h b/src/AppInstallerCLICore/Commands/RepairCommand.h new file mode 100644 index 0000000000..09f876c5e7 --- /dev/null +++ b/src/AppInstallerCLICore/Commands/RepairCommand.h @@ -0,0 +1,25 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. +#pragma once +#include "Command.h" + +namespace AppInstaller::CLI +{ + struct RepairCommand final : public Command + { + RepairCommand(std::string_view parent) : Command("repair", parent) {} + + std::vector GetArguments() const override; + + Resource::LocString ShortDescription() const override; + Resource::LocString LongDescription() const override; + + void Complete(Execution::Context& context, Execution::Args::Type valueType) const override; + + Utility::LocIndView HelpLink() const override; + + protected: + void ValidateArgumentsInternal(Execution::Args& execArgs) const override; + void ExecuteInternal(Execution::Context& context) const override; + }; +} diff --git a/src/AppInstallerCLICore/Commands/RootCommand.cpp b/src/AppInstallerCLICore/Commands/RootCommand.cpp index 3cbe1950fc..fc0c6b7cb3 100644 --- a/src/AppInstallerCLICore/Commands/RootCommand.cpp +++ b/src/AppInstallerCLICore/Commands/RootCommand.cpp @@ -26,6 +26,7 @@ #include "DownloadCommand.h" #include "ErrorCommand.h" #include "ResumeCommand.h" +#include "RepairCommand.h" #include "Resources.h" #include "TableOutput.h" @@ -184,6 +185,7 @@ namespace AppInstaller::CLI std::make_unique(FullName()), std::make_unique(FullName()), std::make_unique(FullName()), + std::make_unique(FullName()), #if _DEBUG std::make_unique(FullName()), #endif diff --git a/src/AppInstallerCLICore/ExecutionContext.h b/src/AppInstallerCLICore/ExecutionContext.h index fbda69ec97..b686e48242 100644 --- a/src/AppInstallerCLICore/ExecutionContext.h +++ b/src/AppInstallerCLICore/ExecutionContext.h @@ -74,6 +74,7 @@ namespace AppInstaller::CLI::Execution Resume = 0x200, RebootRequired = 0x400, RegisterResume = 0x800, + InstallerExecutionUseRepair = 0x1000, }; DEFINE_ENUM_FLAG_OPERATORS(ContextFlag); diff --git a/src/AppInstallerCLICore/ExecutionContextData.h b/src/AppInstallerCLICore/ExecutionContextData.h index 96c2d250ee..146d0006cb 100644 --- a/src/AppInstallerCLICore/ExecutionContextData.h +++ b/src/AppInstallerCLICore/ExecutionContextData.h @@ -63,6 +63,8 @@ namespace AppInstaller::CLI::Execution Pins, ConfigurationContext, DownloadDirectory, + ModifyPath, + RepairString, Max }; @@ -267,5 +269,17 @@ namespace AppInstaller::CLI::Execution { using value_t = std::filesystem::path; }; + + template<> + struct DataMapping + { + using value_t = std::string; + }; + + template<> + struct DataMapping + { + using value_t = std::string; + }; } } diff --git a/src/AppInstallerCLICore/Resources.h b/src/AppInstallerCLICore/Resources.h index cfd3bb5d7b..65bb45e870 100644 --- a/src/AppInstallerCLICore/Resources.h +++ b/src/AppInstallerCLICore/Resources.h @@ -324,6 +324,7 @@ namespace AppInstaller::CLI::Resource WINGET_DEFINE_RESOURCE_STRINGID(MSStoreAppBlocked); WINGET_DEFINE_RESOURCE_STRINGID(MSStoreInstallOrUpdateFailed); WINGET_DEFINE_RESOURCE_STRINGID(MSStoreInstallTryGetEntitlement); + WINGET_DEFINE_RESOURCE_STRINGID(MSStoreRepairFailed); WINGET_DEFINE_RESOURCE_STRINGID(MSStoreStoreClientBlocked); WINGET_DEFINE_RESOURCE_STRINGID(MultipleExclusiveArgumentsProvided); WINGET_DEFINE_RESOURCE_STRINGID(MultipleInstalledPackagesFound); @@ -339,12 +340,14 @@ namespace AppInstaller::CLI::Resource WINGET_DEFINE_RESOURCE_STRINGID(NestedInstallerNotSpecified); WINGET_DEFINE_RESOURCE_STRINGID(NestedInstallerNotSupported); WINGET_DEFINE_RESOURCE_STRINGID(NoApplicableInstallers); + WINGET_DEFINE_RESOURCE_STRINGID(NoAdminRepairForUserScopePackage); WINGET_DEFINE_RESOURCE_STRINGID(NoExperimentalFeaturesMessage); WINGET_DEFINE_RESOURCE_STRINGID(NoInstalledPackageFound); WINGET_DEFINE_RESOURCE_STRINGID(NoPackageFound); WINGET_DEFINE_RESOURCE_STRINGID(NoPackageSelectionArgumentProvided); WINGET_DEFINE_RESOURCE_STRINGID(NoPackagesFoundInImportFile); WINGET_DEFINE_RESOURCE_STRINGID(Notes); + WINGET_DEFINE_RESOURCE_STRINGID(NoRepairInfoFound); WINGET_DEFINE_RESOURCE_STRINGID(NoUninstallInfoFound); WINGET_DEFINE_RESOURCE_STRINGID(NoUpgradeArgumentDescription); WINGET_DEFINE_RESOURCE_STRINGID(NoVTArgumentDescription); @@ -419,6 +422,16 @@ namespace AppInstaller::CLI::Resource WINGET_DEFINE_RESOURCE_STRINGID(RebootRequiredToEnableWindowsFeatureOverrideRequired); WINGET_DEFINE_RESOURCE_STRINGID(RelatedLink); WINGET_DEFINE_RESOURCE_STRINGID(RenameArgumentDescription); + WINGET_DEFINE_RESOURCE_STRINGID(RepairAbandoned); + WINGET_DEFINE_RESOURCE_STRINGID(RepairCommandLongDescription); + WINGET_DEFINE_RESOURCE_STRINGID(RepairCommandShortDescription); + WINGET_DEFINE_RESOURCE_STRINGID(RepairDifferentInstallTechnology); + WINGET_DEFINE_RESOURCE_STRINGID(RepairFailedWithCode); + WINGET_DEFINE_RESOURCE_STRINGID(RepairFlowNoMatchingVersion); + WINGET_DEFINE_RESOURCE_STRINGID(RepairFlowRepairSuccess); + WINGET_DEFINE_RESOURCE_STRINGID(RepairFlowReturnCodeSystemNotSupported); + WINGET_DEFINE_RESOURCE_STRINGID(RepairFlowStartingPackageRepair); + WINGET_DEFINE_RESOURCE_STRINGID(RepairOperationNotSupported); WINGET_DEFINE_RESOURCE_STRINGID(ReparsePointsNotSupportedError); WINGET_DEFINE_RESOURCE_STRINGID(ReportIdentityForAgreements); WINGET_DEFINE_RESOURCE_STRINGID(ReportIdentityFound); diff --git a/src/AppInstallerCLICore/Workflows/InstallFlow.cpp b/src/AppInstallerCLICore/Workflows/InstallFlow.cpp index 6ce9512c5e..88eb099583 100644 --- a/src/AppInstallerCLICore/Workflows/InstallFlow.cpp +++ b/src/AppInstallerCLICore/Workflows/InstallFlow.cpp @@ -464,6 +464,8 @@ namespace AppInstaller::CLI::Workflow void ReportInstallerResult::operator()(Execution::Context& context) const { + bool isRepair = WI_IsFlagSet(context.GetFlags(), Execution::ContextFlag::InstallerExecutionUseRepair); + DWORD installResult = context.Get(); const auto& additionalSuccessCodes = context.Get()->InstallerSuccessCodes; if (installResult != 0 && (std::find(additionalSuccessCodes.begin(), additionalSuccessCodes.end(), installResult) == additionalSuccessCodes.end())) @@ -506,7 +508,15 @@ namespace AppInstaller::CLI::Workflow if (FAILED(terminationHR)) { const auto& manifest = context.Get(); - Logging::Telemetry().LogInstallerFailure(manifest.Id, manifest.Version, manifest.Channel, m_installerType, installResult); + + if (isRepair) + { + Logging::Telemetry().LogRepairFailure(manifest.Id, manifest.Version, m_installerType, installResult); + } + else + { + Logging::Telemetry().LogInstallerFailure(manifest.Id, manifest.Version, manifest.Channel, m_installerType, installResult); + } if (m_isHResult) { @@ -533,7 +543,14 @@ namespace AppInstaller::CLI::Workflow } else { - context.Reporter.Info() << Resource::String::InstallFlowInstallSuccess << std::endl; + if (isRepair) + { + context.Reporter.Info() << Resource::String::RepairFlowRepairSuccess << std::endl; + } + else + { + context.Reporter.Info() << Resource::String::InstallFlowInstallSuccess << std::endl; + } } } @@ -611,6 +628,21 @@ namespace AppInstaller::CLI::Workflow const auto& installer = context.Get(); + // This check is only necessary for the Repair workflow when operating on an installer with RepairBehavior set to Installer. + if (WI_IsFlagSet(context.GetFlags(), Execution::ContextFlag::InstallerExecutionUseRepair)) + { + if (installer->RepairBehavior != RepairBehaviorEnum::Installer) + { + return; + } + + // At present, the installer repair behavior scenario is restricted to Exe, Inno, Nullsoft, and Burn installer types. + if (!DoesInstallerTypeRequireRepairBehaviorForRepair(installer->EffectiveInstallerType())) + { + return; + } + } + // This installer cannot be run elevated, but we are running elevated. // Implementation of de-elevation is complex; simply block for now. if (installer->ElevationRequirement == ElevationRequirementEnum::ElevationProhibited && Runtime::IsRunningAsAdmin()) @@ -776,7 +808,7 @@ namespace AppInstaller::CLI::Workflow } CATCH_LOG() - void ReportARPChanges(Execution::Context& context) try + void ReportARPChanges(Execution::Context& context) try { if (!context.Contains(Execution::Data::ARPCorrelationData)) { @@ -826,7 +858,7 @@ namespace AppInstaller::CLI::Workflow for (auto&& upgradeCode : upgradeCodes) { AppsAndFeaturesEntry entry = baseEntry; - entry.UpgradeCode= std::move(upgradeCode).get(); + entry.UpgradeCode = std::move(upgradeCode).get(); entries.push_back(std::move(entry)); } diff --git a/src/AppInstallerCLICore/Workflows/MSStoreInstallerHandler.cpp b/src/AppInstallerCLICore/Workflows/MSStoreInstallerHandler.cpp index ee4ce0f3cb..f0554ca4b0 100644 --- a/src/AppInstallerCLICore/Workflows/MSStoreInstallerHandler.cpp +++ b/src/AppInstallerCLICore/Workflows/MSStoreInstallerHandler.cpp @@ -146,6 +146,47 @@ namespace AppInstaller::CLI::Workflow } } + void MSStoreRepair(Execution::Context& context) + { + auto productId = Utility::ConvertToUTF16(context.Get()->ProductId); + auto scope = Manifest::ConvertToScopeEnum(context.Args.GetArg(Execution::Args::Type::InstallScope)); + bool isSilentMode = context.Args.Contains(Execution::Args::Type::Silent); + bool force = context.Args.Contains(Execution::Args::Type::Force); + + auto repairOperation = MSStoreOperation(MSStoreOperationType::Repair, productId, scope, isSilentMode, force); + + context.Reporter.Info() << Resource::String::RepairFlowStartingPackageRepair << std::endl; + + HRESULT hr = S_OK; + context.Reporter.ExecuteWithProgress( + [&](IProgressCallback& progress) + { + hr = repairOperation.StartAndWaitForOperation(progress); + }); + + if (SUCCEEDED(hr)) + { + context.Reporter.Info() << Resource::String::RepairFlowRepairSuccess << std::endl; + } + else + { + if (hr == APPINSTALLER_CLI_ERROR_INSTALL_SYSTEM_NOT_SUPPORTED) + { + context.Reporter.Error() << Resource::String::InstallFlowReturnCodeSystemNotSupported << std::endl; + context.Add(static_cast(APPINSTALLER_CLI_ERROR_INSTALL_SYSTEM_NOT_SUPPORTED)); + } + else + { + auto errorCodeString = GetErrorCodeString(hr); + context.Reporter.Error() << Resource::String::MSStoreRepairFailed(errorCodeString) << std::endl; + context.Add(hr); + AICLI_LOG(CLI, Error, << "MSStore repair failed. ProductId: " << Utility::ConvertToUTF8(productId) << " HResult: " << errorCodeString); + } + + AICLI_TERMINATE_CONTEXT(hr); + } + } + void EnsureStorePolicySatisfied(Execution::Context& context) { auto productId = Utility::ConvertToUTF16(context.Get()->ProductId); diff --git a/src/AppInstallerCLICore/Workflows/MSStoreInstallerHandler.h b/src/AppInstallerCLICore/Workflows/MSStoreInstallerHandler.h index bb7c4e4067..08001945c6 100644 --- a/src/AppInstallerCLICore/Workflows/MSStoreInstallerHandler.h +++ b/src/AppInstallerCLICore/Workflows/MSStoreInstallerHandler.h @@ -20,6 +20,12 @@ namespace AppInstaller::CLI::Workflow // Outputs: None void MSStoreUpdate(Execution::Context& context); + // Attempt to repair the installation of an Store app that is already installed + // Required Args: None + // Inputs: Installer + // Outputs: None + void MSStoreRepair(Execution::Context& context); + // Ensure the Store app is not blocked by policy. // Required Args: None // Inputs: Installer diff --git a/src/AppInstallerCLICore/Workflows/RepairFlow.cpp b/src/AppInstallerCLICore/Workflows/RepairFlow.cpp new file mode 100644 index 0000000000..2b76475198 --- /dev/null +++ b/src/AppInstallerCLICore/Workflows/RepairFlow.cpp @@ -0,0 +1,506 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. +#include "pch.h" +#include "RepairFlow.h" +#include "Workflows/ShellExecuteInstallerHandler.h" +#include "Workflows/WorkflowBase.h" +#include "Workflows/DownloadFlow.h" +#include "Workflows/ArchiveFlow.h" +#include "Workflows/InstallFlow.h" +#include "Workflows/PromptFlow.h" +#include "winget/ManifestCommon.h" +#include "AppInstallerDeployment.h" +#include "AppInstallerMsixInfo.h" +#include "AppInstallerSynchronization.h" +#include "MSStoreInstallerHandler.h" +#include "ManifestComparator.h" + +using namespace AppInstaller::Manifest; +using namespace AppInstaller::Msix; +using namespace AppInstaller::Repository; + +namespace AppInstaller::CLI::Workflow +{ + // Internal implementation details + namespace + { + // Sets the uninstall string in the context. + // RequiredArgs: + // Inputs:InstalledPackageVersion + // Outputs:SilentUninstallString, UninstallString + void SetUninstallStringInContext(Execution::Context& context) + { + const auto& installedPackageVersion = context.Get(); + IPackageVersion::Metadata packageMetadata = installedPackageVersion->GetMetadata(); + + // Default to silent unless it is not present or interactivity is requested + auto uninstallCommandItr = packageMetadata.find(PackageVersionMetadata::SilentUninstallCommand); + + if ((!context.Args.Contains(Execution::Args::Type::Silent) && uninstallCommandItr == packageMetadata.end()) + || context.Args.Contains(Execution::Args::Type::Interactive)) + { + auto interactiveItr = packageMetadata.find(PackageVersionMetadata::StandardUninstallCommand); + if (interactiveItr != packageMetadata.end()) + { + uninstallCommandItr = interactiveItr; + } + } + + if (uninstallCommandItr == packageMetadata.end()) + { + context.Reporter.Error() << Resource::String::NoRepairInfoFound << std::endl; + AICLI_TERMINATE_CONTEXT(APPINSTALLER_CLI_ERROR_NO_REPAIR_INFO_FOUND); + } + + context.Add(uninstallCommandItr->second); + } + + // Sets the modify path in the context. + // RequiredArgs:None + // Inputs:InstalledPackageVersion + // Outputs:ModifyPath + void SetModifyPathInContext(Execution::Context& context) + { + const auto& installedPackageVersion = context.Get(); + IPackageVersion::Metadata packageMetadata = installedPackageVersion->GetMetadata(); + + // Default to silent unless it is not present or interactivity is requested + auto modifyPathItr = packageMetadata.find(PackageVersionMetadata::StandardModifyCommand); + if (modifyPathItr == packageMetadata.end()) + { + context.Reporter.Error() << Resource::String::NoRepairInfoFound << std::endl; + AICLI_TERMINATE_CONTEXT(APPINSTALLER_CLI_ERROR_NO_REPAIR_INFO_FOUND); + } + + context.Add(modifyPathItr->second); + } + + // Sets the product codes in the context. + // RequiredArgs:None + // Inputs:InstalledPackageVersion + // Outputs:ProductCodes + void SetProductCodesInContext(Execution::Context& context) + { + const auto& installedPackageVersion = context.Get(); + auto productCodes = installedPackageVersion->GetMultiProperty(PackageVersionMultiProperty::ProductCode); + + if (productCodes.empty()) + { + context.Reporter.Error() << Resource::String::NoRepairInfoFound << std::endl; + AICLI_TERMINATE_CONTEXT(APPINSTALLER_CLI_ERROR_NO_REPAIR_INFO_FOUND); + } + + context.Add(productCodes); + } + + // Sets the package family names in the context. + // RequiredArgs:None + // Inputs:InstalledPackageVersion + // Outputs:PackageFamilyNames + void SetPackageFamilyNamesInContext(Execution::Context& context) + { + const auto& installedPackageVersion = context.Get(); + + auto packageFamilyNames = installedPackageVersion->GetMultiProperty(PackageVersionMultiProperty::PackageFamilyName); + if (packageFamilyNames.empty()) + { + context.Reporter.Error() << Resource::String::NoRepairInfoFound << std::endl; + AICLI_TERMINATE_CONTEXT(APPINSTALLER_CLI_ERROR_NO_REPAIR_INFO_FOUND); + } + + context.Add(packageFamilyNames); + } + + // The function performs a preliminary check on the installed package by reading its ARP registry flags for NoModify and NoRepair to confirm if the repair operation is applicable. + // RequiredArgs:None + // Inputs:InstalledPackageVersion, NoModify ?, NoRepair ? + // Outputs:None + void ApplicabilityCheckForInstalledPackage(Execution::Context& context) + { + // Installed Package repair applicability check + const auto& installedPackageVersion = context.Get(); + + const std::string installerType = context.Get()->GetMetadata()[PackageVersionMetadata::InstalledType]; + InstallerTypeEnum installerTypeEnum = ConvertToInstallerTypeEnum(installerType); + + if (installerTypeEnum == InstallerTypeEnum::Portable || installerTypeEnum == InstallerTypeEnum::Unknown) + { + context.Reporter.Error() << Resource::String::RepairOperationNotSupported << std::endl; + AICLI_TERMINATE_CONTEXT(APPINSTALLER_CLI_ERROR_REPAIR_NOT_SUPPORTED); + } + + IPackageVersion::Metadata packageMetadata = installedPackageVersion->GetMetadata(); + + auto noModifyItr = packageMetadata.find(PackageVersionMetadata::NoModify); + std::string noModifyARPFlag = noModifyItr != packageMetadata.end() ? noModifyItr->second : std::string(); + + auto noRepairItr = packageMetadata.find(PackageVersionMetadata::NoRepair); + std::string noRepairARPFlag = noRepairItr != packageMetadata.end() ? noRepairItr->second : std::string(); + + if (Utility::IsDwordFlagSet(noModifyARPFlag) || Utility::IsDwordFlagSet(noRepairARPFlag)) + { + context.Reporter.Error() << Resource::String::RepairOperationNotSupported << std::endl; + AICLI_TERMINATE_CONTEXT(APPINSTALLER_CLI_ERROR_REPAIR_NOT_SUPPORTED); + } + } + + // This function performs a preliminary check on the available matching package by reading its manifest entries for repair behavior to determine the type of repair operation and repair switch are applicable + // RequiredArgs:None + // Inputs:InstallerType, RepairBehavior + // Outputs:None + void ApplicabilityCheckForAvailablePackage(Execution::Context& context) + { + // Selected Installer repair applicability check + auto installerType = context.Get()->EffectiveInstallerType(); + auto repairBehavior = context.Get()->RepairBehavior; + + if (installerType == InstallerTypeEnum::Portable || installerType == InstallerTypeEnum::Unknown) + { + context.Reporter.Error() << Resource::String::RepairOperationNotSupported << std::endl; + AICLI_TERMINATE_CONTEXT(APPINSTALLER_CLI_ERROR_REPAIR_NOT_SUPPORTED); + } + + // Repair behavior is required for Burn, Inno, Nullsoft, Exe installers + if (DoesInstallerTypeRequireRepairBehaviorForRepair(installerType) && + repairBehavior == RepairBehaviorEnum::Unknown) + { + context.Reporter.Error() << Resource::String::NoRepairInfoFound << std::endl; + AICLI_TERMINATE_CONTEXT(APPINSTALLER_CLI_ERROR_NO_REPAIR_INFO_FOUND); + } + } + + // Generate the repair string based on the repair behavior and installer type. + // RequiredArgs:None + // Inputs:BaseInstallerType, RepairBehavior, ModifyPath?, UninstallString?, InstallerArgs + // Outputs:RepairString + void GenerateRepairString(Execution::Context& context) + { + const auto& installer = context.Get(); + auto installerType = installer->BaseInstallerType; + auto repairBehavior = installer->RepairBehavior; + + std::string repairCommand; + + switch (repairBehavior) + { + case RepairBehaviorEnum::Modify: + { + SetModifyPathInContext(context); + repairCommand.append(context.Get()); + } + break; + case RepairBehaviorEnum::Installer: + { + // [NOTE:] We will ShellExecuteInstall for this scenario which uses installer path directly.so no need for repair command generation. + // We prepare installer download and archive extraction here. + context << + ShowInstallationDisclaimer << + ShowPromptsForSinglePackage(/* ensureAcceptance */ true) << + DownloadInstaller; + + if (installerType == InstallerTypeEnum::Zip) + { + context << + ScanArchiveFromLocalManifest << + ExtractFilesFromArchive << + VerifyAndSetNestedInstaller; + } + } + break; + case RepairBehaviorEnum::Uninstaller: + { + SetUninstallStringInContext(context); + repairCommand.append(context.Get()); + } + break; + case RepairBehaviorEnum::Unknown: + default: + context.Reporter.Error() << Resource::String::NoRepairInfoFound << std::endl; + AICLI_TERMINATE_CONTEXT(APPINSTALLER_CLI_ERROR_NO_REPAIR_INFO_FOUND); + } + + context << + GetInstallerArgs; + + // Following is not applicable for RepairBehaviorEnum::Installer, as we can call ShellExecuteInstall directly with repair argument. + if (repairBehavior != RepairBehaviorEnum::Installer) + { + if (repairCommand.empty()) + { + context.Reporter.Error() << Resource::String::NoRepairInfoFound << std::endl; + AICLI_TERMINATE_CONTEXT(APPINSTALLER_CLI_ERROR_NO_REPAIR_INFO_FOUND); + } + + repairCommand.append(" "); + repairCommand.append(context.Get()); + context.Add(repairCommand); + } + } + } + + void RunRepairForRepairBehaviorBasedInstaller(Execution::Context& context) + { + const auto& installer = context.Get(); + auto repairBehavior = installer->RepairBehavior; + + if (repairBehavior == RepairBehaviorEnum::Modify || repairBehavior == RepairBehaviorEnum::Uninstaller) + { + context << + ShellExecuteRepairImpl << + ReportRepairResult(RepairBehaviorToString(repairBehavior), APPINSTALLER_CLI_ERROR_EXEC_REPAIR_FAILED); + } + else if (repairBehavior == RepairBehaviorEnum::Installer) + { + context << + ShellExecuteInstallImpl << + ReportInstallerResult(RepairBehaviorToString(repairBehavior), APPINSTALLER_CLI_ERROR_EXEC_REPAIR_FAILED); + } + else + { + context.Reporter.Error() << Resource::String::NoRepairInfoFound << std::endl; + AICLI_TERMINATE_CONTEXT(APPINSTALLER_CLI_ERROR_NO_REPAIR_INFO_FOUND); + } + } + + void RepairMsiBasedInstaller(Execution::Context& context) + { + context << + ShellExecuteMsiExecRepair << + ReportRepairResult("MsiExec", APPINSTALLER_CLI_ERROR_EXEC_REPAIR_FAILED); + } + + void RepairApplicabilityCheck(Execution::Context& context) + { + context << + ApplicabilityCheckForInstalledPackage << + ApplicabilityCheckForAvailablePackage; + } + + void ExecuteRepair(Execution::Context& context) + { + // [TODO:] At present, the repair flow necessitates a mapped available installer. + // However, future refactoring should allow for msix/msi repair without the need for one. + + const auto& installer = context.Get(); + InstallerTypeEnum installerTypeEnum = installer->EffectiveInstallerType(); + + Synchronization::CrossProcessInstallLock lock; + + if (!ExemptFromSingleInstallLocking(installerTypeEnum)) + { + // Acquire the lock , if the operation is cancelled it will return false so we will also return. + if (!context.Reporter.ExecuteWithProgress([&](IProgressCallback& callback) + { + callback.SetProgressMessage(Resource::String::InstallWaitingOnAnother()); + return lock.Acquire(callback); + })) + { + AICLI_LOG(CLI, Info, << "Abandoning attempt to acquire repair lock due to cancellation"); + return; + } + } + + switch (installerTypeEnum) + { + case InstallerTypeEnum::Burn: + case InstallerTypeEnum::Exe: + case InstallerTypeEnum::Inno: + case InstallerTypeEnum::Nullsoft: + { + context << + RunRepairForRepairBehaviorBasedInstaller; + } + break; + case InstallerTypeEnum::Msi: + case InstallerTypeEnum::Wix: + { + context << + RepairMsiBasedInstaller; + } + break; + case InstallerTypeEnum::Msix: + { + context << + RepairMsixPackage; + } + break; + case InstallerTypeEnum::MSStore: + { + context << + EnsureStorePolicySatisfied << + MSStoreRepair; + } + break; + case InstallerTypeEnum::Portable: + default: + THROW_HR(HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED)); + } + } + + void GetRepairInfo(Execution::Context& context) + { + const auto& installer = context.Get(); + InstallerTypeEnum installerTypeEnum = installer->EffectiveInstallerType(); + + switch (installerTypeEnum) + { + case InstallerTypeEnum::Burn: + case InstallerTypeEnum::Exe: + case InstallerTypeEnum::Inno: + case InstallerTypeEnum::Nullsoft: + { + context << + GenerateRepairString; + } + break; + case InstallerTypeEnum::Msi: + case InstallerTypeEnum::Wix: + { + context << + SetProductCodesInContext; + } + break; + case InstallerTypeEnum::Msix: + { + context << + SetPackageFamilyNamesInContext; + } + break; + case InstallerTypeEnum::MSStore: + break; + case InstallerTypeEnum::Portable: + default: + THROW_HR(HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED)); + } + } + + void RepairMsixPackage(Execution::Context& context) + { + bool isMachineScope = Manifest::ConvertToScopeEnum(context.Args.GetArg(Execution::Args::Type::InstallScope)) == Manifest::ScopeEnum::Machine; + + const auto& packageFamilyNames = context.Get(); + context.Reporter.Info() << Resource::String::RepairFlowStartingPackageRepair << std::endl; + + for (const auto& packageFamilyName : packageFamilyNames) + { + auto packageFullName = Msix::GetPackageFullNameFromFamilyName(packageFamilyName); + + if (!packageFullName.has_value()) + { + AICLI_LOG(CLI, Warning, << "No package found with family name: " << packageFamilyName); + continue; + } + + AICLI_LOG(CLI, Info, << "Repairing package: " << packageFullName.value()); + + try + { + if (!isMachineScope) + { + // Best effort repair by registering the package. + context.Reporter.ExecuteWithProgress(std::bind(Deployment::RegisterPackage, packageFamilyName, std::placeholders::_1)); + } + else + { + context.Reporter.Error() << Resource::String::RepairFlowReturnCodeSystemNotSupported << std::endl; + context.Add(static_cast(APPINSTALLER_CLI_ERROR_INSTALL_SYSTEM_NOT_SUPPORTED)); + AICLI_LOG(CLI, Error, << "Device wide repair for msix type is not supported."); + AICLI_TERMINATE_CONTEXT(APPINSTALLER_CLI_ERROR_INSTALL_SYSTEM_NOT_SUPPORTED); + } + } + catch (const wil::ResultException& re) + { + context.Add(re.GetErrorCode()); + context << ReportRepairResult("MSIX", re.GetErrorCode(), true); + return; + } + } + + context.Reporter.Info() << Resource::String::RepairFlowRepairSuccess << std::endl; + } + + void RepairSinglePackage(Execution::Context& context) + { + context << + RepairApplicabilityCheck << + GetRepairInfo << + ReportExecutionStage(ExecutionStage::Execution) << + ExecuteRepair << + ReportExecutionStage(ExecutionStage::PostExecution); + } + + void SelectApplicablePackageVersion(Execution::Context& context) + { + const auto& installedPackage = context.Get(); + + Utility::Version installedVersion = Utility::Version(installedPackage->GetProperty(PackageVersionProperty::Version)); + if (installedVersion.IsUnknown()) + { + context.Reporter.Error() << Resource::String::NoApplicableInstallers << std::endl; + AICLI_TERMINATE_CONTEXT(APPINSTALLER_CLI_ERROR_NO_APPLICABLE_INSTALLER); + } + + std::string_view requestedVersion = context.Args.Contains(Execution::Args::Type::Version) ? context.Args.GetArg(Execution::Args::Type::Version) : installedVersion.ToString(); + // If it's Store source with only one version unknown, use the unknown version for available version mapping. + const auto& package = context.Get(); + auto versionKeys = package->GetAvailableVersionKeys(); + if (versionKeys.size() == 1) + { + auto packageVersion = package->GetAvailableVersion(versionKeys.at(0)); + if (packageVersion->GetSource().IsWellKnownSource(WellKnownSource::MicrosoftStore) && + Utility::Version{ packageVersion->GetProperty(PackageVersionProperty::Version) }.IsUnknown()) + { + requestedVersion = ""; + } + } + + context << + GetManifestWithVersionFromPackage( + requestedVersion, + context.Args.GetArg(Execution::Args::Type::Channel), false) << + SelectInstaller << + EnsureApplicableInstaller; + } + + void ReportRepairResult::operator()(Execution::Context& context) const + { + DWORD repairResult = context.Get(); + + if (repairResult != 0) + { + const auto& repairPackage = context.Get(); + + Logging::Telemetry().LogRepairFailure( + repairPackage->GetProperty(PackageVersionProperty::Id), + repairPackage->GetProperty(PackageVersionProperty::Version), + m_repairType, + repairResult); + + if (m_isHResult) + { + context.Reporter.Error() + << Resource::String::RepairFailedWithCode(Utility::LocIndView{ GetUserPresentableMessage(repairResult) }) + << std::endl; + } + else + { + context.Reporter.Error() + << Resource::String::RepairFailedWithCode(repairResult) + << std::endl; + } + + // Show log path if available + if (context.Contains(Execution::Data::LogPath) && std::filesystem::exists(context.Get())) + { + auto installerLogPath = Utility::LocIndString{ context.Get().u8string() }; + context.Reporter.Info() << Resource::String::InstallerLogAvailable(installerLogPath) << std::endl; + } + + AICLI_TERMINATE_CONTEXT(m_hr); + } + else + { + context.Reporter.Info() << Resource::String::RepairFlowRepairSuccess << std::endl; + } + } +} \ No newline at end of file diff --git a/src/AppInstallerCLICore/Workflows/RepairFlow.h b/src/AppInstallerCLICore/Workflows/RepairFlow.h new file mode 100644 index 0000000000..6af77249df --- /dev/null +++ b/src/AppInstallerCLICore/Workflows/RepairFlow.h @@ -0,0 +1,78 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. +#pragma once +#include "ExecutionContext.h" + +namespace AppInstaller::CLI::Workflow +{ + // Execute the repair operation for RepairBehavior based installers. + // RequiredArgs:None + // Inputs: RepairBehavior, RepairString + // Outputs:None + void RunRepairForRepairBehaviorBasedInstaller(Execution::Context& context); + + // Execute the repair operation for MSI based installers. + // RequiredArgs:None + // Inputs: ProductCodes + // Outputs:None + void RepairMsiBasedInstaller(Execution::Context& context); + + // Applicability check for repair operation. + // RequiredArgs:None + // Inputs:InstalledPackageVersion, NoModify ?, NoRepair ? + // Outputs:None + void RepairApplicabilityCheck(Execution::Context& context); + + // Execute the repair operation. + // RequiredArgs:None + // Inputs: InstallerType, RepairBehavior ?, RepairString? , ProductCodes?, PackageFamilyNames? + // Outputs:None + void ExecuteRepair(Execution::Context& context); + + // Obtains the necessary information for repair operation. + // RequiredArgs:None + // Inputs:InstallerType + // Outputs:RepairString?, ProductCodes?, PackageFamilyNames? + void GetRepairInfo(Execution::Context& context); + + // Perform the repair operation for the MSIX package. + // RequiredArgs:None + // Inputs:PackageFamilyNames , InstallScope? + // Outputs:None + void RepairMsixPackage(Execution::Context& context); + + // Select the applicable package version by matching the installed package version with the available package version. + // RequiredArgs:None + // Inputs: Package,InstalledPackageVersion, AvailablePackageVersions + // Outputs:Manifest, PackageVersion, Installer + void SelectApplicablePackageVersion(Execution::Context& context); + + // Perform the repair operation for the single package. + // RequiredArgs:None + // Inputs: SearchResult, InstalledPackage, ApplicableInstaller + // Outputs:None + void RepairSinglePackage(Execution::Context& context); + + // Reports the result of the repair. + // Required Args: None + // Inputs: None + // Outputs: None + struct ReportRepairResult : public WorkflowTask + { + ReportRepairResult(std::string_view repairType, HRESULT hr, bool isHResult = false) : + WorkflowTask("ReportRepairResult"), + m_repairType(repairType), + m_hr(hr), + m_isHResult(isHResult) {} + + void operator()(Execution::Context& context) const override; + + private: + // Repair type used for reporting failure. + std::string_view m_repairType; + // Result to return if the repair fails. + HRESULT m_hr; + // Whether the result is an HRESULT. + bool m_isHResult; + }; +} diff --git a/src/AppInstallerCLICore/Workflows/ShellExecuteInstallerHandler.cpp b/src/AppInstallerCLICore/Workflows/ShellExecuteInstallerHandler.cpp index fcb514bf55..a25ca30cd0 100644 --- a/src/AppInstallerCLICore/Workflows/ShellExecuteInstallerHandler.cpp +++ b/src/AppInstallerCLICore/Workflows/ShellExecuteInstallerHandler.cpp @@ -76,6 +76,7 @@ namespace AppInstaller::CLI::Workflow std::string GetInstallerArgsTemplate(Execution::Context& context) { bool isUpdate = WI_IsFlagSet(context.GetFlags(), Execution::ContextFlag::InstallerExecutionUseUpdate); + bool isRepair = WI_IsFlagSet(context.GetFlags(), Execution::ContextFlag::InstallerExecutionUseRepair); const auto& installer = context.Get(); const auto& installerSwitches = installer->Switches; @@ -114,6 +115,17 @@ namespace AppInstaller::CLI::Workflow installerArgs += ' ' + installerSwitches.at(InstallerSwitchType::Log); } + // Construct repair arg. Custom switches and othe args are not applicable for repair scenario so we can return here. + if (isRepair) + { + if (installerSwitches.find(InstallerSwitchType::Repair) != installerSwitches.end()) + { + installerArgs += ' ' + installerSwitches.at(InstallerSwitchType::Repair); + } + + return installerArgs; + } + // Construct custom arg. if (installerSwitches.find(InstallerSwitchType::Custom) != installerSwitches.end()) { @@ -202,11 +214,45 @@ namespace AppInstaller::CLI::Workflow return args; } + + // Gets the arguments for repairing an MSI with MsiExec + std::string GetMsiExecRepairArgs(Execution::Context& context, const Utility::LocIndString& productCode) + { + // https://learn.microsoft.com/en-us/windows/win32/msi/command-line-options + // Available Options for '/f [p|o|e|d|c|a|u|m|s|v] ' + // Default parameter for '/f' is 'omus' + // o - Reinstall all files regardless of version + // m - Rewrite all required registry entries (This is the default option) + // u - Rewrite all required user-specific registry entries (This is the default option) + // s - Overwrite all existing shortcuts (This is the default option) + std::string args = "/f " + productCode.get(); + + // https://learn.microsoft.com/en-us/windows/win32/msi/standard-installer-command-line-options + if (context.Args.Contains(Execution::Args::Type::Silent)) + { + args += " /quiet /norestart"; + } + else if (!context.Args.Contains(Execution::Args::Type::Interactive)) + { + args += " /passive /norestart"; + } + + return args; + } } void ShellExecuteInstallImpl(Execution::Context& context) { - context.Reporter.Info() << Resource::String::InstallFlowStartingPackageInstall << std::endl; + bool isRepair = WI_IsFlagSet(context.GetFlags(), Execution::ContextFlag::InstallerExecutionUseRepair); + + if (isRepair) + { + context.Reporter.Info() << Resource::String::RepairFlowStartingPackageRepair << std::endl; + } + else + { + context.Reporter.Info() << Resource::String::InstallFlowStartingPackageInstall << std::endl; + } const auto& installer = context.Get(); const std::string& installerArgs = context.Get(); @@ -234,7 +280,15 @@ namespace AppInstaller::CLI::Workflow if (!installResult) { - context.Reporter.Warn() << Resource::String::InstallAbandoned << std::endl; + if (isRepair) + { + context.Reporter.Warn() << Resource::String::RepairAbandoned << std::endl; + } + else + { + context.Reporter.Warn() << Resource::String::InstallAbandoned << std::endl; + } + AICLI_TERMINATE_CONTEXT(E_ABORT); } else @@ -287,6 +341,49 @@ namespace AppInstaller::CLI::Workflow } } + void ShellExecuteRepairImpl(Execution::Context& context) + { + context.Reporter.Info() << Resource::String::RepairFlowStartingPackageRepair << std::endl; + + std::wstring commandUtf16 = Utility::ConvertToUTF16(context.Get()); + + // When running as admin, block attempt to repair user scope installed package. + // [NOTE:] This check is to address the security concern related to above scenario. + if (Runtime::IsRunningAsAdmin()) + { + auto installedPackageVersion = context.Get(); + const std::string installedScopeString = installedPackageVersion->GetMetadata()[PackageVersionMetadata::InstalledScope]; + auto scopeEnum = ConvertToScopeEnum(installedScopeString); + + if (scopeEnum == ScopeEnum::User) + { + context.Reporter.Error() << Resource::String::NoAdminRepairForUserScopePackage << std::endl; + AICLI_TERMINATE_CONTEXT(APPINSTALLER_CLI_ERROR_ADMIN_CONTEXT_REPAIR_PROHIBITED); + } + } + + // Parse the command string as application and command line for CreateProcess + wil::unique_cotaskmem_string app = nullptr; + wil::unique_cotaskmem_string args = nullptr; + THROW_IF_FAILED(SHEvaluateSystemCommandTemplate(commandUtf16.c_str(), &app, NULL, &args)); + + auto repairResult = context.Reporter.ExecuteWithProgress( + std::bind(InvokeShellExecute, + std::filesystem::path(app.get()), + Utility::ConvertToUTF8(args.get()), + std::placeholders::_1)); + + if (!repairResult) + { + context.Reporter.Error() << Resource::String::RepairAbandoned << std::endl; + AICLI_TERMINATE_CONTEXT(E_ABORT); + } + else + { + context.Add(repairResult.value()); + } + } + void ShellExecuteMsiExecUninstall(Execution::Context& context) { const auto& productCodes = context.Get(); @@ -305,7 +402,7 @@ namespace AppInstaller::CLI::Workflow if (!uninstallResult) { - context.Reporter.Warn() << Resource::String::UninstallAbandoned << std::endl; + context.Reporter.Error() << Resource::String::UninstallAbandoned << std::endl; AICLI_TERMINATE_CONTEXT(E_ABORT); } else @@ -315,6 +412,34 @@ namespace AppInstaller::CLI::Workflow } } + void ShellExecuteMsiExecRepair(Execution::Context& context) + { + const auto& productCodes = context.Get(); + context.Reporter.Info() << Resource::String::RepairFlowStartingPackageRepair << std::endl; + + const std::filesystem::path msiexecPath{ ExpandEnvironmentVariables(L"%windir%\\system32\\msiexec.exe") }; + + for (const auto& productCode : productCodes) + { + AICLI_LOG(CLI, Info, << "Repairing: " << productCode); + auto repairResult = context.Reporter.ExecuteWithProgress( + std::bind(InvokeShellExecute, + msiexecPath, + GetMsiExecRepairArgs(context, productCode), + std::placeholders::_1)); + + if (!repairResult) + { + context.Reporter.Error() << Resource::String::RepairAbandoned << std::endl; + AICLI_TERMINATE_CONTEXT(E_ABORT); + } + else + { + context.Add(repairResult.value()); + } + } + } + #ifndef AICLI_DISABLE_TEST_HOOKS std::optional s_EnableWindowsFeatureResult_Override{}; diff --git a/src/AppInstallerCLICore/Workflows/ShellExecuteInstallerHandler.h b/src/AppInstallerCLICore/Workflows/ShellExecuteInstallerHandler.h index a93d55908a..87fac6db18 100644 --- a/src/AppInstallerCLICore/Workflows/ShellExecuteInstallerHandler.h +++ b/src/AppInstallerCLICore/Workflows/ShellExecuteInstallerHandler.h @@ -35,6 +35,18 @@ namespace AppInstaller::CLI::Workflow // Outputs: InstallerArgs void GetInstallerArgs(Execution::Context& context); + // Repair is done through invoking ShellExecute on downloaded installer. + // Required Args: None + // Inputs: Manifest?, InstallerPath, InstallerArgs + // Outputs: OperationReturnCode + void ShellExecuteRepairImpl(Execution::Context& context); + + // Repair the MSI + // Required Args: None + // Inputs: ProductCodes + // Output: None + void ShellExecuteMsiExecRepair(Execution::Context& context); + // Enables the Windows Feature dependency by invoking ShellExecute on the DISM executable. // Required Args: None // Inputs: Windows Feature dependency diff --git a/src/AppInstallerCLICore/Workflows/WorkflowBase.cpp b/src/AppInstallerCLICore/Workflows/WorkflowBase.cpp index 1be12e80cc..6fd7818a9a 100644 --- a/src/AppInstallerCLICore/Workflows/WorkflowBase.cpp +++ b/src/AppInstallerCLICore/Workflows/WorkflowBase.cpp @@ -952,6 +952,7 @@ namespace AppInstaller::CLI::Workflow case OperationType::Uninstall: case OperationType::Pin: case OperationType::Upgrade: + case OperationType::Repair: context.Reporter.Info() << Resource::String::NoInstalledPackageFound << std::endl; break; case OperationType::Completion: @@ -981,7 +982,7 @@ namespace AppInstaller::CLI::Workflow { Logging::Telemetry().LogMultiAppMatch(); - if (m_operationType == OperationType::Upgrade || m_operationType == OperationType::Uninstall ) + if (m_operationType == OperationType::Upgrade || m_operationType == OperationType::Uninstall || m_operationType == OperationType::Repair) { context.Reporter.Warn() << Resource::String::MultipleInstalledPackagesFound << std::endl; context << ReportMultiplePackageFoundResult; @@ -1225,10 +1226,11 @@ namespace AppInstaller::CLI::Workflow void SelectInstaller(Execution::Context& context) { bool isUpdate = WI_IsFlagSet(context.GetFlags(), Execution::ContextFlag::InstallerExecutionUseUpdate); + bool isRepair = WI_IsFlagSet(context.GetFlags(), Execution::ContextFlag::InstallerExecutionUseRepair); IPackageVersion::Metadata installationMetadata; - if (isUpdate) + if (isUpdate || isRepair) { installationMetadata = context.Get()->GetMetadata(); } @@ -1241,8 +1243,16 @@ namespace AppInstaller::CLI::Workflow auto onlyInstalledType = std::find(inapplicabilities.begin(), inapplicabilities.end(), InapplicabilityFlags::InstalledType); if (onlyInstalledType != inapplicabilities.end()) { - context.Reporter.Info() << Resource::String::UpgradeDifferentInstallTechnology << std::endl; - AICLI_TERMINATE_CONTEXT(APPINSTALLER_CLI_ERROR_UPDATE_NOT_APPLICABLE); + if (isRepair) + { + context.Reporter.Info() << Resource::String::RepairDifferentInstallTechnology << std::endl; + AICLI_TERMINATE_CONTEXT(APPINSTALLER_CLI_ERROR_REPAIR_NOT_APPLICABLE); + } + else + { + context.Reporter.Info() << Resource::String::UpgradeDifferentInstallTechnology << std::endl; + AICLI_TERMINATE_CONTEXT(APPINSTALLER_CLI_ERROR_UPDATE_NOT_APPLICABLE); + } } } diff --git a/src/AppInstallerCLICore/Workflows/WorkflowBase.h b/src/AppInstallerCLICore/Workflows/WorkflowBase.h index 98df349531..6595256426 100644 --- a/src/AppInstallerCLICore/Workflows/WorkflowBase.h +++ b/src/AppInstallerCLICore/Workflows/WorkflowBase.h @@ -42,6 +42,7 @@ namespace AppInstaller::CLI::Workflow Uninstall, Upgrade, Download, + Repair, }; // A task in the workflow. diff --git a/src/AppInstallerCLIPackage/Shared/Strings/en-us/winget.resw b/src/AppInstallerCLIPackage/Shared/Strings/en-us/winget.resw index cf45ed4b42..041a541a1b 100644 --- a/src/AppInstallerCLIPackage/Shared/Strings/en-us/winget.resw +++ b/src/AppInstallerCLIPackage/Shared/Strings/en-us/winget.resw @@ -2757,4 +2757,61 @@ Please specify one of them using the --source option to proceed. The {0} source requires authentication. Authentication prompt may appear when necessary. Authenticated information will be shared with the source for access authorization. {Locked="{0}"} + + Repairs the selected package, either found by searching the installed packages list or directly from a manifest. By default, the query must case-insensitively match the id, name, or moniker of the package. Other fields can be used by passing their appropriate option. + id, name, and moniker are all named values in our context, and may benefit from not being translated. The match must be for any of them, with comparison ignoring case. + + + Repairs the selected package + + + The repair command for this package cannot be found. Please reach out to the package publisher for support. + + + The installer technology in use does not match the version currently installed. + + + Repair command not found. + + + The installer technology in use doesn't support repair. + + + Repair operation completed successfully. + + + Repair abandoned + + + Starting package repair... + + + Failed to repair Microsoft Store package. Error code: {0} + {Locked="{0}"} Error message displayed when a Microsoft Store application package fails to repair. {0} is a placeholder replaced by an error code. + + + Repair operation failed. + + + Repair operation is not applicable. + + + No matching package versions are available from the configured sources. + + + The current system configuration does not support the repair of this package. + + + The installer technology in use does not support repair. + + + The package installed for user scope cannot be repaired when running with administrator privileges. + + + Repair operations involving administrator privileges are not permitted on packages installed within the user scope. + + + Repair failed with exit code: {0} + {Locked="{0}"} Error message displayed when an attempt to repair an application package fails. {0} is a placeholder replaced by an error code. + \ No newline at end of file diff --git a/src/AppInstallerCommonCore/AppInstallerTelemetry.cpp b/src/AppInstallerCommonCore/AppInstallerTelemetry.cpp index ae969ff2a6..9fb07722b2 100644 --- a/src/AppInstallerCommonCore/AppInstallerTelemetry.cpp +++ b/src/AppInstallerCommonCore/AppInstallerTelemetry.cpp @@ -725,6 +725,33 @@ namespace AppInstaller::Logging } } + void TelemetryTraceLogger::LogRepairFailure(std::string_view id, std::string_view version, std::string_view type, uint32_t errorCode) const noexcept + { + if (IsTelemetryEnabled()) + { + AICLI_TraceLoggingWriteActivity( + "RepairFailure", + TraceLoggingUInt32(m_subExecutionId, "SubExecutionId"), + AICLI_TraceLoggingStringView(id, "Id"), + AICLI_TraceLoggingStringView(version, "Version"), + AICLI_TraceLoggingStringView(type, "Type"), + TraceLoggingUInt32(errorCode, "ErrorCode"), + TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance), + TraceLoggingKeyword(MICROSOFT_KEYWORD_CRITICAL_DATA)); + + if (m_useSummary) + { + m_summary.PackageIdentifier = id; + m_summary.PackageVersion = version; + m_summary.RepairExecutionType = type; + m_summary.RepairErrorCode = errorCode; + + } + } + + AICLI_LOG(CLI, Error, << type << " repair failed: " << errorCode); + } + TelemetryTraceLogger::~TelemetryTraceLogger() { if (IsTelemetryEnabled()) @@ -798,6 +825,8 @@ namespace AppInstaller::Logging AICLI_TraceLoggingStringView(m_summary.ARPPublisher, "ARPPublisher"), AICLI_TraceLoggingStringView(m_summary.DOUrl, "DOUrl"), TraceLoggingHResult(m_summary.DOHResult, "DOHResult"), + AICLI_TraceLoggingStringView(m_summary.RepairExecutionType, "RepairExecutionType"), + TraceLoggingUInt32(m_summary.RepairErrorCode, "RepairErrorCode"), TelemetryPrivacyDataTag(PDT_ProductAndServicePerformance | PDT_ProductAndServiceUsage | PDT_SoftwareSetupAndInventory), TraceLoggingKeyword(MICROSOFT_KEYWORD_MEASURES)); } diff --git a/src/AppInstallerCommonCore/Deployment.cpp b/src/AppInstallerCommonCore/Deployment.cpp index 10add79822..cdd87ea01e 100644 --- a/src/AppInstallerCommonCore/Deployment.cpp +++ b/src/AppInstallerCommonCore/Deployment.cpp @@ -124,7 +124,7 @@ namespace AppInstaller::Deployment RemovePackage(packageFullName, RemovalOptions::None, cb); } CATCH_LOG(); - }); + }); Uri uriObject(Utility::ConvertToUTF16(uri)); @@ -229,7 +229,7 @@ namespace AppInstaller::Deployment RemovePackage(packageFullName, RemovalOptions::RemoveForAllUsers, cb); } CATCH_LOG(); - }); + }); Uri uriObject(Utility::ConvertToUTF16(uri)); PartialPercentProgressCallback progress{ callback, 100 }; @@ -322,4 +322,18 @@ namespace AppInstaller::Deployment return packages.begin() != packages.end(); } + + void RegisterPackage( + std::string_view packageFamilyName, + IProgressCallback& callback) + { + size_t id = GetDeploymentOperationId(); + AICLI_LOG(Core, Info, << "Starting RegisterPackageByFullNameAsync operation #" << id << ": " << packageFamilyName); + + PackageManager packageManager; + winrt::hstring packageFamilyNameWide = Utility::ConvertToUTF16(packageFamilyName).c_str(); + auto deployOperation = packageManager.RegisterPackageByFamilyNameAsync(packageFamilyNameWide, nullptr, DeploymentOptions::None, nullptr, nullptr); + + WaitForDeployment(deployOperation, id, callback); + } } diff --git a/src/AppInstallerCommonCore/MSStore.cpp b/src/AppInstallerCommonCore/MSStore.cpp index be4b289f3d..b3c4d0b886 100644 --- a/src/AppInstallerCommonCore/MSStore.cpp +++ b/src/AppInstallerCommonCore/MSStore.cpp @@ -102,7 +102,7 @@ namespace AppInstaller::MSStore // Best effort verifying/acquiring product ownership. std::ignore = EnsureFreeEntitlement(m_productId, m_scope); - if (m_type == MSStoreOperationType::Install) + if (m_type == MSStoreOperationType::Install || m_type == MSStoreOperationType::Repair) { return InstallPackage(progress); } @@ -122,6 +122,12 @@ namespace AppInstaller::MSStore installOptions.CompletedInstallToastNotificationMode(AppInstallationToastNotificationMode::NoToast); } + if (m_type == MSStoreOperationType::Repair) + { + // Attempt to repair the installation of an app that is already installed. + installOptions.Repair(true); + } + if (m_scope == Manifest::ScopeEnum::Machine) { // TODO: There was a bug in InstallService where admin user is incorrectly identified as not admin, diff --git a/src/AppInstallerCommonCore/Manifest/ManifestCommon.cpp b/src/AppInstallerCommonCore/Manifest/ManifestCommon.cpp index 1f6200363f..9856c1a30c 100644 --- a/src/AppInstallerCommonCore/Manifest/ManifestCommon.cpp +++ b/src/AppInstallerCommonCore/Manifest/ManifestCommon.cpp @@ -899,6 +899,15 @@ namespace AppInstaller::Manifest installerType == InstallerTypeEnum::Msix; } + bool DoesInstallerTypeRequireRepairBehaviorForRepair(InstallerTypeEnum installerType) + { + return + installerType == InstallerTypeEnum::Burn || + installerType == InstallerTypeEnum::Inno || + installerType == InstallerTypeEnum::Nullsoft || + installerType == InstallerTypeEnum::Exe; + } + bool IsArchiveType(InstallerTypeEnum installerType) { return (installerType == InstallerTypeEnum::Zip); diff --git a/src/AppInstallerCommonCore/Public/AppInstallerDeployment.h b/src/AppInstallerCommonCore/Public/AppInstallerDeployment.h index 7aa52ccdf6..6671cc9ed5 100644 --- a/src/AppInstallerCommonCore/Public/AppInstallerDeployment.h +++ b/src/AppInstallerCommonCore/Public/AppInstallerDeployment.h @@ -47,4 +47,9 @@ namespace AppInstaller::Deployment // Calls winrt::Windows::Management::Deployment::PackageManager::FindPackagesForUser bool IsRegistered(std::string_view packageFamilyName); + + // Calls winrt::Windows::Management::Deployment::PackageManager::RegisterPackageByFamilyNameAsync + void RegisterPackage( + std::string_view packageFamilyName, + IProgressCallback& callback); } diff --git a/src/AppInstallerCommonCore/Public/AppInstallerTelemetry.h b/src/AppInstallerCommonCore/Public/AppInstallerTelemetry.h index c794b0ba03..3a39fb343d 100644 --- a/src/AppInstallerCommonCore/Public/AppInstallerTelemetry.h +++ b/src/AppInstallerCommonCore/Public/AppInstallerTelemetry.h @@ -110,6 +110,10 @@ namespace AppInstaller::Logging std::string UninstallerExecutionType; UINT32 UninstallerErrorCode = 0; + // LogRepairFailure + std::string RepairExecutionType; + UINT32 RepairErrorCode = 0; + // LogSuccessfulInstallARPChange UINT64 ChangesToARP = 0; UINT64 MatchesInARP = 0; @@ -236,6 +240,9 @@ namespace AppInstaller::Logging // Logs a failed uninstallation attempt. void LogUninstallerFailure(std::string_view id, std::string_view version, std::string_view type, uint32_t errorCode) const noexcept; + // Logs a failed repair attempt. + void LogRepairFailure(std::string_view id, std::string_view version, std::string_view type, uint32_t errorCode) const noexcept; + // Logs data about the changes that ocurred in the ARP entries based on an install. // First 4 arguments are well known values for the package that we installed. // The next 3 are counts of the number of packages in each category. diff --git a/src/AppInstallerCommonCore/Public/winget/MSStore.h b/src/AppInstallerCommonCore/Public/winget/MSStore.h index 33d1efa6d9..2d8cabaa50 100644 --- a/src/AppInstallerCommonCore/Public/winget/MSStore.h +++ b/src/AppInstallerCommonCore/Public/winget/MSStore.h @@ -18,6 +18,7 @@ namespace AppInstaller::MSStore { Install, Update, + Repair, }; struct MSStoreOperation diff --git a/src/AppInstallerCommonCore/Public/winget/ManifestCommon.h b/src/AppInstallerCommonCore/Public/winget/ManifestCommon.h index 051289eed0..62b4a24dbc 100644 --- a/src/AppInstallerCommonCore/Public/winget/ManifestCommon.h +++ b/src/AppInstallerCommonCore/Public/winget/ManifestCommon.h @@ -431,6 +431,9 @@ namespace AppInstaller::Manifest // Gets a value indicating whether the given installer requires admin for install. bool DoesInstallerTypeRequireAdminForMachineScopeInstall(InstallerTypeEnum installerType); + // Gets a value indicating whether the given installer requires RepairBehavior for repair. + bool DoesInstallerTypeRequireRepairBehaviorForRepair(InstallerTypeEnum installerType); + // Gets a value indicating whether the given installer type is an archive. bool IsArchiveType(InstallerTypeEnum installerType); diff --git a/src/AppInstallerRepositoryCore/Microsoft/ARPHelper.cpp b/src/AppInstallerRepositoryCore/Microsoft/ARPHelper.cpp index 5bb9ef32ed..e15406eb58 100644 --- a/src/AppInstallerRepositoryCore/Microsoft/ARPHelper.cpp +++ b/src/AppInstallerRepositoryCore/Microsoft/ARPHelper.cpp @@ -530,6 +530,11 @@ namespace AppInstaller::Repository::Microsoft AddMetadataIfPresent(arpKey, UninstallString, index, manifestId, PackageVersionMetadata::StandardUninstallCommand); AddMetadataIfPresent(arpKey, QuietUninstallString, index, manifestId, PackageVersionMetadata::SilentUninstallCommand); + // Pick up ModifyPath for repair. + AddMetadataIfPresent(arpKey, ModifyPath, index, manifestId, PackageVersionMetadata::StandardModifyCommand); + AddMetadataIfPresent(arpKey, NoModify, index, manifestId, PackageVersionMetadata::NoModify); + AddMetadataIfPresent(arpKey, NoRepair, index, manifestId, PackageVersionMetadata::NoRepair); + // Pick up Language to enable proper selection of language for upgrade. AddMetadataIfPresent(arpKey, Language, index, manifestId, PackageVersionMetadata::InstalledLocale); diff --git a/src/AppInstallerRepositoryCore/Microsoft/ARPHelper.h b/src/AppInstallerRepositoryCore/Microsoft/ARPHelper.h index e0afa19924..d00e4fd64f 100644 --- a/src/AppInstallerRepositoryCore/Microsoft/ARPHelper.h +++ b/src/AppInstallerRepositoryCore/Microsoft/ARPHelper.h @@ -55,6 +55,12 @@ namespace AppInstaller::Repository::Microsoft const std::wstring SystemComponent{ L"SystemComponent" }; // REG_SZ const std::wstring DisplayIcon{ L"DisplayIcon" }; + // REG_DWORD + const std::wstring NoModify{ L"NoModify" }; + // REG_DWORD + const std::wstring NoRepair{ L"NoRepair" }; + // REG_SZ + const std::wstring ModifyPath{ L"ModifyPath" }; // Gets the registry key associated with the given scope and architecture on this platform. // May return an empty key if there is no valid location (bad combination or not found). diff --git a/src/AppInstallerRepositoryCore/Public/winget/RepositorySearch.h b/src/AppInstallerRepositoryCore/Public/winget/RepositorySearch.h index 5d8cc33192..528551b58c 100644 --- a/src/AppInstallerRepositoryCore/Public/winget/RepositorySearch.h +++ b/src/AppInstallerRepositoryCore/Public/winget/RepositorySearch.h @@ -202,6 +202,12 @@ namespace AppInstaller::Repository UserIntentArchitecture, // The locale of user intent UserIntentLocale, + // The standard modify command; which may be interactive + StandardModifyCommand, + // No Modify flag + NoModify, + // No Repair flag + NoRepair, }; // Convert a PackageVersionMetadata to a string. diff --git a/src/AppInstallerSharedLib/AppInstallerStrings.cpp b/src/AppInstallerSharedLib/AppInstallerStrings.cpp index 6e77f25030..33ea49e898 100644 --- a/src/AppInstallerSharedLib/AppInstallerStrings.cpp +++ b/src/AppInstallerSharedLib/AppInstallerStrings.cpp @@ -867,4 +867,24 @@ namespace AppInstaller::Utility THROW_HR_IF(E_UNEXPECTED, !StringFromGUID2(value, buffer, ARRAYSIZE(buffer))); return ConvertToUTF8(buffer); } + + bool IsDwordFlagSet(const std::string& value) + { + if (std::empty(value)) + { + return false; + } + + try + { + DWORD dwordValue = std::stoul(value); + + // If the value is 0, then it is not set. + return dwordValue != 0; + } + catch (...) + { + return false; + } + } } diff --git a/src/AppInstallerSharedLib/Errors.cpp b/src/AppInstallerSharedLib/Errors.cpp index 8a9923e284..70707ede34 100644 --- a/src/AppInstallerSharedLib/Errors.cpp +++ b/src/AppInstallerSharedLib/Errors.cpp @@ -208,6 +208,11 @@ namespace AppInstaller WINGET_HRESULT_INFO(APPINSTALLER_CLI_ERROR_AUTHENTICATION_INTERACTIVE_REQUIRED, "Authentication failed. Interactive authentication required."), WINGET_HRESULT_INFO(APPINSTALLER_CLI_ERROR_AUTHENTICATION_CANCELLED_BY_USER, "Authentication failed. User cancelled."), WINGET_HRESULT_INFO(APPINSTALLER_CLI_ERROR_AUTHENTICATION_INCORRECT_ACCOUNT, "Authentication failed. Authenticated account is not the desired account."), + WINGET_HRESULT_INFO(APPINSTALLER_CLI_ERROR_NO_REPAIR_INFO_FOUND, "Repair command not found."), + WINGET_HRESULT_INFO(APPINSTALLER_CLI_ERROR_REPAIR_NOT_APPLICABLE, "Repair operation is not applicable."), + WINGET_HRESULT_INFO(APPINSTALLER_CLI_ERROR_EXEC_REPAIR_FAILED, "Repair operation failed."), + WINGET_HRESULT_INFO(APPINSTALLER_CLI_ERROR_REPAIR_NOT_SUPPORTED, "The installer technology in use doesn't support repair."), + WINGET_HRESULT_INFO(APPINSTALLER_CLI_ERROR_ADMIN_CONTEXT_REPAIR_PROHIBITED, "Repair operations involving administrator privileges are not permitted on packages installed within the user scope."), // Install errors. WINGET_HRESULT_INFO(APPINSTALLER_CLI_ERROR_INSTALL_PACKAGE_IN_USE, "Application is currently running. Exit the application then try again."), diff --git a/src/AppInstallerSharedLib/Public/AppInstallerErrors.h b/src/AppInstallerSharedLib/Public/AppInstallerErrors.h index cf4e1c07ff..06ca30cecb 100644 --- a/src/AppInstallerSharedLib/Public/AppInstallerErrors.h +++ b/src/AppInstallerSharedLib/Public/AppInstallerErrors.h @@ -138,6 +138,11 @@ #define APPINSTALLER_CLI_ERROR_AUTHENTICATION_INTERACTIVE_REQUIRED ((HRESULT)0x8A150076) #define APPINSTALLER_CLI_ERROR_AUTHENTICATION_CANCELLED_BY_USER ((HRESULT)0x8A150077) #define APPINSTALLER_CLI_ERROR_AUTHENTICATION_INCORRECT_ACCOUNT ((HRESULT)0x8A150078) +#define APPINSTALLER_CLI_ERROR_NO_REPAIR_INFO_FOUND ((HRESULT)0x8A150079) +#define APPINSTALLER_CLI_ERROR_REPAIR_NOT_APPLICABLE ((HRESULT)0x8A15007A) +#define APPINSTALLER_CLI_ERROR_EXEC_REPAIR_FAILED ((HRESULT)0x8A15007B) +#define APPINSTALLER_CLI_ERROR_REPAIR_NOT_SUPPORTED ((HRESULT)0x8A15007C) +#define APPINSTALLER_CLI_ERROR_ADMIN_CONTEXT_REPAIR_PROHIBITED ((HRESULT)0x8A15007D) // Install errors. #define APPINSTALLER_CLI_ERROR_INSTALL_PACKAGE_IN_USE ((HRESULT)0x8A150101) diff --git a/src/AppInstallerSharedLib/Public/AppInstallerStrings.h b/src/AppInstallerSharedLib/Public/AppInstallerStrings.h index 5c7a3a39b7..829a7a7723 100644 --- a/src/AppInstallerSharedLib/Public/AppInstallerStrings.h +++ b/src/AppInstallerSharedLib/Public/AppInstallerStrings.h @@ -268,4 +268,7 @@ namespace AppInstaller::Utility // Converts the given GUID value to a string. std::string ConvertGuidToString(const GUID& value); + + // Converts the input string to a DWORD value using std::stoul and returns a boolean value based on the resulting DWORD value. + bool IsDwordFlagSet(const std::string& value); } From 2741e919c6d162d98055fee420afab59f15606ab Mon Sep 17 00:00:00 2001 From: "Mr.k" Date: Mon, 19 Feb 2024 01:08:19 +0300 Subject: [PATCH 05/13] Fix typo in '#658 - WinGet Download.md' Spec File (#4179) There were miss-placed double quotes in the section titled 'WinGet Setting - Default Download Output', see commit patches for exact location of this typo. - [x] I have signed the [Contributor License Agreement](https://cla.opensource.microsoft.com/microsoft/winget-pkgs). - [ ] This pull request is related to an issue. ----- ###### Microsoft Reviewers: [Open in CodeFlow](https://microsoft.github.io/open-pr/?codeflow=https://github.com/microsoft/winget-cli/pull/4179) --- doc/specs/#658 - WinGet Download.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/specs/#658 - WinGet Download.md b/doc/specs/#658 - WinGet Download.md index b3bcb1071f..a9c7eaba46 100644 --- a/doc/specs/#658 - WinGet Download.md +++ b/doc/specs/#658 - WinGet Download.md @@ -97,9 +97,9 @@ usage: winget download [[-q] ] [] The following items will be included in the WinGet Settings Schema ```json -"DownloadBehavior: { +"DownloadBehavior": { "defaultDownloadDirectory":"%USERPROFILE%/Downloads/" -}" +} ``` The "defaultDownloadDirectory" setting will be used as the default folder where the package installer and manifest is downloaded to. From 90be304ae65cb8a43c23b1eb3d4545cb6e9a8ccd Mon Sep 17 00:00:00 2001 From: Ryan <69221034+ryfu-msft@users.noreply.github.com> Date: Tue, 20 Feb 2024 11:27:25 -0800 Subject: [PATCH 06/13] Update WinGet Download spec with accurate PS cmdlet help (#4182) --- doc/specs/#658 - WinGet Download.md | 37 ++++++++++++++++------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/doc/specs/#658 - WinGet Download.md b/doc/specs/#658 - WinGet Download.md index a9c7eaba46..73af004b52 100644 --- a/doc/specs/#658 - WinGet Download.md +++ b/doc/specs/#658 - WinGet Download.md @@ -105,29 +105,34 @@ The following items will be included in the WinGet Settings Schema The "defaultDownloadDirectory" setting will be used as the default folder where the package installer and manifest is downloaded to. ### WinGet PowerShell Cmdlet -WinGet PowerShell cmdlet will download the identified package's installer and manifest based on the user specified parameters. While downloading the package's installer, PowerShell will show a progress bar displaying the progress. Afterwards, it will return the downloaded directory where the files were downloaded to.: +WinGet PowerShell cmdlet will download the identified package's installer and manifest based on the user specified parameters. While downloading the package's installer, PowerShell will show a progress bar displaying the progress. Once the download is complete, the status of the download will be shown to the user, along with the id, name, and source of the package. -```PS -PS C:\> Get-Help Save-WinGetPackage +``` +C:\> Export-WinGetPackage -? NAME - Save-WinGetPackage - -SYNOPSIS - Downloads a package installer from a WinGet configured source. + Export-WinGetPackage SYNTAX - Save-WinGetPackage [-ID ] [-Name ] [-Moniker ] - [-Scope ] [-Locale ] [-FileName ] - [-Version ] [-Source ] [-Architecture ] [-Exact] - [-Output ] [InstallerType ] [-IgnoreSecurityHash] - [-AcceptPackageAgreement] [-Wait] [-Verbose] + Export-WinGetPackage [[-Query] ] [-DownloadDirectory ] [-AllowHashMismatch] [-Architecture + {Default | X86 | Arm | X64 | Arm64}] [-InstallerType {Default | Inno | Wix | Msi | Nullsoft | Zip | Msix | Exe | + Burn | MSStore | Portable}] [-Locale ] [-Scope {Any | User | System | UserOrUnknown | SystemOrUnknown}] + [-SkipDependencies] [-Version ] [-Id ] [-Name ] [-Moniker ] [-Source ] + [-MatchOption {Equals | EqualsCaseInsensitive | StartsWithCaseInsensitive | ContainsCaseInsensitive}] [-WhatIf] + [-Confirm] [] + + Export-WinGetPackage [[-PSCatalogPackage] ] [-DownloadDirectory ] [-AllowHashMismatch] + [-Architecture {Default | X86 | Arm | X64 | Arm64}] [-InstallerType {Default | Inno | Wix | Msi | Nullsoft | Zip | + Msix | Exe | Burn | MSStore | Portable}] [-Locale ] [-Scope {Any | User | System | UserOrUnknown | + SystemOrUnknown}] [-SkipDependencies] [-Version ] [-WhatIf] [-Confirm] [] + + +ALIASES + None -DESCRIPTION - Downloads a package installer and manifest, either found by searching a configured source or - directly from a manifest. By default, the query must case-insensitively match the id, name, or - moniker of the package. Other fields can be used by passing their appropriate option. +REMARKS + None ``` ## Capabilities From ecc2314ecdc3ad7fe428f84a4f8932e7fb235a18 Mon Sep 17 00:00:00 2001 From: Kaleb Luedtke Date: Wed, 21 Feb 2024 11:54:56 -0600 Subject: [PATCH 07/13] Add Troubleshooting Step for CDN (#4188) - [x] I have signed the [Contributor License Agreement](https://cla.opensource.microsoft.com/microsoft/winget-pkgs). - [x] This pull request is related to an issue. * #4187 * https://github.com/microsoft/winget-cli/issues/3832 * https://github.com/microsoft/winget-cli/issues/3706 * https://github.com/microsoft/winget-cli/issues/4117 ----- ###### Microsoft Reviewers: [Open in CodeFlow](https://microsoft.github.io/open-pr/?codeflow=https://github.com/microsoft/winget-cli/pull/4188) --------- Co-authored-by: Muhammad Danish --- .github/actions/spelling/expect.txt | 1 + doc/troubleshooting/README.md | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt index 83f53d39c0..c65b3b7778 100644 --- a/.github/actions/spelling/expect.txt +++ b/.github/actions/spelling/expect.txt @@ -144,6 +144,7 @@ fuzzer fzanollo gcpi GESMBH +getwinget GHS gity goku diff --git a/doc/troubleshooting/README.md b/doc/troubleshooting/README.md index 69e41905d1..03bd338fb6 100644 --- a/doc/troubleshooting/README.md +++ b/doc/troubleshooting/README.md @@ -42,6 +42,19 @@ After the package is provisioned, the users need to log into their Windows accou ## Common Issues +### Executing `winget` exits with no message + +If no output is displayed, it is likely that the version of WinGet on your system is using a retired Content Delivery Network (CDN). +You can check which version of WinGet is on your machine using `winget --info`. If the version is lower than `1.6.3482`, take the following troubleshooting steps. + +1. Install the latest version of WinGet using one of the below methods + * a. Through the Microsoft Store by installing the latest version of [App Installer](https://apps.microsoft.com/detail/9NBLGGH4NNS1) + * b. Through installing the MSIX package found in the [GitHub releases](https://github.com/microsoft/winget-cli/releases) + * c. Through installing the MSIX package from https://aka.ms/getwinget +2. Force a source update using `winget source update` + +If the above guidelines do not resolve the problem, please open an issue with details of the Windows version and App Installer version you are using. + ### Executing `winget` doesn't display help The following errors are displayed when executed in CMD. From d82566ed593920f770af4d44063990f31fd8cb87 Mon Sep 17 00:00:00 2001 From: Ryan <69221034+ryfu-msft@users.noreply.github.com> Date: Wed, 21 Feb 2024 14:00:19 -0800 Subject: [PATCH 08/13] CodeCoverage pipeline for submission to onefuzz. (#4177) --- .github/actions/spelling/expect.txt | 3 + azure-pipelines.coverage.yml | 70 ++++++++++++++++++++++++ azure-pipelines.yml | 1 + src/WinGetYamlFuzzing/OneFuzzConfig.json | 5 ++ 4 files changed, 79 insertions(+) create mode 100644 azure-pipelines.coverage.yml diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt index c65b3b7778..1ded03803c 100644 --- a/.github/actions/spelling/expect.txt +++ b/.github/actions/spelling/expect.txt @@ -34,6 +34,7 @@ Atest ATL AUrl Authenticode +azcopy azurewebsites bcp BEFACEF @@ -66,6 +67,7 @@ CLOSEAPP cloudapp clsctx clsid +cobertura CODEOWNERS COINIT COMGLB @@ -388,6 +390,7 @@ runtimeclass ryfu rzkzqaqjwj SARL +SASURL schematab sddl SECUREFILEPATH diff --git a/azure-pipelines.coverage.yml b/azure-pipelines.coverage.yml new file mode 100644 index 0000000000..8d94e1a4f3 --- /dev/null +++ b/azure-pipelines.coverage.yml @@ -0,0 +1,70 @@ +# Code coverage pipeline required by OneFuzz +pr: none +trigger: none + +pool: + vmImage: windows-latest + +parameters: + - name: sasUrl + type: string + displayName: SAS URL + - name: branch + type: string + displayName: Branch + - name: jobID + type: string + displayName: OneFuzz Job ID + - name: buildDate + type: string + displayName: Build Date + - name: commitID + type: string + displayName: Commit ID + +variables: + - name: coverage-file + value: cobertura-coverage.xml + - name: job-ID + value: ${{ parameters.jobID }} + - name: build-date + value: ${{ parameters.buildDate }} + - name: branch + value: ${{ parameters.branch }} + - name: sas-url + value: ${{ parameters.sasUrl }} + - name: commit-ID + value: ${{ parameters.commitID }} + +jobs: +- job: prod + displayName: Prod Task + steps: + # Get source code + - script: | + git clone https://github.com/microsoft/winget-cli.git + git checkout $(commit-ID) + displayName: 'Clone winget-cli' + + # Get code coverage from OneFuzz for the job + - powershell: | + Write-Host "Job ID: $(job-ID), Build Date: $(build-date), Branch: $(branch)" + $SASUrl = [System.Uri]::new("$(sas-url)") + azcopy cp $SASUrl.AbsoluteUri ./ --recursive + $ContainerName = $SASURL.LocalPath.Split("/")[1] + Write-Host "##vso[task.setvariable variable=container-name;]$ContainerName" + cd $ContainerName + $size = ((Get-Item .\$(coverage-file)).length) + if ($size -eq 0) { + Write-Host "Cobertura coverage XML is empty." + exit 1 + } + displayName: PowerShell script to get coverage + + # Use Cobertura report generator + - task: PublishCodeCoverageResults@1 + inputs: + codeCoverageTool: 'Cobertura' + summaryFileLocation: ./$(container-name)\$(coverage-file) + pathToSources: $(System.DefaultWorkingDirectory) + displayName: Built in ADO Task that uses ReportGenerator \ No newline at end of file diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 2ec5faaded..9523f7376b 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -592,3 +592,4 @@ jobs: onefuzzDropDirectory: '$(buildOutDir)\WinGetYamlFuzzing' onefuzzDropPAT: $(onefuzzDropPAT) onefuzzFilingBugPAT: $(onefuzzBugFilingPAT) + onefuzzCodeCoveragePAT: $(onefuzzCodeCoveragePAT) diff --git a/src/WinGetYamlFuzzing/OneFuzzConfig.json b/src/WinGetYamlFuzzing/OneFuzzConfig.json index 6f45ba3ccf..a9f3c90f44 100644 --- a/src/WinGetYamlFuzzing/OneFuzzConfig.json +++ b/src/WinGetYamlFuzzing/OneFuzzConfig.json @@ -26,6 +26,11 @@ "AssignedTo": "ryfu@microsoft.com", "AreaPath": "OS\\Windows Client and Services\\ADEPT\\E4D-Engineered for Developers\\InstaDev", "IterationPath": "OS" + }, + "codeCoverage": { + "org": "ms", + "project": "winget-cli", + "pipelineId": "Pipeline ID" } } ] From 180a8d7d5ad3fe90c3a038f9e5ffda5ae77c289a Mon Sep 17 00:00:00 2001 From: Ryan <69221034+ryfu-msft@users.noreply.github.com> Date: Wed, 21 Feb 2024 15:40:34 -0800 Subject: [PATCH 09/13] Update fuzzing code coverage pipeline id (#4191) --- src/WinGetYamlFuzzing/OneFuzzConfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/WinGetYamlFuzzing/OneFuzzConfig.json b/src/WinGetYamlFuzzing/OneFuzzConfig.json index a9f3c90f44..9f967f50f7 100644 --- a/src/WinGetYamlFuzzing/OneFuzzConfig.json +++ b/src/WinGetYamlFuzzing/OneFuzzConfig.json @@ -30,7 +30,7 @@ "codeCoverage": { "org": "ms", "project": "winget-cli", - "pipelineId": "Pipeline ID" + "pipelineId": "630" } } ] From bdeea5ad5db25bda2cd610eb08a6125e3a54c1d7 Mon Sep 17 00:00:00 2001 From: Ryan <69221034+ryfu-msft@users.noreply.github.com> Date: Thu, 22 Feb 2024 09:30:30 -0800 Subject: [PATCH 10/13] Increment version to 1.8 (#4192) --- src/binver/binver/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/binver/binver/version.h b/src/binver/binver/version.h index 50f3f95f24..e0832db80e 100644 --- a/src/binver/binver/version.h +++ b/src/binver/binver/version.h @@ -2,7 +2,7 @@ #define STRINGIZE(s) STRINGIZE2(s) #define VERSION_MAJOR 1 -#define VERSION_MINOR 7 +#define VERSION_MINOR 8 #define VERSION_BUILD 0 #define VERSION_REVISION 0 From 101f68be6793513e9f868e75640461f5cdd4dcf9 Mon Sep 17 00:00:00 2001 From: Ryan <69221034+ryfu-msft@users.noreply.github.com> Date: Mon, 26 Feb 2024 09:26:54 -0800 Subject: [PATCH 11/13] Remove x86 platform from fuzzing pipeline (#4195) --- azure-pipelines.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 9523f7376b..376c71f3ef 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -548,9 +548,6 @@ jobs: x64: buildConfiguration: 'Fuzzing' buildPlatform: 'x64' - x86: - buildConfiguration: 'Fuzzing' - buildPlatform: 'x86' variables: buildOutDir: $(Build.SourcesDirectory)\src\$(buildPlatform)\$(buildConfiguration) From 22fba89b98c218f81bfeeedf29e38dc3afba6734 Mon Sep 17 00:00:00 2001 From: JohnMcPMS Date: Mon, 26 Feb 2024 10:02:54 -0800 Subject: [PATCH 12/13] Make SQLite wrapper more resilient (#4196) We are seeing some errors from the SQLite usage that appear to largely be related to contention and the `FAIL_FAST` behavior for savepoint errors. This change is attempting to address the issue by making contention less impactful and moving away from `FAIL_FAST`. ## Change - Adds a busy timeout to SQLite connections by default and provides a method to change the value if callers desire. This should prevent small contentions from causing errors. - Moves from using `FAIL_FAST` on critical errors to simply "closing" the connection, making it non-functional for standard use. - No longer requests this failure behavior for savepoint commit errors; the rollback can handle that if needed. --- .../Shared/Strings/en-us/winget.resw | 7 +- src/AppInstallerCLITests/SQLiteWrapper.cpp | 84 ++++++++++++++++ src/AppInstallerSharedLib/Errors.cpp | 1 + .../Public/AppInstallerErrors.h | 1 + .../Public/winget/SQLiteWrapper.h | 40 +++++++- src/AppInstallerSharedLib/SQLiteWrapper.cpp | 97 ++++++++++++++----- 6 files changed, 198 insertions(+), 32 deletions(-) diff --git a/src/AppInstallerCLIPackage/Shared/Strings/en-us/winget.resw b/src/AppInstallerCLIPackage/Shared/Strings/en-us/winget.resw index 041a541a1b..eba36a6e48 100644 --- a/src/AppInstallerCLIPackage/Shared/Strings/en-us/winget.resw +++ b/src/AppInstallerCLIPackage/Shared/Strings/en-us/winget.resw @@ -2804,14 +2804,17 @@ Please specify one of them using the --source option to proceed. The installer technology in use does not support repair. - + The package installed for user scope cannot be repaired when running with administrator privileges. Repair operations involving administrator privileges are not permitted on packages installed within the user scope. - + Repair failed with exit code: {0} {Locked="{0}"} Error message displayed when an attempt to repair an application package fails. {0} is a placeholder replaced by an error code. + + The SQLite connection was terminated to prevent corruption. + \ No newline at end of file diff --git a/src/AppInstallerCLITests/SQLiteWrapper.cpp b/src/AppInstallerCLITests/SQLiteWrapper.cpp index d2ee2c2b76..bc597e19b7 100644 --- a/src/AppInstallerCLITests/SQLiteWrapper.cpp +++ b/src/AppInstallerCLITests/SQLiteWrapper.cpp @@ -312,6 +312,90 @@ TEST_CASE("SQLiteWrapper_PrepareFailure", "[sqlitewrapper]") REQUIRE_THROWS_HR(builder.Prepare(connection), MAKE_HRESULT(SEVERITY_ERROR, FACILITY_SQLITE, SQLITE_ERROR)); } +TEST_CASE("SQLiteWrapper_BusyTimeout_None", "[sqlitewrapper]") +{ + TestCommon::TempFile tempFile{ "repolibtest_tempdb"s, ".db"s }; + INFO("Using temporary file named: " << tempFile.GetPath()); + + wil::unique_event busy, done; + busy.create(); + done.create(); + + std::thread busyThread([&]() + { + Connection threadConnection = Connection::Create(tempFile, Connection::OpenDisposition::Create); + Statement threadStatement = Statement::Create(threadConnection, "BEGIN EXCLUSIVE TRANSACTION"); + threadStatement.Execute(); + busy.SetEvent(); + done.wait(500); + }); + busyThread.detach(); + + busy.wait(500); + + Connection testConnection = Connection::Create(tempFile, Connection::OpenDisposition::ReadWrite); + testConnection.SetBusyTimeout(0ms); + Statement testStatement = Statement::Create(testConnection, "BEGIN EXCLUSIVE TRANSACTION"); + REQUIRE_THROWS_HR(testStatement.Execute(), MAKE_HRESULT(SEVERITY_ERROR, FACILITY_SQLITE, SQLITE_BUSY)); + + done.SetEvent(); +} + +TEST_CASE("SQLiteWrapper_BusyTimeout_Some", "[sqlitewrapper]") +{ + TestCommon::TempFile tempFile{ "repolibtest_tempdb"s, ".db"s }; + INFO("Using temporary file named: " << tempFile.GetPath()); + + wil::unique_event busy, ready, done; + busy.create(); + ready.create(); + done.create(); + + std::thread busyThread([&]() + { + Connection threadConnection = Connection::Create(tempFile, Connection::OpenDisposition::Create); + Statement threadBeginStatement = Statement::Create(threadConnection, "BEGIN EXCLUSIVE TRANSACTION"); + Statement threadCommitStatement = Statement::Create(threadConnection, "COMMIT"); + threadBeginStatement.Execute(); + busy.SetEvent(); + ready.wait(500); + done.wait(100); + threadCommitStatement.Execute(); + }); + busyThread.detach(); + + busy.wait(500); + + Connection testConnection = Connection::Create(tempFile, Connection::OpenDisposition::ReadWrite); + testConnection.SetBusyTimeout(500ms); + Statement testStatement = Statement::Create(testConnection, "BEGIN EXCLUSIVE TRANSACTION"); + ready.SetEvent(); + testStatement.Execute(); + + done.SetEvent(); +} + +TEST_CASE("SQLiteWrapper_CloseConnectionOnError", "[sqlitewrapper]") +{ + Connection connection = Connection::Create(SQLITE_MEMORY_DB_CONNECTION_TARGET, Connection::OpenDisposition::Create); + + Builder::StatementBuilder builder; + builder.CreateTable(s_tableName).Columns({ + Builder::ColumnBuilder(s_firstColumn, Builder::Type::Int), + Builder::ColumnBuilder(s_secondColumn, Builder::Type::Text), + }); + + Statement createTable = builder.Prepare(connection); + REQUIRE_FALSE(createTable.Step()); + REQUIRE(createTable.GetState() == Statement::State::Completed); + + createTable.Reset(); + REQUIRE_THROWS(createTable.Step(true)); + + // Do anything that needs the connection + REQUIRE_THROWS_HR(connection.GetLastInsertRowID(), APPINSTALLER_CLI_ERROR_SQLITE_CONNECTION_TERMINATED); +} + TEST_CASE("SQLBuilder_SimpleSelectBind", "[sqlbuilder]") { Connection connection = Connection::Create(SQLITE_MEMORY_DB_CONNECTION_TARGET, Connection::OpenDisposition::Create); diff --git a/src/AppInstallerSharedLib/Errors.cpp b/src/AppInstallerSharedLib/Errors.cpp index 70707ede34..1cfa20e909 100644 --- a/src/AppInstallerSharedLib/Errors.cpp +++ b/src/AppInstallerSharedLib/Errors.cpp @@ -213,6 +213,7 @@ namespace AppInstaller WINGET_HRESULT_INFO(APPINSTALLER_CLI_ERROR_EXEC_REPAIR_FAILED, "Repair operation failed."), WINGET_HRESULT_INFO(APPINSTALLER_CLI_ERROR_REPAIR_NOT_SUPPORTED, "The installer technology in use doesn't support repair."), WINGET_HRESULT_INFO(APPINSTALLER_CLI_ERROR_ADMIN_CONTEXT_REPAIR_PROHIBITED, "Repair operations involving administrator privileges are not permitted on packages installed within the user scope."), + WINGET_HRESULT_INFO(APPINSTALLER_CLI_ERROR_SQLITE_CONNECTION_TERMINATED, "The SQLite connection was terminated to prevent corruption."), // Install errors. WINGET_HRESULT_INFO(APPINSTALLER_CLI_ERROR_INSTALL_PACKAGE_IN_USE, "Application is currently running. Exit the application then try again."), diff --git a/src/AppInstallerSharedLib/Public/AppInstallerErrors.h b/src/AppInstallerSharedLib/Public/AppInstallerErrors.h index 06ca30cecb..d8fc1c51b8 100644 --- a/src/AppInstallerSharedLib/Public/AppInstallerErrors.h +++ b/src/AppInstallerSharedLib/Public/AppInstallerErrors.h @@ -143,6 +143,7 @@ #define APPINSTALLER_CLI_ERROR_EXEC_REPAIR_FAILED ((HRESULT)0x8A15007B) #define APPINSTALLER_CLI_ERROR_REPAIR_NOT_SUPPORTED ((HRESULT)0x8A15007C) #define APPINSTALLER_CLI_ERROR_ADMIN_CONTEXT_REPAIR_PROHIBITED ((HRESULT)0x8A15007D) +#define APPINSTALLER_CLI_ERROR_SQLITE_CONNECTION_TERMINATED ((HRESULT)0x8A15007E) // Install errors. #define APPINSTALLER_CLI_ERROR_INSTALL_PACKAGE_IN_USE ((HRESULT)0x8A150101) diff --git a/src/AppInstallerSharedLib/Public/winget/SQLiteWrapper.h b/src/AppInstallerSharedLib/Public/winget/SQLiteWrapper.h index 68182182e3..a5f966347d 100644 --- a/src/AppInstallerSharedLib/Public/winget/SQLiteWrapper.h +++ b/src/AppInstallerSharedLib/Public/winget/SQLiteWrapper.h @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -125,6 +126,23 @@ namespace AppInstaller::SQLite template using ParameterSpecifics = ParameterSpecificsImpl>; + + // Allows the connection to be shared so that it can be closed in some circumstances. + struct SharedConnection + { + // Disables the connection, causing an exception to be thrown by `get`. + void Disable(); + + // Gets the connection object if active. + sqlite3* Get() const; + + // Gets the connection object for creation. + sqlite3** GetPtr(); + + private: + std::atomic_bool m_active = true; + wil::unique_any m_dbconn; + }; } // A SQLite exception. @@ -133,9 +151,13 @@ namespace AppInstaller::SQLite SQLiteException(int error) : wil::ResultException(MAKE_HRESULT(SEVERITY_ERROR, FACILITY_SQLITE, error)) {} }; + struct Statement; + // The connection to a database. struct Connection { + friend Statement; + // The disposition for opening a database connection. enum class OpenDisposition : int { @@ -180,13 +202,20 @@ namespace AppInstaller::SQLite //. Gets the (fixed but arbitrary) identifier for this connection. size_t GetID() const; - operator sqlite3* () const { return m_dbconn.get(); } + // Sets the busy timeout for the connection. + void SetBusyTimeout(std::chrono::milliseconds timeout); + + operator sqlite3* () const { return m_dbconn->Get(); } + + protected: + // Gets the shared connection. + std::shared_ptr GetSharedConnection() const; private: Connection(const std::string& target, OpenDisposition disposition, OpenFlags flags); size_t m_id = 0; - wil::unique_any m_dbconn; + std::shared_ptr m_dbconn; }; // A SQL statement. @@ -234,10 +263,10 @@ namespace AppInstaller::SQLite // Evaluate the statement; either retrieving the next row or executing some action. // Returns true if there is a row of data, or false if there is none. // This return value is the equivalent of 'GetState() == State::HasRow' after calling Step. - bool Step(bool failFastOnError = false); + bool Step(bool closeConnectionOnError = false); // Equivalent to Step, but does not ever expect a result, throwing if one is retrieved. - void Execute(bool failFastOnError = false); + void Execute(bool closeConnectionOnError = false); // Gets a boolean value that indicates whether the specified column value is null in the current row. // The index is 0 based. @@ -282,6 +311,7 @@ namespace AppInstaller::SQLite return std::make_tuple(details::ParameterSpecifics::GetColumn(m_stmt.get(), I)...); } + std::shared_ptr m_dbconn; size_t m_connectionId = 0; size_t m_id = 0; wil::unique_any m_stmt; @@ -303,7 +333,7 @@ namespace AppInstaller::SQLite ~Savepoint(); // Rolls back the Savepoint. - void Rollback(); + void Rollback(bool throwOnError = true); // Commits the Savepoint. void Commit(); diff --git a/src/AppInstallerSharedLib/SQLiteWrapper.cpp b/src/AppInstallerSharedLib/SQLiteWrapper.cpp index 5ddc36137f..8af16ca09b 100644 --- a/src/AppInstallerSharedLib/SQLiteWrapper.cpp +++ b/src/AppInstallerSharedLib/SQLiteWrapper.cpp @@ -7,6 +7,7 @@ #include +using namespace std::chrono_literals; using namespace std::string_view_literals; // Enable this to have all Statement constructions output the associated query plan. @@ -16,11 +17,14 @@ using namespace std::string_view_literals; #include #endif +// Connection is used twice +#define SQLITE_ERROR_MSG(_error_,_connection_) (_connection_ ? sqlite3_errmsg(_connection_) : sqlite3_errstr(_error_)) + #define THROW_SQLITE(_error_,_connection_) \ do { \ int _ts_sqliteReturnValue = (_error_); \ sqlite3* _ts_sqliteConnection = (_connection_); \ - THROW_EXCEPTION_MSG(SQLiteException(_ts_sqliteReturnValue), "%hs", _ts_sqliteConnection ? sqlite3_errmsg(_ts_sqliteConnection) : sqlite3_errstr(_ts_sqliteReturnValue)); \ + THROW_EXCEPTION_MSG(SQLiteException(_ts_sqliteReturnValue), "%hs", SQLITE_ERROR_MSG(_ts_sqliteReturnValue, _ts_sqliteConnection)); \ } while (0,0) #define THROW_IF_SQLITE_FAILED(_statement_,_connection_) \ @@ -144,22 +148,40 @@ namespace AppInstaller::SQLite return {}; } } + + void SharedConnection::Disable() + { + m_active = false; + } + + sqlite3* SharedConnection::Get() const + { + THROW_HR_IF(APPINSTALLER_CLI_ERROR_SQLITE_CONNECTION_TERMINATED, !m_active.load()); + return m_dbconn.get(); + } + + sqlite3** SharedConnection::GetPtr() + { + return &m_dbconn; + } } Connection::Connection(const std::string& target, OpenDisposition disposition, OpenFlags flags) { + m_dbconn = std::make_shared(); m_id = GetNextConnectionId(); AICLI_LOG(SQL, Info, << "Opening SQLite connection #" << m_id << ": '" << target << "' [" << std::hex << static_cast(disposition) << ", " << std::hex << static_cast(flags) << "]"); // Always force connection serialization until we determine that there are situations where it is not needed int resultingFlags = static_cast(disposition) | static_cast(flags) | SQLITE_OPEN_FULLMUTEX; - THROW_IF_SQLITE_FAILED(sqlite3_open_v2(target.c_str(), &m_dbconn, resultingFlags, nullptr), nullptr); + THROW_IF_SQLITE_FAILED(sqlite3_open_v2(target.c_str(), m_dbconn->GetPtr(), resultingFlags, nullptr), nullptr); } Connection Connection::Create(const std::string& target, OpenDisposition disposition, OpenFlags flags) { Connection result{ target, disposition, flags }; - - THROW_IF_SQLITE_FAILED(sqlite3_extended_result_codes(result.m_dbconn.get(), 1), result.m_dbconn.get()); + + THROW_IF_SQLITE_FAILED(sqlite3_extended_result_codes(result.m_dbconn->Get(), 1), result.m_dbconn->Get()); + result.SetBusyTimeout(250ms); return result; } @@ -167,17 +189,17 @@ namespace AppInstaller::SQLite void Connection::EnableICU() { AICLI_LOG(SQL, Verbose, << "Enabling ICU"); - THROW_IF_SQLITE_FAILED(sqlite3IcuInit(m_dbconn.get()), m_dbconn.get()); + THROW_IF_SQLITE_FAILED(sqlite3IcuInit(m_dbconn->Get()), m_dbconn->Get()); } rowid_t Connection::GetLastInsertRowID() { - return sqlite3_last_insert_rowid(m_dbconn.get()); + return sqlite3_last_insert_rowid(m_dbconn->Get()); } int Connection::GetChanges() const { - return sqlite3_changes(m_dbconn.get()); + return sqlite3_changes(m_dbconn->Get()); } size_t Connection::GetID() const @@ -185,8 +207,19 @@ namespace AppInstaller::SQLite return m_id; } + void Connection::SetBusyTimeout(std::chrono::milliseconds timeout) + { + THROW_IF_SQLITE_FAILED(sqlite3_busy_timeout(m_dbconn->Get(), static_cast(timeout.count())), m_dbconn->Get()); + } + + std::shared_ptr Connection::GetSharedConnection() const + { + return m_dbconn; + } + Statement::Statement(const Connection& connection, std::string_view sql) { + m_dbconn = connection.GetSharedConnection(); m_connectionId = connection.GetID(); m_id = GetNextStatementId(); AICLI_LOG(SQL, Verbose, << "Preparing statement #" << m_connectionId << '-' << m_id << ": " << sql); @@ -253,7 +286,7 @@ namespace AppInstaller::SQLite return { connection, sql }; } - bool Statement::Step(bool failFastOnError) + bool Statement::Step(bool closeConnectionOnError) { AICLI_LOG(SQL, Verbose, << "Stepping statement #" << m_connectionId << '-' << m_id); int result = sqlite3_step(m_stmt.get()); @@ -273,20 +306,19 @@ namespace AppInstaller::SQLite else { m_state = State::Error; - if (failFastOnError) - { - FAIL_FAST_MSG("Critical SQL statement failed"); - } - else + + if (closeConnectionOnError) { - THROW_SQLITE(result, sqlite3_db_handle(m_stmt.get())); + m_dbconn->Disable(); } + + THROW_SQLITE(result, sqlite3_db_handle(m_stmt.get())); } } - void Statement::Execute(bool failFastOnError) + void Statement::Execute(bool closeConnectionOnError) { - THROW_HR_IF(E_UNEXPECTED, Step(failFastOnError)); + THROW_HR_IF(E_UNEXPECTED, Step(closeConnectionOnError)); } bool Statement::GetColumnIsNull(int column) @@ -323,20 +355,35 @@ namespace AppInstaller::SQLite Savepoint::~Savepoint() { - Rollback(); + // Prevent a termination by not throwing on errors here + Rollback(false); } - void Savepoint::Rollback() + void Savepoint::Rollback(bool throwOnError) { if (m_inProgress) { - AICLI_LOG(SQL, Verbose, << "Roll back savepoint: " << m_name); - m_rollbackTo.Step(true); - // 'ROLLBACK TO' *DOES NOT* remove the savepoint from the transaction stack. - // In order to remove it, we must RELEASE. Since we just invoked a ROLLBACK TO - // this should have the effect of 'committing' nothing. - m_release.Step(true); + // Only try rollback once m_inProgress = false; + + try + { + AICLI_LOG(SQL, Verbose, << "Roll back savepoint: " << m_name); + m_rollbackTo.Step(true); + // 'ROLLBACK TO' *DOES NOT* remove the savepoint from the transaction stack. + // In order to remove it, we must RELEASE. Since we just invoked a ROLLBACK TO + // this should have the effect of 'committing' nothing. + m_release.Step(true); + } + catch (...) + { + if (throwOnError) + { + throw; + } + + LOG_CAUGHT_EXCEPTION(); + } } } @@ -345,7 +392,7 @@ namespace AppInstaller::SQLite if (m_inProgress) { AICLI_LOG(SQL, Verbose, << "Commit savepoint: " << m_name); - m_release.Step(true); + m_release.Step(); m_inProgress = false; } } From 3ec75aee18de9355ff48a89d8ec2731aeb76fa50 Mon Sep 17 00:00:00 2001 From: Ryan <69221034+ryfu-msft@users.noreply.github.com> Date: Mon, 26 Feb 2024 10:09:42 -0800 Subject: [PATCH 13/13] Pull in latest localized strings (#4202) --- .../Policies/de-DE/DesktopAppInstaller.adml | 10 +- .../Policies/es-ES/DesktopAppInstaller.adml | 12 +- .../Policies/fr-FR/DesktopAppInstaller.adml | 12 +- .../Policies/it-IT/DesktopAppInstaller.adml | 12 +- .../Policies/ja-JP/DesktopAppInstaller.adml | 12 +- .../Policies/ko-KR/DesktopAppInstaller.adml | 12 +- .../Policies/pt-BR/DesktopAppInstaller.adml | 12 +- .../Policies/ru-RU/DesktopAppInstaller.adml | 12 +- .../Policies/zh-CN/DesktopAppInstaller.adml | 12 +- .../Policies/zh-TW/DesktopAppInstaller.adml | 12 +- Localization/Resources/de-DE/winget.resw | 764 +++++++++++++++++- Localization/Resources/es-ES/winget.resw | 764 +++++++++++++++++- Localization/Resources/fr-FR/winget.resw | 764 +++++++++++++++++- Localization/Resources/it-IT/winget.resw | 764 +++++++++++++++++- Localization/Resources/ja-JP/winget.resw | 764 +++++++++++++++++- Localization/Resources/ko-KR/winget.resw | 764 +++++++++++++++++- Localization/Resources/pt-BR/winget.resw | 764 +++++++++++++++++- Localization/Resources/ru-RU/winget.resw | 764 +++++++++++++++++- Localization/Resources/zh-CN/winget.resw | 764 +++++++++++++++++- Localization/Resources/zh-TW/winget.resw | 764 +++++++++++++++++- 20 files changed, 7609 insertions(+), 149 deletions(-) diff --git a/Localization/Policies/de-DE/DesktopAppInstaller.adml b/Localization/Policies/de-DE/DesktopAppInstaller.adml index f22b6b9668..5d364881aa 100644 --- a/Localization/Policies/de-DE/DesktopAppInstaller.adml +++ b/Localization/Policies/de-DE/DesktopAppInstaller.adml @@ -68,9 +68,9 @@ Wenn Sie diese Einstellung aktivieren, ist die Microsoft Store-Quelle für den W Wenn Sie diese Einstellung deaktivieren, ist die Microsoft Store-Quelle für den Windows-Paket-Manager nicht verfügbar. Intervall für automatische Aktualisierung der App-Installer-Quelle in Minuten festlegen - Diese Richt Linie steuert das Intervall für die automatische Aktualisierung für Paket basierte Quellen. + Diese Richtlinie steuert das Intervall für die automatische Aktualisierung paketbasierter Quellen. Die Standardquelle für Windows-Paket-Manager ist so konfiguriert, dass ein Index der Pakete auf dem lokalen Computer zwischengespeichert wird. Der Index wird heruntergeladen, wenn ein Benutzer einen Befehl aufruft und das Intervall abgelaufen ist. -Wenn Sie diese Einstellung deaktivieren oder nicht konfigurieren, wird das Standard Intervall oder der in den Einstellungen angegebene Wert vom Windows-Paket-Manager verwendet. +Wenn Sie diese Einstellung deaktivieren oder nicht konfigurieren, wird das Standardintervall oder der in den Windows-Paket-Manager Einstellungen angegebene Wert verwendet. Wenn Sie diese Einstellung aktivieren, wird die angegebene Anzahl von Minuten vom Windows-Paket-Manager verwendet. Zusätzliche Quellen für den App-Installer aktivieren @@ -103,6 +103,12 @@ Wenn Sie diese Einstellung deaktivieren oder nicht konfigurieren, können Benutz Wenn Sie diese Richtlinie aktivieren oder nicht konfigurieren, können Benutzer die Windows Package Manager CLI-Befehle und PowerShell-Cmdlets ausführen. (Vorausgesetzt, die Richtlinie "App-Installationsprogramm aktivieren" ist nicht deaktiviert). Diese Richtlinie hat keinen Einfluss auf die Richtlinie "App-Installationsprogramm aktivieren". + Aktivieren der Windows-Paket-Manager-Konfiguration + Diese Richtlinie steuert, ob das Windows-Paket-Manager Konfigurationsfeature von Benutzern verwendet werden kann. + +Wenn Sie diese Einstellung aktivieren oder nicht konfigurieren, können Benutzer das Konfigurationsfeature Windows-Paket-Manager verwenden. + +Wenn Sie diese Einstellung deaktivieren, können Benutzer das Konfigurationsfeature Windows-Paket-Manager nicht verwenden. diff --git a/Localization/Policies/es-ES/DesktopAppInstaller.adml b/Localization/Policies/es-ES/DesktopAppInstaller.adml index 138e17c671..10e34ed19d 100644 --- a/Localization/Policies/es-ES/DesktopAppInstaller.adml +++ b/Localization/Policies/es-ES/DesktopAppInstaller.adml @@ -68,11 +68,11 @@ Si habilita esta configuración, el origen de Microsoft Store para el Administra Si desactiva esta configuración, el origen de la Tienda Microsoft para el Administrador de paquetes de Windows no estará disponible. Establecer el intervalo de actualización automática de la fuente del instalador de aplicaciones en minutos - Esta directiva controla el intervalo de actualización automática de los orígenes basados en paquetes. + Esta directiva controla el intervalo de actualización automática para orígenes basados en paquetes. El origen predeterminado para Administrador de paquetes de Windows está configurado de forma que un índice de los paquetes se almacena en caché en el equipo local. El índice se descarga cuando un usuario invoca un comando y el intervalo ha pasado. -Si deshabilitas o no estableces esta configuración, el administrador de paquetes de Windows usará el valor del intervalo predeterminado o el valor especificado en la configuración. +Si deshabilita o no establece esta configuración, se usará el intervalo predeterminado o el valor especificado en la configuración de Administrador de paquetes de Windows. -Si habilitas esta configuración, el administrador de paquetes de Windows usará el número de minutos especificado. +Si habilita esta configuración, el Administrador de paquetes de Windows usará el número de minutos especificado. Habilitar orígenes adicionales del instalador de aplicaciones Esta directiva controla los orígenes adicionales proporcionados por el administrador de TI de la empresa. @@ -103,6 +103,12 @@ Si deshabilita esta directiva, los usuarios no podrán ejecutar la CLI de Admini Si habilita o no configura esta directiva, los usuarios podrán ejecutar los comandos de la CLI de Administrador de paquetes de Windows y los cmdlets de PowerShell. (La directiva "Habilitar Instalador de aplicación" proporcionada no está deshabilitada). Esta directiva no invalida la directiva "Habilitar Instalador de aplicación". + Habilitar configuración de Administrador de paquetes de Windows + Esta directiva controla si los usuarios pueden usar la característica de configuración Administrador de paquetes de Windows. + +Si habilita o no establece esta configuración, los usuarios podrán usar la característica de configuración Administrador de paquetes de Windows. + +Si deshabilita esta configuración, los usuarios no podrán usar la característica de configuración Administrador de paquetes de Windows. diff --git a/Localization/Policies/fr-FR/DesktopAppInstaller.adml b/Localization/Policies/fr-FR/DesktopAppInstaller.adml index 82374139c8..5d57ffaee3 100644 --- a/Localization/Policies/fr-FR/DesktopAppInstaller.adml +++ b/Localization/Policies/fr-FR/DesktopAppInstaller.adml @@ -68,11 +68,11 @@ Si vous activez ce paramètre, la source du Microsoft Store pour le Gestionnaire Si vous désactivez ce paramètre, la source du Microsoft Store pour le Gestionnaire de package Windows n’est pas disponible. Définir l’intervalle en minutes de mise à jour automatique de source du programme d’installation de l’application - Cette stratégie contrôle l’intervalle de mise à jour automatique pour les sources basées sur un package. + Cette stratégie contrôle l’intervalle de mise à jour automatique pour les sources basées sur les packages. La source par défaut de Gestionnaire de package Windows est configurée de sorte qu’un index des packages soit mis en cache sur l’ordinateur local. L’index est téléchargé lorsqu’un utilisateur appelle une commande et que l’intervalle est écoulé. -Si vous désactivez ou ne configurez pas ce paramètre, l’intervalle par défaut ou la valeur spécifiée dans les paramètres est utilisé par le gestionnaire de packages Windows. +Si vous désactivez ou ne configurez pas ce paramètre, l’intervalle par défaut ou la valeur spécifié dans les paramètres de Gestionnaire de package Windows sont utilisés. -Si vous activez ce paramètre, le nombre de minutes spécifiées est utilisé par le gestionnaire de packages Windows. +Si vous activez ce paramètre, le nombre de minutes spécifié est utilisé par le Gestionnaire de package Windows. Activer les sources supplémentaires du Programme d’installation de l’application Cette stratégie contrôle les sources supplémentaires offertes par l’administrateur informatique de l’entreprise. @@ -103,6 +103,12 @@ Si vous désactivez cette stratégie, les utilisateurs ne peuvent pas exécuter Si vous activez ou ne configurez pas cette stratégie, les utilisateurs peuvent exécuter les commandes Gestionnaire de package Windows CLI et PowerShell. (La stratégie « Activer Programme d'installation d'application » fournie n’est pas désactivée). Cette stratégie ne remplace pas la stratégie « Activer Programme d'installation d'application ». + Activer la configuration Gestionnaire de package Windows + Cette stratégie contrôle si la fonctionnalité de configuration Gestionnaire de package Windows peut être utilisée par les utilisateurs. + +Si vous activez ou ne configurez pas ce paramètre, les utilisateurs peuvent utiliser la fonctionnalité de configuration Gestionnaire de package Windows. + +Si vous désactivez ce paramètre, les utilisateurs ne peuvent pas utiliser la fonctionnalité de configuration Gestionnaire de package Windows. diff --git a/Localization/Policies/it-IT/DesktopAppInstaller.adml b/Localization/Policies/it-IT/DesktopAppInstaller.adml index ffdb7f9c96..651a595444 100644 --- a/Localization/Policies/it-IT/DesktopAppInstaller.adml +++ b/Localization/Policies/it-IT/DesktopAppInstaller.adml @@ -68,11 +68,11 @@ Se si abilita questa impostazione, l'origine Microsoft Store per Windows Gestion Se si disabilita questa impostazione, l'origine Microsoft Store per Windows Gestione pacchetti non sarà disponibile. Imposta l'intervallo di aggiornamento automatico dell'origine del programma di installazione app in minuti - Questo criterio Controlla l'intervallo di aggiornamento automatico per le origini basate sul pacchetto. + Questo criterio controlla l'intervallo di aggiornamento automatico per le origini basate su pacchetto. L'origine predefinita per Gestione pacchetti Windows è configurata in modo che un indice dei pacchetti venga memorizzato nella cache nel computer locale. L'indice viene scaricato quando un utente richiama un comando e l'intervallo è passato. -Se si disabilita o non si configura questa impostazione, l'intervallo predefinito o il valore specificato nelle impostazioni verranno utilizzati da Windows Gestione pacchetti. +Se si disabilita o non si configura questa impostazione, verrà utilizzato l'intervallo predefinito o il valore specificato nelle impostazioni Gestione pacchetti Windows. -Se si abilita questa impostazione, il numero di minuti specificato verrà utilizzato da Windows Gestione pacchetti. +Se si abilita questa impostazione, il numero di minuti specificato verrà utilizzato dal Gestione pacchetti Windows. Abilita altre origini del programma di installazione app Questo criterio controlla le origini aggiuntive fornite dall'amministratore IT dell'organizzazione. @@ -103,6 +103,12 @@ Se disabiliti questo criterio, gli utenti non potranno eseguire l'interfaccia de Se abiliti o non configuri questo criterio, gli utenti potranno eseguire i comandi dell'interfaccia della riga di comando Gestione pacchetti Windows e i cmdlet di PowerShell. (Il criterio "Abilita Programma di installazione app" specificato non è disabilitato). Questo criterio non esegue l'override del criterio "Abilita Programma di installazione app". + Abilita la configurazione di Gestione pacchetti + Questo criterio controlla se la funzionalità di configurazione Gestione pacchetti Windows può essere usata dagli utenti. + +Se si abilita o non si configura questa impostazione, gli utenti potranno usare la funzionalità di configurazione Gestione pacchetti Windows. + +Se si disabilita questa impostazione, gli utenti non potranno usare la funzionalità di configurazione Gestione pacchetti Windows. diff --git a/Localization/Policies/ja-JP/DesktopAppInstaller.adml b/Localization/Policies/ja-JP/DesktopAppInstaller.adml index 8988ae1869..1c78c6d37a 100644 --- a/Localization/Policies/ja-JP/DesktopAppInstaller.adml +++ b/Localization/Policies/ja-JP/DesktopAppInstaller.adml @@ -68,11 +68,11 @@ この設定を無効にした場合、Windows パッケージマ ネージャーの Microsoft Store ソースは利用できなくなります。 アプリ インストーラー ソースの自動更新間隔を分単位で設定します - このポリシーでは、パッケージベースのソースの自動更新間隔を制御します。 + このポリシーは、パッケージ ベースのソースの自動更新間隔を制御します。Windows パッケージ マネージャーの既定のソースは、パッケージのインデックスがローカル コンピューターにキャッシュされるように構成されています。インデックスは、ユーザーがコマンドを呼び出し、間隔が過ぎたときにダウンロードされます。 -この設定を無効にした場合、または構成しなかった場合は、Windows パッケージマネージャーによって [設定] で指定した既定の間隔または値が使用されます。 +この設定を無効にした場合、または構成しなかった場合は、既定の間隔またはWindows パッケージ マネージャー設定で指定された値が使用されます。 -この設定を有効にした場合、指定した分数が Windows パッケージマネージャーによって使用されます。 +この設定を有効にした場合、指定した分数がWindows パッケージ マネージャーで使用されます。 アプリ インストーラーの追加ソースを有効にする このポリシーは、エンタープライズIT管理者によって提供される追加のソースを制御します。 @@ -103,6 +103,12 @@ このポリシーを有効にした場合、または構成しなかった場合、ユーザーは Windows パッケージ マネージャー CLI コマンドと PowerShell コマンドレットを実行できます ([アプリ インストーラーを有効にする] ポリシーが無効になっている場合に限る)。 このポリシーは、[アプリ インストーラーを有効にする] ポリシーをオーバーライドしません。 + Windows パッケージ マネージャーの構成を有効にする + このポリシーでは、Windows パッケージ マネージャー構成機能をユーザーが使用できるかどうかを制御します。 + +この設定を有効にした場合、または構成しなかった場合、ユーザーはWindows パッケージ マネージャー構成機能を使用できます。 + +この設定を無効にすると、ユーザーはWindows パッケージ マネージャー構成機能を使用できなくなります。 diff --git a/Localization/Policies/ko-KR/DesktopAppInstaller.adml b/Localization/Policies/ko-KR/DesktopAppInstaller.adml index 57735b08f0..86d724317b 100644 --- a/Localization/Policies/ko-KR/DesktopAppInstaller.adml +++ b/Localization/Policies/ko-KR/DesktopAppInstaller.adml @@ -68,11 +68,11 @@ 이 설정을 사용 중지하면 Windows 패키지 관리자용 Microsoft 스토어 원본을 사용할 수 없습니다. 앱 설치 관리자 원본 자동 업데이트 간격(분) 설정 - 이 정책은 패키지 기반 원본의 자동 업데이트 간격을 제어합니다. + 이 정책은 패키지 기반 원본의 자동 업데이트 간격을 제어합니다. 패키지의 인덱스가 로컬 컴퓨터에 캐시되도록 Windows 패키지 관리자 기본 원본이 구성됩니다. 사용자가 명령을 호출하고 간격이 지나면 인덱스가 다운로드됩니다. -이 설정을 사용하지 않거나 구성하지 않으면 기본 간격이나 설정에 지정된 값이 Windows 패키지 관리자가 사용됩니다. +이 설정을 사용하지 않거나 구성하지 않으면 Windows 패키지 관리자 설정에 지정된 기본 간격 또는 값이 사용됩니다. -이 설정을 사용하면 Windows 패키지 관리자에서 지정한 시간(분)이 사용됩니다. +이 설정을 사용하면 지정한 시간(분)이 Windows 패키지 관리자 사용됩니다. 앱 설치 관리자 추가 원본 사용 이 정책은 엔터프라이즈 IT 관리자가 제공하는 추가 원본을 제어합니다. @@ -103,6 +103,12 @@ 이 정책을 활성화하거나 구성하지 않으면 사용자는 Windows 패키지 관리자 CLI 명령 및 PowerShell cmdlet을 실행할 수 있습니다. ('앱 설치 프로그램 활성화' 정책이 비활성화되지 않은 경우). 이 정책은 '앱 설치 프로그램 활성화' 정책보다 우선 적용되지 않습니다. + Windows 패키지 관리자 구성 사용 + 이 정책은 사용자가 Windows 패키지 관리자 구성 기능을 사용할 수 있는지 여부를 제어합니다. + +이 설정을 사용하거나 구성하지 않으면 사용자가 Windows 패키지 관리자 구성 기능을 사용할 수 있습니다. + +이 설정을 사용하지 않으면 사용자가 Windows 패키지 관리자 구성 기능을 사용할 수 없습니다. diff --git a/Localization/Policies/pt-BR/DesktopAppInstaller.adml b/Localization/Policies/pt-BR/DesktopAppInstaller.adml index 5526461bfa..d6937c092e 100644 --- a/Localization/Policies/pt-BR/DesktopAppInstaller.adml +++ b/Localization/Policies/pt-BR/DesktopAppInstaller.adml @@ -68,11 +68,11 @@ Se você habilitar essa configuração, a fonte da Microsoft Store para o Gerenc Se você desabilitar esta configuração, a fonte da Microsoft Store para o Gerenciador de Pacotes do Windows não estará disponível. Definir o Intervalo de Atualização Automática da Fonte do Instalador de Aplicativo em Minutos - Esta política controla o intervalo de atualização automática para origens baseadas em pacote. + Esta política controla o intervalo de atualização automática para origens baseadas em pacote. A fonte padrão para Gerenciador de Pacotes do Windows é configurada de modo que um índice dos pacotes seja armazenado em cache no computador local. O índice é baixado quando um usuário invoca um comando e o intervalo é passado. -Se você desabilitar ou não definir essa configuração, o intervalo padrão ou o valor especificado em configurações serão usados pelo Gerenciador de pacotes do Windows. +Se você desabilitar ou não definir essa configuração, o intervalo padrão ou o valor especificado na Gerenciador de Pacotes do Windows configurações serão usadas. -Se você habilitar essa configuração, o número de minutos especificado será usado pelo Gerenciador de pacotes do Windows. +Se você habilitar essa configuração, o número de minutos especificado será usado pelo Gerenciador de Pacotes do Windows. Habilitar as Fontes Adicionais do Instalador de Aplicativos Esta política controla as fontes adicionais fornecidas pelo administrador de TI da empresa. @@ -103,6 +103,12 @@ Se você desabilitar essa política, os usuários não poderão executar o Geren Se você habilitar ou não configurar essa política, os usuários poderão executar os comandos Gerenciador de Pacotes do Windows CLI e os cmdlets do PowerShell. (A política "Habilitar Instalador de Aplicativo" fornecida não está desabilitada). Esta política não substitui a política "Habilitar Instalador de Aplicativo". + Habilitar as Configurações do Gerenciador de Pacotes do Windows + Esta política controla se o Gerenciador de Pacotes do Windows de configuração pode ser usado pelos usuários. + +Se você habilitar ou não definir essa configuração, os usuários poderão usar o recurso Gerenciador de Pacotes do Windows configuração. + +Se você desabilitar essa configuração, os usuários não poderão usar o recurso Gerenciador de Pacotes do Windows configuração. diff --git a/Localization/Policies/ru-RU/DesktopAppInstaller.adml b/Localization/Policies/ru-RU/DesktopAppInstaller.adml index a7c05553b3..70fa7ceb00 100644 --- a/Localization/Policies/ru-RU/DesktopAppInstaller.adml +++ b/Localization/Policies/ru-RU/DesktopAppInstaller.adml @@ -68,11 +68,11 @@ Если отключить этот параметр, источник Microsoft Store для Диспетчера пакетов Windows будет недоступен. Задать интервал автоматического обновления источника Установщика приложений в минутах - Эта политика управляет интервалом автоматического обновления пакетных источников. + Эта политика управляет интервалом автоматического обновления для источников на основе пакетов. Источник по умолчанию для Диспетчера пакетов Windows настроен таким образом, что индекс пакетов кэшируется на локальном компьютере. Индекс скачивается при вызове команды пользователем и завершении интервала. -Если отключить или не настроить этот параметр, в Диспетчере пакетов Windows будет использоваться интервал по умолчанию или значение, заданное в параметрах. +Если этот параметр отключен или не настроен, будет использоваться интервал по умолчанию или значение, указанное в параметрах Диспетчера пакетов Windows. -Если включить этот параметр, в Диспетчере пакетов Windows будет использоваться указанное число минут. +Если этот параметр включен, указанное число минут будет использоваться Диспетчером пакетов Windows. Включить дополнительные источники Установщика приложений Эта политика управляет дополнительными источниками, предоставленными ИТ-администратором предприятия. @@ -103,6 +103,12 @@ Если эта политика включена или не настроена, пользователи смогут выполнять команды CLI Диспетчера пакетов Windows и командлеты PowerShell. (Указанная политика "Включить установщик приложений" не отключена.) Эта политика не переопределяет политику "Включить установщик приложений". + Включить конфигурацию Диспетчера пакетов Windows + Эта политика определяет, Диспетчер пакетов Windows ли пользователи могут использовать эту Диспетчер пакетов Windows конфигурацию. + +Если этот параметр включен или не настроен, пользователи смогут использовать Диспетчер пакетов Windows конфигурации. + +Если этот параметр отключен, пользователи не смогут использовать Диспетчер пакетов Windows конфигурации. diff --git a/Localization/Policies/zh-CN/DesktopAppInstaller.adml b/Localization/Policies/zh-CN/DesktopAppInstaller.adml index f86c0a0e94..a19d7e4a5d 100644 --- a/Localization/Policies/zh-CN/DesktopAppInstaller.adml +++ b/Localization/Policies/zh-CN/DesktopAppInstaller.adml @@ -68,11 +68,11 @@ 如果禁用此设置,Windows 程序包管理器的 Microsoft Store 源将不可用。 设置应用安装程序源自动更新间隔(分钟) - 此策略控制基于程序包的源的自动更新间隔。 + 此策略控制基于程序包的源的自动更新间隔。配置Windows 程序包管理器的默认源,以便在本地计算机上缓存包索引。当用户调用命令并且间隔已过时,将下载索引。 -如果禁用或未配置此设置,则 Windows 程序包管理器将使用在 "设置" 中指定的默认间隔或值。 +如果禁用或未配置此设置,将使用Windows 程序包管理器设置中指定的默认间隔或值。 -如果启用此设置,则 Windows 程序包管理器将使用指定的分钟数。 +如果启用此设置,则Windows 程序包管理器将使用指定的分钟数。 启用应用安装程序其他源 此策略控制企业 IT 管理员提供的其他源。 @@ -103,6 +103,12 @@ 如果启用或未配置此策略,用户将能够执行 Windows 程序包管理器 CLI 命令和 PowerShell cmdlet。(未禁用提供的“启用应用安装程序”策略)。 此策略不会替代“启用应用安装程序”策略。 + 启用 Windows 程序包管理器配置 + 此策略控制用户是否可以使用Windows 程序包管理器配置功能。 + +如果启用或未配置此设置,则用户将能够使用Windows 程序包管理器配置功能。 + +如果禁用此设置,则用户将无法使用Windows 程序包管理器配置功能。 diff --git a/Localization/Policies/zh-TW/DesktopAppInstaller.adml b/Localization/Policies/zh-TW/DesktopAppInstaller.adml index 264cda03de..d02f21dd54 100644 --- a/Localization/Policies/zh-TW/DesktopAppInstaller.adml +++ b/Localization/Policies/zh-TW/DesktopAppInstaller.adml @@ -68,11 +68,11 @@ 如果您停用此設定,Windows 封裝管理員的 Microsoft Store 來源將無法使用。 設定應用程式安裝程式來源自動更新間隔 (分鐘) - 此原則可控制套件型來源的自動更新間隔。 + 此原則控制封裝型來源的自動更新間隔時間。Windows 封裝管理員的預設來源設定為本機電腦上快取的套件索引。當使用者調用命令且間隔已過時,下載索引。 -如果停用或未設定此設定,Windows 套件管理員將使用 [設定] 中指定的預設間隔或值。 +如果您停用或不設定此設定,將會使用 Windows 封裝管理員設定中指定的預設間隔或值。 -如果您啟用這個設定,Windows 套件管理員將使用指定的分鐘數。 +如果您啟用此設定,Windows 封裝管理員將會使用指定的分鐘數。 啟用應用程式安裝程式其他來源 此原則控制企業 IT 系統管理員提供的其他來源。 @@ -103,6 +103,12 @@ 如果您啟用或未設定此原則,使用者將可以執行 Windows 封裝管理員 CLI 命令和 PowerShell Cmdlet。(提供的 [啟用應用程式安裝程式] 原則將不會停用)。 此原則不會覆寫 [啟用應用程式安裝程式] 原則。 + 啟用 Windows 封裝管理員設定 + 此原則控制使用者是否可以使用Windows 封裝管理員設定功能。 + +如果您啟用或未設定這個設定,使用者將可以使用Windows 封裝管理員設定功能。 + +如果您停用這個設定,使用者將無法使用Windows 封裝管理員設定功能。 diff --git a/Localization/Resources/de-DE/winget.resw b/Localization/Resources/de-DE/winget.resw index 699e76ab6e..83c24393a6 100644 --- a/Localization/Resources/de-DE/winget.resw +++ b/Localization/Resources/de-DE/winget.resw @@ -261,6 +261,9 @@ Sie können über die Einstellungsdatei „winget settings“ konfiguriert werde Ergebnisse nach ID filtern + + Unterdrückt Warnungsausgaben. + Diese Anwendung wird von ihrem Besitzer an Sie lizenziert. @@ -871,8 +874,8 @@ Sie können über die Einstellungsdatei „winget settings“ konfiguriert werde In der JSON-Datei ist kein bekanntes Schema angegeben. - Installationsbereich auswählen (Benutzer oder Computer) - This argument allows the user to select between installing for just the user or for the entire machine. + Installationsbereich auswählen (user oder machine) + {Locked="user","machine"} This argument allows the user to select between installing for just the user or for the entire machine. Der für das Argument `{0}` angegebene Wert ist ungültig. Gültige Werte sind: {1} @@ -1018,8 +1021,8 @@ Die Konfiguration ist aufgrund der Gruppenrichtlinie deaktiviert. Dependency graph has loop - Für manifest: {0} {1} wurde kein passendes Installationsprogramm gefunden. - {Locked="{0} {1}"} Error message displayed when an attempt to get a preferred installer for a manifest fails. {0} is a placeholder replaced by the manifest identifier. {1} is a placeholder replaced by the manifest version. + Für das Manifest wurde kein geeigneter Installer gefunden: {0} Version {1} + {Locked="{0}","{1}"} Error message displayed when an attempt to get a preferred installer for a manifest fails. {0} is a placeholder replaced by the manifest identifier. {1} is a placeholder replaced by the manifest version. Fehler beim Verarbeiten der Paketabhängigkeiten. Möchten Sie die Installation fortsetzen? @@ -1611,8 +1614,8 @@ Geben Sie eine Option für --source an, um den Vorgang fortzusetzen. Die Einstellungsdatei konnte nicht geladen werden. Standardwerte werden verwendet. - Bereichsfilter für das installierte Paket auswählen (Benutzer oder Computer) - This argument allows the user to select installed packages for just the user or for the entire machine. + Bereichsfilter für das installierte Paket auswählen (user oder machine) + {Locked="user","machine"} This argument allows the user to select installed packages for just the user or for the entire machine. Pin erfolgreich hinzugefügt @@ -1697,6 +1700,9 @@ Geben Sie eine Option für --source an, um den Vorgang fortzusetzen. {0} Pakete verfügen über einen Pin, der vor dem Upgrade entfernt werden muss {Locked="{0}"} {0} is a placeholder that is replaced by an integer number of packages with pins that prevent upgrade + + Das Paket kann nicht mit winget aktualisiert werden. Verwenden Sie die vom Herausgeber bereitgestellte Methode zum Aktualisieren dieses Pakets. + Aktualisieren von Paketen auch dann, wenn sie über einen nicht blockierenden Pin verfügen @@ -1832,13 +1838,13 @@ Geben Sie eine Option für --source an, um den Vorgang fortzusetzen. {Locked="--force"} - {0} [{1}] wird aktiviert... - {Locked="{0}","{1}"} Message displayed to the user regarding which Windows Feature is being enabled. + [{0}] wird aktiviert... + {Locked="{0}"} Message displayed to the user regarding which Windows Feature is being enabled. - Fehler beim Aktivieren {0} [{1}]-Features. - {Locked="{0}"} Windows Feature display name -{Locked="{1}"} Windows Feature name + Fehler beim Aktivieren des [{0}]-Features: {1} + {Locked="{0}","{1}"} An error when enabling a Windows Feature. {0} is a placeholder for the name of the Windows Feature. +{1} is a placeholder for the unrecognized error code. Ein Neustart ist erforderlich, um das/die Windows-Feature(s) vollständig zu aktivieren; wird aufgrund von --force durchgeführt @@ -2068,10 +2074,744 @@ Geben Sie eine Option für --source an, um den Vorgang fortzusetzen. Gibt den Speicherort auf dem lokalen Computer zum Speichern von Modulen an. Standard %LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules - {Locked="allusers","currentuser","default","%LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules"} + {Locked="%LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules"} Der Wert "--module-path" muss "currentuser", "allusers", "default" oder ein absoluter Pfad sein. {Locked="{--module-path}, {currentuser}, {allusers}, {default}} + + Aktivieren der Windows-Paket-Manager-Konfiguration + + + Hiermit werden Informationen zu Fehlern abgerufen. Bei Angabe einer Zahl enthält die Ausgabe Details zum Fehler, einschließlich des Symbolnamens, wenn es sich um einen wingetspezifischen Fehler handelt. Bei Angabe einer Zeichenfolge werden die wingetspezifischen Fehler nach diesem Wert durchsucht. + + + Informationen zu Fehlern abrufen + + + Ein Wert, der in den Fehlerinformationen gesucht werden soll + + + Die angegebene Zahl ist zu groß, um ein HRESULT zu sein. + + + Unbekannter Fehlercode + + + Interner Fehler + + + Ungültige Befehlszeilenargumente + + + Fehler beim Ausführen des Befehls + + + Fehler beim Öffnen des Manifests + + + Abbruchsignal empfangen + + + Fehler beim Ausführen von ShellExecute + + + Das Manifest kann nicht verarbeitet werden. Die Manifestversion ist höher als unterstützt. Aktualisieren Sie den Client. + + + Fehler beim Herunterladen des Installationsprogramms + + + In index kann nicht geschrieben werden; es sich um eine höhere Schemaversion handelt. + + + Der Index ist beschädigt + + + Die konfigurierten Quellinformationen sind fehlerhaft + + + Der Quellname ist bereits konfiguriert + + + Der Quelltyp ist ungültig + + + Die MSIX-Datei ist ein Bündel, kein Paket + + + Von der Quelle benötigte Daten fehlen + + + Keines der Installationsprogramme ist für das aktuelle System anwendbar. + + + Der Hash der Installationsprogrammdatei stimmt nicht mit dem Manifest überein + + + Der Quellname ist nicht vorhanden + + + Der Quellspeicherort ist bereits unter einem anderen Namen konfiguriert. + + + Es wurden keine Pakete gefunden + + + Es sind keine Quellen konfiguriert + + + Es wurden mehrere Pakete gefunden, die den Kriterien entsprechen + + + Es wurde kein Manifest gefunden, das den Kriterien entspricht + + + Fehler beim Abrufen des öffentlichen Ordners aus dem Quellpaket + + + Zum Ausführen des Befehls sind Administratorrechte erforderlich + + + Der Quellspeicherort ist nicht sicher + + + Der Microsoft Store Client wird durch eine Richtlinie blockiert + + + Die Microsoft Store-App wird durch eine Richtlinie blockiert + + + Das Feature befindet sich zurzeit in der Entwicklung. Sie kann mithilfe von Wingeteinstellungen aktiviert werden. + + + Fehler beim Installieren der Microsoft Store-App + + + Fehler beim Ausführen der automatischen Vervollständigung + + + Fehler beim Initialisieren des XML-Parsers + + + Es wurde ein ungültiger YAML-Schlüssel gefunden + + + Es wurde ein doppelter YAML-Schlüssel gefunden + + + Ungültiger YAML-Vorgang + + + Fehler beim Erstellen des YAML-Dokuments + + + Ungültiger YAML-Senderzustand + + + Ungültige YAML-Daten + + + LibYAML-Fehler + + + Die Manifestüberprüfung war mit Warnung erfolgreich + + + Fehler bei der Manifestüberprüfung + + + Das Manifest ist ungültig + + + Es wurden keine anwendbaren Aktualisierungen gefunden + + + winget-Upgrade – vollständig mit Fehlern abgeschlossen + + + Installationsprogramm hat Sicherheitsprüfung nicht bestanden + + + Die Downloadgröße stimmt nicht mit der erwarteten Inhaltslänge überein + + + Der Deinstallationsbefehl wurde nicht gefunden + + + Fehler beim Ausführen des Deinstallationsbefehls + + + ICU-Unterbrechungsiteratorfehler + + + ICU-Fallzuordnungsfehler + + + ICU-RegEx-Fehler + + + Fehler beim Installieren mindestens eines importierten Pakets. + + + Mindestens ein angefordertes Paket wurde nicht gefunden. + + + Die JSON-Datei ist ungültig + + + Der Quellspeicherort ist nicht remote + + + Die konfigurierte REST-Quelle wird nicht unterstützt. + + + Von der REST-Quelle wurden ungültige Daten zurückgegeben + + + Der Vorgang wird durch Gruppenrichtlinie blockiert + + + Interner Fehler der REST-Quelle + + + Ungültige REST-Quell-URL + + + Von der REST-Quelle wird ein nicht unterstützter MIME-Typ zurückgegeben + + + Ungültige Version des REST-Quellvertrags + + + Die Quelldaten sind beschädigt oder manipuliert. + + + Fehler beim Lesen aus dem Datenstrom. + + + Paketvereinbarungen wurden nicht vereinbart + + + Fehler beim Lesen der Eingabe in der Eingabeaufforderung + + + Die Suchanforderung wird von mindestens einer Quelle nicht unterstützt. + + + Der REST-Quellendpunkt wurde nicht gefunden. + + + Fehler beim Öffnen der Quelle. + + + Quellvereinbarungen wurde nicht zugestimmt + + + Die Headergröße überschreitet den zulässigen Grenzwert von 1024 Zeichen. Verringern Sie die Größe, und versuchen Sie es noch mal. + + + Fehlende Ressourcendatei + + + Fehler beim Ausführen der MSI-Installation + + + Argumente für msiexec sind ungültig + + + Fehler beim Öffnen einer oder mehrerer Quellen + + + Fehler beim Überprüfen von Abhängigkeiten + + + Mindestens ein Paket fehlt + + + Ungültige Tabellenspalte + + + Die Upgradeversion ist nicht neuer als die installierte Version. + + + Die Upgradeversion ist unbekannt, und es wurde keine Außerkraftsetzung angegeben + + + ICU-Konvertierungsfehler + + + Fehler beim Installieren des portierbaren Pakets + + + Das Volume unterstützt keine Analysepunkte + + + Ein portierbares Paket aus einer anderen Quelle ist bereits vorhanden. + + + Symlink kann nicht erstellt werden, Der Pfad verweist auf ein Verzeichnis. + + + Das Installationsprogramm kann nicht in einem Administratorkontext ausgeführt werden. + + + Fehler beim Deinstallieren des portierbaren Pakets + + + Fehler beim Überprüfen der DisplayVersion-Werte anhand des Indexes. + + + Mindestens ein Argument wird nicht unterstützt. + + + Eingebettete Null-Zeichen sind für SQLite nicht zulässig + + + Fehler beim Suchen des geschachtelten Installationsprogramms im Archiv. + + + Fehler beim Extrahieren des Archivs. + + + Es wurde ein ungültiger relativer Dateipfad zum geschachtelten Installationsprogramm angegeben. + + + Das Serverzertifikat stimmte mit keinem der erwarteten Werte überein. + + + Der Installationsspeicherort muss angegeben werden. + + + Archiv-Malware-Scan fehlgeschlagen. + + + Es wurde mindestens eine Version des installierten Pakets gefunden. + + + Für das Paket ist bereits eine PIN vorhanden. + + + Für das Paket ist keine PIN vorhanden. + + + Die PIN-Datenbank kann nicht geöffnet werden. + + + Mindestens eine Anwendung konnte nicht installiert werden + + + Mindestens eine Anwendung konnte nicht deinstalliert werden + + + Mindestens eine Abfrage hat nicht genau eine Übereinstimmung zurückgegeben. + + + Das Paket verfügt über eine PIN, die ein Upgrade verhindert. + + + Das derzeit installierte Paket ist das Stubpaket + + + Signal zum Herunterfahren der Anwendung empfangen + + + Fehler beim Herunterladen von Paketabhängigkeiten. + + + Fehler beim Herunterladen des Pakets. Das Herunterladen für die Offlineinstallation ist nicht zulässig. + + + Ein erforderlicher Dienst ist ausgelastet oder nicht verfügbar. Versuchen Sie es später noch einmal. + + + Die angegebene GUID entspricht keinem gültigen Fortsetzungszustand. + + + Die aktuelle Clientversion stimmte nicht mit der Clientversion des gespeicherten Zustands überein. + + + Die Daten zum Fortsetzungszustand sind ungültig. + + + Die Prüfpunktdatenbank kann nicht geöffnet werden. + + + Das maximale Fortsetzungslimit wurde überschritten. + + + Ungültige Authentifizierungsinformationen. + + + Authentifizierungsmethode nicht unterstützt. + + + Fehler bei der Authentifizierung. + + + Fehler bei der Authentifizierung. Interaktive Authentifizierung erforderlich. + + + Fehler bei der Authentifizierung. Abbruch durch Benutzer. + + + Fehler bei der Authentifizierung. Das authentifizierte Konto ist nicht das gewünschte Konto. + + + Die Anwendung wird zurzeit ausgeführt. Beenden Sie die Anwendung, und versuchen Sie es noch mal. + + + Es wird bereits eine andere Installation ausgeführt. Versuchen Sie es später noch mal. + + + Mindestens eine Datei wird verwendet. Beenden Sie die Anwendung, und versuchen Sie es noch mal. + + + Für dieses Paket fehlt eine Abhängigkeit im System. + + + Auf Ihrem PC ist kein Speicherplatz mehr vorhanden. Geben Sie Speicherplatz frei, und versuchen Sie es noch mal. + + + Es ist nicht genügend Arbeitsspeicher für die Installation verfügbar. Schließen Sie andere Anwendungen, und wiederholen Sie dann den Vorgang. + + + Diese Anwendung erfordert Internetkonnektivität. Stellen Sie eine Netzwerkverbindung her, und versuchen Sie es noch mal. + + + Bei dieser Anwendung ist während der Installation ein Fehler aufgetreten. Wenden Sie sich an den Support. + + + Starten Sie den PC neu, um die Installation abzuschließen. + + + Fehler bei der Installation. Starten Sie Ihren PC neu, und versuchen Sie es noch mal. + + + Ihr PC wird neu gestartet, um die Installation abzuschließen. + + + Sie haben die Installation abgebrochen. + + + Eine andere Version dieser Anwendung ist bereits installiert. + + + Eine höhere Version dieser Anwendung ist bereits installiert. + + + Die Installation wird durch Organisationsrichtlinien verhindert. Wenden Sie sich an Ihren Administrator. + + + Fehler beim Installieren der Paketabhängigkeiten. + + + Die Anwendung wird zurzeit von einer anderen Anwendung verwendet. + + + Unzulässiger Parameter. + + + Das Paket wird vom System nicht unterstützt. + + + Das Upgrade eines vorhandenen Pakets wird vom Installationsprogramm nicht unterstützt. + + + Der Eintrag "Apps und Features" für das Paket wurde nicht gefunden. + + + Der Installationsspeicherort ist nicht anwendbar. + + + Der Installationsspeicherort wurde nicht gefunden. + + + Der Hash der vorhandenen Datei stimmte nicht überein. + + + Datei nicht gefunden. + + + Die Datei wurde gefunden, aber der Hash wurde nicht überprüft. + + + Auf die Datei konnte nicht zugegriffen werden. + + + Die Konfigurationsdatei ist ungültig. + + + Die YAML-Syntax ist ungültig. + + + Ein Konfigurationsfeld weist einen ungültigen Typ auf. + + + Die Konfiguration weist eine unbekannte Version auf. + + + Fehler beim Anwenden der Konfiguration. + + + Die Konfiguration enthält einen doppelten Bezeichner. + + + In der Konfiguration fehlt eine Abhängigkeit. + + + Die Konfiguration weist eine nicht erfüllte Abhängigkeit auf. + + + Fehler bei einer Assertion für die Konfigurationseinheit. + + + Die Konfiguration wurde manuell übersprungen. + + + Der Benutzer hat die Fortsetzung der Ausführung abgelehnt. + + + Die Abhängigkeitsdiagramm enthält einen Zyklus, der nicht aufgelöst werden kann. + + + Die Konfiguration weist einen ungültigen Feldwert auf. + + + In der Konfiguration fehlt ein Feld. + + + Einige der Konfigurationseinheiten fielen beim Testen ihres Zustands aus. + + + Der Konfigurationsstatus wurde nicht getestet. + + + Die Konfigurationseinheit wurde nicht installiert. + + + Die Konfigurationseinheit wurde nicht gefunden. + + + Für die Konfigurationseinheit wurden mehrere Übereinstimmungen gefunden. geben Sie das Modul an, um das richtige auszuwählen. + + + Fehler der Konfigurationseinheit beim Abrufen des aktuellen Systemstatus. + + + Fehler bei der Konfigurationseinheit beim Versuch, den aktuellen Systemstatus zu testen. + + + Fehler bei der Konfigurationseinheit beim Anwenden des gewünschten Zustands. + + + Das Modul für die Konfigurationseinheit ist an mehreren Speicherorten mit derselben Version verfügbar. + + + Fehler beim Laden des Moduls für die Konfigurationseinheit. + + + Die Konfigurationseinheit hat während der Ausführung ein unerwartetes Ergebnis zurückgegeben. + + + Eine Einheit enthält eine Einstellung, die den Konfigurationsstamm erfordert. + + + Der Vorgang wird vom Konfigurationsprozessor nicht unterstützt. + + + Nicht verfügbar + + + Windows-Featureabhängigkeiten erfolgreich aktiviert + + + Fehler beim Laden des Moduls für die Konfigurationseinheit, da für die Ausführung Administratorrechte erforderlich sind. + + + Eine Einheit enthält eine Einstellung, die den Konfigurationsstamm erfordert. + + + Fehler beim Laden des Moduls für die Konfigurationseinheit, da für die Ausführung Administratorrechte erforderlich sind. + + + Setzt die Ausführung eines zuvor gespeicherten Befehls fort, indem der eindeutige Bezeichner des gespeicherten Befehls übergeben wird. Wird verwendet, um einen ausgeführten Befehl fortzusetzen, der möglicherweise aufgrund eines Neustarts beendet wurde. + + + Setzt die Ausführung eines zuvor gespeicherten Befehls fort. + + + Der eindeutige Bezeichner des gespeicherten Zustands, der fortgesetzt werden soll + + + Das Fortsetzen des Status von einer anderen Clientversion wird nicht unterstützt: {0} + {Locked= "{0}"} Message displayed to inform the user that the client version of the resume state does not match the current client version. {0} is a placeholder for the client version that created the resume state. + + + Der Fortsetzungszustand ist nicht vorhanden: {0} + {Locked="{0}" Error message displayed when the user provides a guid that does not correspond to a valid saved state. {0} is a placeholder replaced by the provided guid string. + + + Im Fortsetzungszustand wurden keine Daten gefunden. + + + Dieser Befehl unterstützt das Fortsetzen nicht. + + + Ermöglicht ggf. einen Neustart + + + Der Neustart zum Abschließen des Vorgangs wird initiiert... + + + Fehler beim Initiieren eines Neustarts. + + + Der Fortsetzungsvorgang überschreitet das zulässige Limit von {0} Fortsetzungen. Führen Sie den Befehl "{1}" aus, um den Vorgang manuell fortzusetzen. + {Locked="{0}", "{1}"} {0} is a placeholder that is replaced by an integer number of the number of allowed resumes. {1} is a placeholder for the command to run to perform a manual resume. + + + Grenzwert beim Fortsetzen eines gespeicherten Zustands ignorieren + + + Das URI-Schema wird nicht unterstützt: {0} + {Locked="{0}"} Error message displayed when the provided uri is not supported. {0} is a placeholder replaced by the provided uri. + + + URI nicht wohlgeformt: {0} + {Locked="{0}"} Error message displayed when the provided uri is not well formed. {0} is a placeholder replaced by the provided uri. + + + Fehler beim Analysieren {0} Inhalt der Konfigurationseinheitseinstellungen, oder der Einstellungsinhalt ist leer. + {Locked="{0}"} {0} is a placeholder replaced by the input winget configure resource unit type. + + + {0} Konfigurationseinheit fehlt das erforderliche Argument: {1} + {Locked="{0},{1}"} {0} is a placeholder for the input winget configure resource unit type. {1} is placeholder for the missing arg. + + + {0} Konfigurationseinheit fehlt das empfohlene Argument: {1} + {Locked="{0},{1}"} {0} is a placeholder for the input winget configure resource unit type. {1} is placeholder for the missing arg. + + + Die WinGetSource-Konfigurationseinheit steht in Konflikt mit einer bekannten Quelle: {0} + {Locked="WinGetSource,{0}"} {0} is a placeholder for the input winget source in the configuration unit settings. + + + Die WinGetSource-Konfigurationseinheit wird für eine Drittanbieterquelle bestätigt: {0} + {Locked="WinGetSource,{0}"} {0} is a placeholder for the input winget source in the configuration unit settings. + + + WinGetPackage deklariert sowohl UseLatest als auch Version. Paket-ID: {0} + {Locked="WinGetPackage,UseLatest,Version,{0}"} + + + Die WinGetPackage-Konfigurationseinheit bestätigt ein Paket aus einer Drittanbieterquelle. Paket-ID: {0}; Quelle: {1} + {Locked="WinGetPackage,{0},{1}"} + + + Das Paket der WinGetPackage-Konfigurationseinheit ist von einer Drittanbieterquelle abhängig, die noch nicht konfiguriert wurde. Paket-ID: {0}; Quelle: {1} + {Locked="WinGetPackage,{0},{1}"} + + + Das Paket der WinGetPackage-Konfigurationseinheit ist von einer Drittanbieterquelle abhängig. Es wird empfohlen, die Abhängigkeit im Abschnitt "uni dependsOn" zu deklarieren. Paket-ID: {0}; Quelle: {1} + {Locked="WinGetPackage,dependsOn,{0},{1}"} + + + Das Paket der WinGetPackage-Konfigurationseinheit kann nicht überprüft werden. Fehler beim Öffnen der Quelle. Paket-ID: {0}; Quelle: {1} + {Locked="WinGetPackage,{0},{1}"} + + + Das Paket der WinGetPackage-Konfigurationseinheit kann nicht überprüft werden. Das Paket wurde nicht gefunden. Paket-ID: {0} + {Locked="WinGetPackage,{0}"} + + + Das Paket der WinGetPackage-Konfigurationseinheit kann nicht überprüft werden. Es wurden mehrere Pakete gefunden. Paket-ID: {0} + {Locked="WinGetPackage,{0}"} + + + Das Paket der WinGetPackage-Konfigurationseinheit kann nicht überprüft werden. Die Paketversion wurde nicht gefunden. Paket-ID: {0}; Version {1} + {Locked="WinGetPackage,{0},{1}"} + + + Das Paket der WinGetPackage-Konfigurationseinheit wurde mit einer bestimmten Version angegeben, es ist jedoch nur eine Paketversion verfügbar. Paket-ID:{0}; Version: {1} + {Locked="WinGetPackage,{0},{1}"} + + + Das Paket der WinGetPackage-Konfigurationseinheit kann nicht überprüft werden. Paket-ID: {0} + {Locked="WinGetPackage,{0}"} + + + Einstellung für Authentifizierungsfenster angeben („silent“, „silentPreferred“ oder „interactive“) + {Locked="silent","silentPreferred","interactive"} This argument allows the user to select authentication window popup behavior. + + + Geben Sie das Konto an, das für die Authentifizierung verwendet werden soll + + + Fehler beim Hinzufügen der Quelle. Diese winget Version unterstützt die Authentifizierungsmethode der Quelle nicht. Führen Sie ein Upgrade auf die neueste winget version durch. + {Locked="winget"} + + + Für die {0} Quelle ist eine Authentifizierung erforderlich. Bei Bedarf wird möglicherweise eine Authentifizierungsaufforderung angezeigt. Authentifizierte Informationen werden für die Zugriffsautorisierung mit der Quelle geteilt. + {Locked="{0}"} + + + Repariert das ausgewählte Paket, entweder durch Durchsuchen der Liste der installierten Pakete oder direkt aus einem Manifest. Standardmäßig muss die Abfrage ohne Berücksichtigung der Groß-/Kleinschreibung mit der ID, dem Namen oder dem Moniker des Pakets übereinstimmen. Andere Felder können verwendet werden, indem sie die entsprechende Option übergeben. + id, name, and moniker are all named values in our context, and may benefit from not being translated. The match must be for any of them, with comparison ignoring case. + + + Repariert das ausgewählte Paket + + + Der Reparaturbefehl für dieses Paket wurde nicht gefunden. Wenden Sie sich an den Paketherausgeber, um Unterstützung zu erfahren. + + + Die verwendete Installertechnologie stimmt nicht mit der derzeit installierten Version überein. + + + Der Reparaturbefehl wurde nicht gefunden. + + + Die verwendete Installationstechnologie unterstützt keine Reparatur. + + + Der Reparaturvorgang wurde erfolgreich abgeschlossen. + + + Reparatur abgebrochen + + + Paketreparatur wird gestartet... + + + Fehler beim Reparieren des Microsoft Store-Pakets. Fehlercode: {0} + {Locked="{0}"} Error message displayed when a Microsoft Store application package fails to repair. {0} is a placeholder replaced by an error code. + + + Fehler beim Reparaturvorgang. + + + Der Reparaturvorgang ist nicht anwendbar. + + + In den konfigurierten Quellen sind keine übereinstimmenden Paketversionen verfügbar. + + + Die Reparatur dieses Pakets wird von der aktuellen Systemkonfiguration nicht unterstützt. + + + Die verwendete Installationstechnologie unterstützt keine Reparatur. + + + Das für den Benutzerbereich installierte Paket kann nicht repariert werden, wenn es mit Administratorrechten ausgeführt wird. + + + Reparaturvorgänge mit Administratorrechten sind für Pakete, die innerhalb des Benutzerbereichs installiert sind, nicht zulässig. + + + Fehler bei der Reparatur mit Exitcode: {0} + {Locked="{0}"} Error message displayed when an attempt to repair an application package fails. {0} is a placeholder replaced by an error code. + \ No newline at end of file diff --git a/Localization/Resources/es-ES/winget.resw b/Localization/Resources/es-ES/winget.resw index 5a8afbc041..6f8ef3268b 100644 --- a/Localization/Resources/es-ES/winget.resw +++ b/Localization/Resources/es-ES/winget.resw @@ -261,6 +261,9 @@ Se pueden configurar mediante el archivo de configuración "winget settings". Filtrar resultados por id + + Suprime las salidas de advertencia. + El propietario de esta aplicación le concede una licencia. @@ -871,8 +874,8 @@ Se pueden configurar mediante el archivo de configuración "winget settings".El archivo JSON no especifica un esquema reconocido. - Seleccione el ámbito de la instalación (usuario o máquina) - This argument allows the user to select between installing for just the user or for the entire machine. + Seleccione el ámbito de la instalación (user o machine) + {Locked="user","machine"} This argument allows the user to select between installing for just the user or for the entire machine. El valor proporcionado para el argumento '{0}' no es válido; los valores válidos son: {1} @@ -1018,8 +1021,8 @@ La configuración está deshabilitada debido a la Directiva de grupo. Dependency graph has loop - No se encontró ningún instalador adecuado para manifest: {0} {1} - {Locked="{0} {1}"} Error message displayed when an attempt to get a preferred installer for a manifest fails. {0} is a placeholder replaced by the manifest identifier. {1} is a placeholder replaced by the manifest version. + No se encontró ningún instalador adecuado para el manifiesto: {0} versión {1} + {Locked="{0}","{1}"} Error message displayed when an attempt to get a preferred installer for a manifest fails. {0} is a placeholder replaced by the manifest identifier. {1} is a placeholder replaced by the manifest version. Error al procesar las dependencias del paquete. ¿Desea continuar con la instalación? @@ -1611,8 +1614,8 @@ Especifique uno de ellos con la opción --source para continuar. No se pudo cargar el archivo de configuración. Se usarán los valores predeterminados. - Seleccionar filtro de ámbito de paquete instalado (usuario o equipo) - This argument allows the user to select installed packages for just the user or for the entire machine. + Seleccionar filtro de ámbito de paquete instalado (user o machine) + {Locked="user","machine"} This argument allows the user to select installed packages for just the user or for the entire machine. Anclaje agregado correctamente @@ -1697,6 +1700,9 @@ Especifique uno de ellos con la opción --source para continuar. {0} paquetes tienen un pin que debe quitarse antes de la actualización {Locked="{0}"} {0} is a placeholder that is replaced by an integer number of packages with pins that prevent upgrade + + No se puede actualizar el paquete con winget. Use el método proporcionado por el publicador para actualizar este paquete. + Actualizar paquetes aunque tengan un PIN que no sea de bloqueo @@ -1832,13 +1838,13 @@ Especifique uno de ellos con la opción --source para continuar. {Locked="--force"} - Habilitando {0} [{1}]... - {Locked="{0}","{1}"} Message displayed to the user regarding which Windows Feature is being enabled. + Habilitando [{0}]... + {Locked="{0}"} Message displayed to the user regarding which Windows Feature is being enabled. - No se ha podido habilitar la función {0} [{1}]. - {Locked="{0}"} Windows Feature display name -{Locked="{1}"} Windows Feature name + No se ha podido habilitar la característica [{0}]: {1} + {Locked="{0}","{1}"} An error when enabling a Windows Feature. {0} is a placeholder for the name of the Windows Feature. +{1} is a placeholder for the unrecognized error code. Es necesario reiniciar para habilitar completamente las características de Windows. continuar debido a --force @@ -2068,10 +2074,744 @@ Especifique uno de ellos con la opción --source para continuar. Especifica la ubicación en el equipo local para almacenar módulos. La predeterminada es %LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules - {Locked="allusers","currentuser","default","%LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules"} + {Locked="%LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules"} El valor de `--module-path allusers` debe ser `currentuser`, `allusers`, `default` o una ruta de acceso absoluta. {Locked="{--module-path}, {currentuser}, {allusers}, {default}} + + Habilitar configuración de Administrador de paquetes de Windows + + + Recuperar información sobre errores. Dado un número, la salida contendrá detalles sobre el error, incluido el nombre del símbolo si se trata de un error específico de WinGet. Dado una cadena, se busca este valor en los errores específicos de WinGet. + + + Obtener información sobre errores + + + Valor para buscar en la información de error + + + El número especificado es demasiado grande para ser HRESULT. + + + Código de error desconocido + + + Error interno + + + Los argumentos de la línea de comandos no son válidos + + + Error al ejecutar el comando + + + Error al abrir el manifiesto + + + Señal de cancelación recibida + + + Error al ejecutar ShellExecute + + + No se puede procesar el manifiesto. La versión del manifiesto es posterior a la admitida. Actualice el cliente. + + + Error al descargar el instalador + + + No se puede escribir en el índice; es una versión de esquema superior + + + El índice está dañado + + + La información de origen configurada está dañada + + + El nombre de origen ya está configurado + + + El tipo de origen no es válido + + + El archivo MSIX es una agrupación, no un paquete + + + Faltan los datos requeridos por el origen + + + Ninguno de los instaladores es aplicable para el sistema actual + + + El hash del archivo del instalador no coincide con el manifiesto + + + El nombre de origen no existe + + + La ubicación de origen ya está configurada con otro nombre + + + No se encontraron paquetes + + + No hay orígenes configurados + + + Se encontraron varios paquetes que coinciden con los criterios + + + No se encontró ningún manifiesto que coincida con los criterios + + + No se pudo obtener la carpeta pública del paquete de origen + + + El comando requiere privilegios de administrador para ejecutarse + + + La ubicación de origen no es segura + + + La directiva bloquea el cliente de Microsoft Store + + + La directiva bloquea la aplicación Microsoft Store + + + La característica está actualmente en desarrollo. Se puede habilitar con la configuración de winget. + + + Error al instalar la aplicación Microsoft Store + + + Error al autocompletar + + + Error al inicializar el analizador YAML + + + Se encontró una clave YAML no válida + + + Se encontró una clave YAML duplicada + + + Operación YAML no válida + + + Error al compilar el documento YAML + + + Estado de emisor YAML no válido + + + Datos YAML no válidos + + + Error de LibYAML + + + Validación del manifiesto correcta con advertencia. + + + Error de validación de manifiesto. + + + El manifiesto no es válido + + + No se encontraron actualizaciones aplicables + + + actualización de WinGet: todas completadas con errores + + + Error en la comprobación de seguridad del instalador + + + El tamaño de descarga no coincide con la longitud de contenido esperada + + + No se encontró el comando de desinstalación + + + Error al ejecutar el comando de desinstalación + + + Error de iterador de interrupción de ICU + + + Error de asignación de caso de ICU + + + Error de regex de ICU + + + No se pudieron instalar uno o varios paquetes importados + + + No se encontraron uno o varios paquetes solicitados + + + El archivo JSON no es válido + + + La ubicación de origen no es remota + + + No se admite el origen REST configurado + + + Datos no válidos devueltos por el origen REST + + + La operación está bloqueada por la directiva de grupo + + + Error interno de origen REST + + + Dirección URL de origen REST no válida + + + Tipo MIME no admitido devuelto por el origen REST + + + Versión del contrato de origen REST no válida + + + Los datos de origen están dañados o manipulados + + + Error al leer de la secuencia + + + No se han aceptado los contratos de paquete + + + Error al leer la entrada en el símbolo del sistema + + + Uno o varios orígenes no admiten la solicitud de búsqueda. + + + No se encuentra el punto de conexión de origen REST. + + + Error al abrir el origen. + + + No se han aceptado los contratos de origen + + + El tamaño del encabezado supera el límite permitido de 1024 caracteres. Reduzca el tamaño e inténtelo de nuevo. + + + Falta el archivo de recursos + + + Error al ejecutar la instalación de MSI + + + Los argumentos de msiexec no son válidos + + + Error al abrir uno o varios orígenes + + + Error al validar las dependencias + + + Falta uno o varios paquetes + + + Columna de tabla no válida + + + La versión de actualización no es más reciente que la versión instalada + + + La versión de actualización es desconocida y no se especificó la invalidación + + + Error de conversión de ICU + + + Error al instalar el paquete portátil + + + El volumen no admite puntos de análisis + + + Ya existe un paquete portátil de otro origen. + + + No se puede crear symlink, la ruta apunta a un directorio. + + + El instalador no se puede ejecutar desde un contexto de administrador. + + + Error al desinstalar el paquete portátil + + + Error al validar los valores de DisplayVersion con el índice. + + + No se admiten uno o varios argumentos. + + + No se permiten caracteres nulos incrustados para SQLite + + + No se pudo encontrar el instalador anidado en el archivo. + + + Error al extraer el archivo. + + + Se proporcionó una ruta de acceso de archivo relativa no válida al instalador anidado. + + + El certificado de servidor no coincide con ninguno de los valores esperados. + + + Debe proporcionarse la ubicación de instalación. + + + Error al analizar el malware de archivo. + + + Se encontró al menos una versión del paquete instalada. + + + Ya existe un pin para el paquete. + + + No hay ningún pin para el paquete. + + + No se puede abrir la base de datos del pin. + + + Error al instalar una o varias aplicaciones + + + Error al desinstalar una o varias aplicaciones + + + Una o varias consultas no devolvieron exactamente una coincidencia + + + El paquete tiene un PIN que impide la actualización. + + + El paquete instalado actualmente es el paquete de código auxiliar + + + Señal de apagado de la aplicación recibida + + + Error al descargar las dependencias del paquete. + + + No se pudo descargar el paquete. La descarga para la instalación sin conexión está prohibida. + + + Un servicio necesario está ocupado o no está disponible. Vuelve a intentarlo más tarde. + + + El GUID proporcionado no corresponde a un estado de reanudación válido. + + + La versión del cliente actual no coincide con la versión del cliente del estado guardado. + + + Los datos de estado de reanudación no son válidos. + + + No se puede abrir la base de datos de punto de control. + + + Se superó el límite máximo de reanudación. + + + Información de autenticación no válida. + + + Método de autenticación no permitido. + + + Error de autenticación. + + + Error de autenticación. Se requiere autenticación interactiva. + + + Error de autenticación. Cancelado por el usuario. + + + Error de autenticación. La cuenta autenticada no es la cuenta deseada. + + + La aplicación se está ejecutando actualmente. Salga de la aplicación e inténtelo de nuevo. + + + Ya hay otra instalación en curso. Inténtelo de nuevo más tarde. + + + Se está usando uno o varios archivos. Salga de la aplicación e inténtelo de nuevo. + + + Falta una dependencia de este paquete en el sistema. + + + No hay más espacio en el equipo. Haga espacio e inténtelo de nuevo. + + + No hay suficiente memoria disponible para instalar. Cierre otras aplicaciones e inténtelo de nuevo. + + + Esta aplicación requiere conectividad a Internet. Conéctese a una red e inténtelo de nuevo. + + + Esta aplicación encontró un error durante la instalación. Póngase en contacto con el soporte técnico. + + + Reinicie el equipo para finalizar la instalación. + + + Error en la instalación. Reinicia el equipo e inténtalo de nuevo. + + + El equipo se reiniciará para finalizar la instalación. + + + Ha cancelado la instalación. + + + Ya hay otra versión de esta aplicación instalada. + + + Ya hay instalada una versión posterior de esta aplicación. + + + Las directivas de la organización impiden la instalación. Póngase en contacto con su administrador. + + + Error al instalar las dependencias de paquetes. + + + Otra aplicación está usando actualmente la aplicación. + + + Parámetro no válido. + + + Paquete no compatible con el sistema. + + + El instalador no admite la actualización de un paquete existente. + + + No se encontró la entrada de aplicaciones y características para el paquete. + + + La ubicación de instalación no es aplicable. + + + No se encontró la ubicación de instalación. + + + El hash del archivo existente no coincide. + + + Archivo no encontrado. + + + Se encontró el archivo, pero no se comprobó el hash. + + + No se pudo tener acceso al archivo. + + + El archivo de configuración no es válido. + + + La sintaxis YAML no es válida. + + + Un campo de configuración tiene un tipo no válido. + + + La configuración tiene una versión desconocida. + + + Error al aplicar la configuración. + + + La configuración contiene un identificador duplicado. + + + Falta una dependencia en la configuración. + + + La configuración tiene una dependencia no atendida. + + + Error en una aserción para la unidad de configuración. + + + La configuración se omitió manualmente. + + + El usuario rechazó continuar la ejecución. + + + El gráfico de dependencias contiene un ciclo que no se puede resolver. + + + La configuración tiene un valor de campo no válido. + + + Falta un campo en la configuración. + + + Error de algunas unidades de configuración al probar su estado. + + + No se probó el estado de configuración. + + + No se instaló la unidad de configuración. + + + No se encontró la unidad de configuración. + + + Se encontraron varias coincidencias para la unidad de configuración; especifique el módulo para seleccionar el correcto. + + + Error de la unidad de configuración al intentar obtener el estado actual del sistema. + + + Error de la unidad de configuración al intentar probar el estado actual del sistema. + + + Error de la unidad de configuración al intentar aplicar el estado deseado. + + + El módulo de la unidad de configuración está disponible en varias ubicaciones con la misma versión. + + + Error al cargar el módulo para la unidad de configuración. + + + La unidad de configuración devolvió un resultado inesperado durante la ejecución. + + + Una unidad contiene una configuración que requiere la raíz de configuración. + + + El procesador de configuración no admite la operación. + + + No disponible + + + Dependencias de características de Windows habilitadas correctamente + + + Error al cargar el módulo para la unidad de configuración porque requiere privilegios de administrador para ejecutarse. + + + Una unidad contiene una configuración que requiere la raíz de configuración. + + + Error al cargar el módulo para la unidad de configuración porque requiere privilegios de administrador para ejecutarse. + + + Reanuda la ejecución de un comando guardado anteriormente pasando el identificador único del comando guardado. Se usa para reanudar un comando ejecutado que puede haberse terminado debido a un reinicio. + + + Reanuda la ejecución de un comando guardado previamente. + + + Identificador único del estado guardado que se va a reanudar + + + No se admite la reanudación del estado desde una versión de cliente diferente: {0} + {Locked= "{0}"} Message displayed to inform the user that the client version of the resume state does not match the current client version. {0} is a placeholder for the client version that created the resume state. + + + El estado de reanudación no existe: {0} + {Locked="{0}" Error message displayed when the user provides a guid that does not correspond to a valid saved state. {0} is a placeholder replaced by the provided guid string. + + + No se encontraron datos en el estado de reanudación. + + + Este comando no admite la reanudación. + + + Permite un reinicio si procede + + + Iniciando reinicio para completar la operación... + + + Error al iniciar un reinicio. + + + La operación de reanudación supera el límite permitido de reanudaciones {0}. Para reanudar manualmente, ejecute el comando '{1}'. + {Locked="{0}", "{1}"} {0} is a placeholder that is replaced by an integer number of the number of allowed resumes. {1} is a placeholder for the command to run to perform a manual resume. + + + Omitir el límite de reanudación de un estado guardado + + + Esquema URI no admitido: {0} + {Locked="{0}"} Error message displayed when the provided uri is not supported. {0} is a placeholder replaced by the provided uri. + + + URI no bien formado: {0} + {Locked="{0}"} Error message displayed when the provided uri is not well formed. {0} is a placeholder replaced by the provided uri. + + + No se pudo analizar {0} contenido de configuración de la unidad de configuración o el contenido de configuración está vacío. + {Locked="{0}"} {0} is a placeholder replaced by the input winget configure resource unit type. + + + {0} unidad de configuración no tiene el argumento necesario: {1} + {Locked="{0},{1}"} {0} is a placeholder for the input winget configure resource unit type. {1} is placeholder for the missing arg. + + + {0} unidad de configuración no tiene el argumento recomendado: {1} + {Locked="{0},{1}"} {0} is a placeholder for the input winget configure resource unit type. {1} is placeholder for the missing arg. + + + La unidad de configuración de WinGetSource está en conflicto con un origen conocido: {0} + {Locked="WinGetSource,{0}"} {0} is a placeholder for the input winget source in the configuration unit settings. + + + La unidad de configuración de WinGetSource aserciones en un origen de terceros: {0} + {Locked="WinGetSource,{0}"} {0} is a placeholder for the input winget source in the configuration unit settings. + + + WinGetPackage declara UseLatest y Version. Id. de paquete: {0} + {Locked="WinGetPackage,UseLatest,Version,{0}"} + + + La unidad de configuración WinGetPackage aserciones en un paquete de origen de terceros. Id. de paquete: {0}; Origen: {1} + {Locked="WinGetPackage,{0},{1}"} + + + El paquete de la unidad de configuración WinGetPackage depende de un origen de terceros no configurado previamente. Id. de paquete: {0}; Origen: {1} + {Locked="WinGetPackage,{0},{1}"} + + + El paquete de unidad de configuración de WinGetPackage depende de un origen de terceros. Se recomienda declarar la dependencia en la sección uni dependsOn. Id. de paquete: {0}; Origen: {1} + {Locked="WinGetPackage,dependsOn,{0},{1}"} + + + No se puede validar el paquete de la unidad de configuración de WinGetPackage. Error al abrir el origen. Id. de paquete: {0}; Origen: {1} + {Locked="WinGetPackage,{0},{1}"} + + + No se puede validar el paquete de la unidad de configuración de WinGetPackage. No se encontró el paquete. Id. de paquete: {0} + {Locked="WinGetPackage,{0}"} + + + No se puede validar el paquete de la unidad de configuración de WinGetPackage. Se encontró más de un paquete. Id. de paquete: {0} + {Locked="WinGetPackage,{0}"} + + + No se puede validar el paquete de la unidad de configuración de WinGetPackage. No se encontró la versión del paquete. Id. de paquete: {0}; Versión {1} + {Locked="WinGetPackage,{0},{1}"} + + + Paquete de unidad de configuración WinGetPackage especificado con una versión específica mientras que sólo una versión del paquete está disponible. Id. de paquete: {0}; Versión: {1} + {Locked="WinGetPackage,{0},{1}"} + + + No se puede validar el paquete de la unidad de configuración de WinGetPackage. Id. de paquete: {0} + {Locked="WinGetPackage,{0}"} + + + Especificar la preferencia de ventana de autenticación (silent, silentPreferred o interactive) + {Locked="silent","silentPreferred","interactive"} This argument allows the user to select authentication window popup behavior. + + + Especifique la cuenta que se usará para la autenticación + + + No se pudo agregar el origen. Esta versión de winget no admite el método de autenticación del origen. Intente actualizar a la versión de winget más reciente. + {Locked="winget"} + + + El origen de {0} requiere autenticación. La solicitud de autenticación puede aparecer cuando sea necesario. La información autenticada se compartirá con el origen para la autorización de acceso. + {Locked="{0}"} + + + Repara el paquete seleccionado, encontrado al buscar en una lista de paquetes instalados o bien, directamente desde un manifiesto. De forma predeterminada, la consulta debe coincidir con el id, nombre o el moniker del paquete sin distinguir entre mayúsculas y minúsculas. Se pueden usar otros campos usando la opción apropiada. + id, name, and moniker are all named values in our context, and may benefit from not being translated. The match must be for any of them, with comparison ignoring case. + + + Repara el paquete seleccionado + + + No se encuentra el comando de reparación para este paquete. Póngase en contacto con el anunciante del paquete para obtener soporte técnico. + + + La tecnología del instalador en uso no coincide con la versión instalada actualmente. + + + No se encontró el comando de reparación. + + + La tecnología del instalador en uso no es compatible con la reparación. + + + La operación de reparación se completó correctamente. + + + Reparación abandonada + + + Iniciando reparación del paquete... + + + Error al reparar el paquete de Microsoft Store. Código de error: {0} + {Locked="{0}"} Error message displayed when a Microsoft Store application package fails to repair. {0} is a placeholder replaced by an error code. + + + Error en la operación de reparación. + + + La operación de reparación no es aplicable. + + + No hay versiones de paquete coincidentes disponibles en los orígenes configurados. + + + La configuración del sistema actual no admite la reparación de este paquete. + + + La tecnología del instalador en uso no admite la reparación. + + + El paquete instalado para el ámbito de usuario no se puede reparar cuando se ejecuta con privilegios de administrador. + + + No se permiten operaciones de reparación que requieran privilegios de administrador en paquetes instalados dentro del ámbito de usuario. + + + Error de reparación con el código de salida: {0} + {Locked="{0}"} Error message displayed when an attempt to repair an application package fails. {0} is a placeholder replaced by an error code. + \ No newline at end of file diff --git a/Localization/Resources/fr-FR/winget.resw b/Localization/Resources/fr-FR/winget.resw index e928729a83..0c599fee2c 100644 --- a/Localization/Resources/fr-FR/winget.resw +++ b/Localization/Resources/fr-FR/winget.resw @@ -261,6 +261,9 @@ Elles peuvent être configurées par le biais du fichier de paramètres « wing Filtrer les résultats par identifiant + + Supprime les sorties d’avertissement. + La licence d’utilisation de cette application vous est octroyée par son propriétaire. @@ -871,8 +874,8 @@ Elles peuvent être configurées par le biais du fichier de paramètres « wing Le fichier JSON ne spécifie pas de schéma reconnu. - Sélectionner l’étendue d’installation (utilisateur ou ordinateur) - This argument allows the user to select between installing for just the user or for the entire machine. + Sélectionner l’étendue d’installation (user ou machine) + {Locked="user","machine"} This argument allows the user to select between installing for just the user or for the entire machine. La valeur fournie pour l’argument '{0}' n’est pas valide ; les valeurs valides sont : {1} @@ -1018,8 +1021,8 @@ La configuration est désactivée en raison d’une stratégie de groupe.Dependency graph has loop - Aucun programme d’installation approprié n’a été trouvé pour manifest: {0} {1} - {Locked="{0} {1}"} Error message displayed when an attempt to get a preferred installer for a manifest fails. {0} is a placeholder replaced by the manifest identifier. {1} is a placeholder replaced by the manifest version. + Aucun programme d’installation approprié n’a été trouvé pour le manifeste : {0} version {1} + {Locked="{0}","{1}"} Error message displayed when an attempt to get a preferred installer for a manifest fails. {0} is a placeholder replaced by the manifest identifier. {1} is a placeholder replaced by the manifest version. Erreur lors du traitement des dépendances de package. Voulez-vous continuer l’installation ? @@ -1611,8 +1614,8 @@ Spécifiez l’un d’entre eux à l’aide de l’option --source pour continue Impossible de charger le fichier de paramètres. Utilisation des valeurs par défaut. - Sélectionner le filtre d’étendue de package installé (utilisateur ou ordinateur) - This argument allows the user to select installed packages for just the user or for the entire machine. + Sélectionner le filtre d’étendue de package installé (user ou machine) + {Locked="user","machine"} This argument allows the user to select installed packages for just the user or for the entire machine. Épingle ajoutée avec succès @@ -1697,6 +1700,9 @@ Spécifiez l’un d’entre eux à l’aide de l’option --source pour continue {0} package(s) ont une épingle qui doit être supprimée avant la mise à niveau {Locked="{0}"} {0} is a placeholder that is replaced by an integer number of packages with pins that prevent upgrade + + Impossible de mettre à niveau le package à l’aide de Winget. Utilisez la méthode fournie par l’éditeur pour mettre à niveau ce package. + Mettre à niveau les packages même s’ils ont une épingle non bloquante @@ -1832,13 +1838,13 @@ Spécifiez l’un d’entre eux à l’aide de l’option --source pour continue {Locked="--force"} - Activation de {0} [{1}]... - {Locked="{0}","{1}"} Message displayed to the user regarding which Windows Feature is being enabled. + Activation [{0}]... + {Locked="{0}"} Message displayed to the user regarding which Windows Feature is being enabled. - Échec de l’activation de la fonctionnalité {0} [{1}]. - {Locked="{0}"} Windows Feature display name -{Locked="{1}"} Windows Feature name + Échec de l’activation [{0}] de la fonctionnalité : {1} + {Locked="{0}","{1}"} An error when enabling a Windows Feature. {0} is a placeholder for the name of the Windows Feature. +{1} is a placeholder for the unrecognized error code. Redémarrage requis pour activer entièrement la ou les fonctionnalités Windows; continuer en raison de --force @@ -2068,10 +2074,744 @@ Spécifiez l’un d’entre eux à l’aide de l’option --source pour continue Spécifie l’emplacement de stockage des modules sur l’ordinateur local. %LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules par défaut - {Locked="allusers","currentuser","default","%LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules"} + {Locked="%LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules"} La valeur '--module-path' doit être 'currentuser', 'allusers', 'default' ou un chemin absolu. {Locked="{--module-path}, {currentuser}, {allusers}, {default}} + + Activer la configuration Gestionnaire de package Windows + + + Récupérez des informations sur les erreurs. En fonction d’un nombre, la sortie contiendra des détails sur l’erreur, y compris le nom du symbole s’il s’agit d’une erreur spécifique à winget. En fonction d’une chaîne, les erreurs spécifiques à winget sont recherchées pour cette valeur. + + + Obtenir des informations sur les erreurs + + + Valeur à rechercher dans les informations sur l’erreur + + + Le nombre donné est trop grand pour être un HRESULT. + + + Code d’erreur inconnu + + + Erreur interne + + + Arguments de ligne de commande non valides + + + Échec de l’exécution de la commande + + + Échec de l’ouverture du manifeste + + + Signal d’annulation reçu + + + Échec de l’exécution de ShellExecute + + + Impossible de traiter le manifeste. La version du manifeste est supérieure à la version prise en charge. Mettez à jour le client. + + + Échec du téléchargement du programme d’installation + + + Impossible d’écrire dans l’index ; il s’agit d’une version de schéma supérieure + + + L’index est endommagé + + + Les informations sources configurées sont endommagées + + + Le nom de la source est déjà configuré + + + Le type de source n’est pas valide + + + Le fichier MSIX est un pack, et non un package + + + Il manque des données requises par la source + + + Aucun des installateurs n’est applicable pour le système actuel + + + Le hachage du fichier du programme d’installation ne correspond pas au manifeste + + + Le nom de la source n’existe pas + + + L’emplacement source est déjà configuré sous un autre nom + + + Aucun package n’a été trouvé + + + Aucune source n’est configurée + + + Plusieurs packages trouvés correspondant aux critères + + + Aucun manifeste trouvé correspondant aux critères + + + Échec de l’obtention du dossier public à partir du package source + + + La commande requiert des privilèges d’administrateur pour s’exécuter + + + L’emplacement source n’est pas sécurisé + + + Le client Microsoft Store est bloqué par la stratégie + + + L’application Microsoft Store est bloquée par la stratégie + + + La fonctionnalité est en cours de développement. Il peut être activé à l’aide des paramètres winget. + + + Échec de l’installation de l’application Microsoft Store + + + Échec de l’exécution de la saisie semi-automatique + + + Échec de l’initialisation de l’analyseur YAML + + + Une clé YAML non valide a été rencontrée + + + Une clé YAML dupliquée a été rencontrée + + + Opération YAML non valide + + + Échec de la génération du document YAML + + + État de l’émetteur YAML non valide + + + Données YAML non valides + + + Erreur LibYAML + + + La validation des manifestes a réussi avec des avertissements + + + La validation du manifeste a échoué + + + Le manifeste n’est pas valide + + + Aucune mise à jour applicable trouvée + + + mises à niveau WinGet – toutes terminées sur des échecs + + + Désolé, Nous n’avons pas pu effectuer la vérification de sécurité du programme d’installation + + + La taille du téléchargement ne correspond pas à la longueur de contenu attendue + + + Commande de désinstallation introuvable + + + Échec de l’exécution de la commande de désinstallation + + + Erreur d’itérateur d’arrêt ICU + + + Erreur ICU casemap + + + Erreur d’expression régulière ICU + + + Échec de l’installation d’un ou de plusieurs packages importés + + + Impossible de trouver un ou plusieurs packages demandés + + + Le fichier JSON n’est pas valide + + + L’emplacement source n’est pas distant + + + La source rest configurée n’est pas prise en charge + + + Données non valides retournées par la source rest + + + L’opération est bloquée par la stratégie de groupe + + + Erreur interne de la source rest + + + URL de source rest non valide + + + Type MIME (Multipurpose Internet Mail Extensions) non pris en charge retourné par la source rest + + + Version de contrat source rest non valide + + + Les données sources sont endommagées ou falsifiées + + + Erreur de lecture à partir du flux + + + Les contrats du package n’ont pas été acceptés + + + Erreur lors de la lecture de l’entrée dans l’invite + + + La demande de recherche n’est pas prise en charge par une ou plusieurs sources + + + Le point de terminaison de la source rest est introuvable. + + + Échec de l’ouverture de la source. + + + Les contrats sources n’ont pas été acceptés + + + La taille de l’en-tête dépasse la limite autorisée de 1 024 caractères. Réduisez la taille et réessayez. + + + Fichier de ressources manquant + + + Échec de l’exécution de l’installation de MSI + + + Les arguments pour msiexec ne sont pas valides + + + Échec de l’ouverture d’une ou de plusieurs sources + + + Échec de la validation des dépendances + + + Un ou plusieurs packages sont manquants + + + Colonne de table non valide + + + La version de mise à niveau n’est pas plus récente que la version installée + + + La version de mise à niveau est inconnue et le remplacement n’est pas spécifié + + + Erreur de conversion de l’ICU + + + Échec de l’installation du package portable + + + Le volume ne prend pas en charge les points d’analyse + + + Un package portable d’une autre source existe déjà. + + + Impossible de créer un lien symbolique, le chemin pointe vers un répertoire. + + + Le programme d’installation ne peut pas être exécuté à partir d’un contexte d’administrateur. + + + Échec de la désinstallation du package portable + + + Échec de la validation des valeurs DisplayVersion par rapport à l’index. + + + Un ou plusieurs arguments ne sont pas pris en charge. + + + Les caractères Null incorporés ne sont pas autorisés pour SQLite + + + Impossible de trouver le programme d’installation imbriqué dans l’archive. + + + Échec de l’extraction de l’archive. + + + Chemin de fichier relatif non valide fourni pour le programme d’installation imbriqué. + + + Le certificat de serveur ne correspond à aucune des valeurs attendues. + + + L’emplacement d’installation doit être fourni. + + + Échec de l’analyse des programmes malveillants d’archivage. + + + Au moins une version du package installée a été trouvée. + + + Un code PIN existe déjà pour le package. + + + Il n’y a pas de code PIN pour le package. + + + Impossible d’ouvrir la base de données des codes PIN. + + + Une ou plusieurs applications n’ont pas pu être installées + + + Une ou plusieurs applications n’ont pas pu être désinstallés + + + Une ou plusieurs requêtes n’ont pas retourné exactement une correspondance + + + Le package a une broche qui empêche la mise à niveau. + + + Le package actuellement installé est le package stub + + + Signal d’arrêt de l’application reçu + + + Échec du téléchargement des dépendances de package. + + + Échec du téléchargement du package. Le téléchargement pour une installation hors connexion est interdit. + + + Un service requis est occupé ou indisponible. Réessayez plus tard. + + + Le GUID fourni ne correspond pas à un état de reprise valide. + + + La version actuelle du client ne correspondait pas à la version du client de l’état enregistré. + + + Les données d’état de reprise ne sont pas valides. + + + Impossible d’ouvrir la base de données de point de contrôle. + + + Limite de reprise maximale dépassée. + + + Informations d’authentification non valides. + + + Méthode d’authentification non prise en charge. + + + Échec de l'authentification. + + + Échec de l’authentification. Authentification interactive requise. + + + Échec de l’authentification. Annulé par l’utilisateur. + + + Échec de l’authentification. Le compte authentifié n’est pas le compte souhaité. + + + L’application est en cours d’exécution. Quittez l’application, puis réessayez. + + + Une autre installation est déjà en cours. Veuillez réessayez. + + + Un ou plusieurs fichiers sont en cours d’utilisation. Quittez l’application, puis réessayez. + + + Ce package a une dépendance manquante dans votre système. + + + Votre PC n’a plus d’espace disponible. Libérez de l’espace, puis réessayez. + + + Mémoire disponible insuffisante pour l’installation. Fermez les autres applications, puis réessayez. + + + Cette application nécessite une connectivité Internet. Connectez-vous à un réseau, puis réessayez. + + + Cette application a rencontré une erreur lors de l’installation. Contactez le support. + + + Redémarrez votre PC pour terminer l’installation. + + + Échec de l’installation. Redémarrez votre PC, puis réessayez. + + + Votre PC redémarrera pour terminer l’installation. + + + L’installation a été annulée par l’utilisateur. + + + Une autre version de cette application est déjà installée. + + + Une version supérieure de cette application est déjà installée. + + + Les stratégies d’organisation empêchent l’installation. Contactez votre administrateur. + + + Échec de l'installation des dépendances de package. + + + L’application est actuellement utilisée par une autre application. + + + Paramètre non valide. + + + Package non pris en charge par le système. + + + Le programme d’installation ne prend pas en charge la mise à niveau d’un package existant. + + + L’entrée Applications et fonctionnalités du package est introuvable. + + + L’emplacement de l’installation n’est pas applicable. + + + L’emplacement de l’installation est introuvable. + + + Le hachage du fichier existant ne correspond pas. + + + Fichier introuvable. + + + Nous avons trouvé le fichier, mais n’avons pas vérifié le hachage. + + + Désolé... Nous n’avons pas pu accéder au fichier. + + + Le fichier de configuration n’est pas valide. + + + La syntaxe YAML n’est pas valide. + + + Un champ de configuration a un type non valide. + + + La configuration présente une version inconnue. + + + Une erreur s’est produite lors de l’application de la configuration. + + + La configuration contient un identificateur en double. + + + Il manque une dépendance à la configuration. + + + La configuration a une dépendance non satisfaite. + + + Échec d’une assertion pour l’unité de configuration. + + + La configuration a été ignorée manuellement. + + + L’utilisateur a refusé de poursuivre l’exécution. + + + Le graphe des dépendances contient un cycle qui ne peut pas être résolu. + + + La configuration a une valeur de champ non valide. + + + Un champ manque à la configuration. + + + Certaines unités de configuration ont échoué lors du test de leur état. + + + L’état de configuration n’a pas été testé. + + + Désolé... Nous n’avons pas pu installer l’unité de configuration. + + + L’unité de configuration est introuvable. + + + Plusieurs correspondances ont été trouvées pour l’unité de configuration ; spécifiez le module pour sélectionner le module approprié. + + + Échec de l’unité de configuration lors de la tentative d’obtention de l’état actuel du système. + + + Échec de l’unité de configuration lors de la tentative de test de l’état actuel du système. + + + Échec de l’unité de configuration lors de la tentative d’application de l’état souhaité. + + + Le module de l’unité de configuration est disponible dans plusieurs emplacements avec la même version. + + + Échec du chargement du module pour l’unité de configuration. + + + L’unité de configuration a retourné un résultat inattendu lors de l’exécution. + + + Une unité contient un paramètre qui nécessite la racine de configuration. + + + L’opération n’est pas prise en charge par le processeur de configuration. + + + Non disponible + + + Dépendances des fonctionnalités Windows activées + + + Échec du chargement du module pour l’unité de configuration, car il nécessite des privilèges d’administrateur pour s’exécuter. + + + Une unité contient un paramètre qui nécessite la racine de configuration. + + + Échec du chargement du module pour l’unité de configuration, car il nécessite des privilèges d’administrateur pour s’exécuter. + + + Reprend l’exécution d’une commande précédemment enregistrée en passant l’identificateur unique de la commande enregistrée. Permet de reprendre une commande exécutée qui a peut-être été arrêtée en raison d’un redémarrage. + + + Reprend l’exécution d’une commande précédemment enregistrée. + + + Identificateur unique de l’état enregistré à reprendre + + + La reprise de l’état à partir d’une version de client différente n’est pas prise en charge : {0} + {Locked= "{0}"} Message displayed to inform the user that the client version of the resume state does not match the current client version. {0} is a placeholder for the client version that created the resume state. + + + L’état de reprise n’existe pas : {0} + {Locked="{0}" Error message displayed when the user provides a guid that does not correspond to a valid saved state. {0} is a placeholder replaced by the provided guid string. + + + Données introuvables dans l’état de reprise. + + + Cette commande ne prend pas en charge la reprise. + + + Autorise un redémarrage le cas échéant + + + Lancement du redémarrage pour terminer l’opération... + + + Échec du lancement d’un redémarrage. + + + L’opération de reprise dépasse la limite autorisée de {0} reprise(s). Pour reprendre manuellement, exécutez la commande '{1}'. + {Locked="{0}", "{1}"} {0} is a placeholder that is replaced by an integer number of the number of allowed resumes. {1} is a placeholder for the command to run to perform a manual resume. + + + Ignorer la limite de reprise d’un état enregistré + + + Schéma d’URI non pris en charge : {0} + {Locked="{0}"} Error message displayed when the provided uri is not supported. {0} is a placeholder replaced by the provided uri. + + + URI mal formé : {0} + {Locked="{0}"} Error message displayed when the provided uri is not well formed. {0} is a placeholder replaced by the provided uri. + + + Échec de l’analyse {0} contenu des paramètres ou du contenu des paramètres de l’unité de configuration est vide. + {Locked="{0}"} {0} is a placeholder replaced by the input winget configure resource unit type. + + + l’argument requis est manquant dans l’unité de configuration {0} : {1} + {Locked="{0},{1}"} {0} is a placeholder for the input winget configure resource unit type. {1} is placeholder for the missing arg. + + + {0}'unité de configuration n’a pas d’argument recommandé : {1} + {Locked="{0},{1}"} {0} is a placeholder for the input winget configure resource unit type. {1} is placeholder for the missing arg. + + + L’unité de configuration WinGetSource est en conflit avec une source connue : {0} + {Locked="WinGetSource,{0}"} {0} is a placeholder for the input winget source in the configuration unit settings. + + + Assertions de l’unité de configuration WinGetSource sur une source tierce : {0} + {Locked="WinGetSource,{0}"} {0} is a placeholder for the input winget source in the configuration unit settings. + + + WinGetPackage déclare UseLatest et Version. ID du package : {0} + {Locked="WinGetPackage,UseLatest,Version,{0}"} + + + L’unité de configuration WinGetPackage déclare sur un package à partir d’une source tierce. ID du package : {0} ; Source : {1} + {Locked="WinGetPackage,{0},{1}"} + + + Le package d’unité de configuration WinGetPackage dépend d’une source tierce qui n’a pas été configurée précédemment. ID du package : {0} ; Source : {1} + {Locked="WinGetPackage,{0},{1}"} + + + Le package d’unité de configuration WinGetPackage dépend d’une source tierce. Il est recommandé de déclarer la dépendance dans la section uni dependsOn. ID du package : {0} ; Source : {1} + {Locked="WinGetPackage,dependsOn,{0},{1}"} + + + Impossible de valider le package d’unité de configuration WinGetPackage. Échec de l’ouverture de la source. ID du package : {0} ; Source : {1} + {Locked="WinGetPackage,{0},{1}"} + + + Impossible de valider le package d’unité de configuration WinGetPackage. Package introuvable. ID du package : {0} + {Locked="WinGetPackage,{0}"} + + + Impossible de valider le package d’unité de configuration WinGetPackage. Plusieurs packages trouvés. ID du package : {0} + {Locked="WinGetPackage,{0}"} + + + Impossible de valider le package d’unité de configuration WinGetPackage. Version de package introuvable. ID du package : {0} ; {1} de version + {Locked="WinGetPackage,{0},{1}"} + + + Package d’unité de configuration WinGetPackage spécifié avec une version spécifique alors qu’une seule version du package est disponible. ID du package :{0} ; version : {1} + {Locked="WinGetPackage,{0},{1}"} + + + Impossible de valider le package d’unité de configuration WinGetPackage. ID du package : {0} + {Locked="WinGetPackage,{0}"} + + + Spécifier la préférence de fenêtre d’authentification (silent, silentPreferred ou interactive) + {Locked="silent","silentPreferred","interactive"} This argument allows the user to select authentication window popup behavior. + + + Spécifier le compte à utiliser pour l’authentification + + + Échec de l’ajout de la source. Cette version winget ne prend pas en charge la méthode d’authentification de la source. Essayez de mettre à niveau vers la dernière version winget. + {Locked="winget"} + + + La source {0} requiert une authentification. L’invite d’authentification peut s’afficher en cas de besoin. Les informations authentifiées seront partagées avec la source pour l’autorisation d’accès. + {Locked="{0}"} + + + Répare le package sélectionné, trouvé en effectuant une recherche dans la liste des packages installés ou directement à partir d’un manifeste. Par défaut, la requête doit correspondre, sans respect de la casse, à l’ID, au nom ou au moniker du package. D’autres champs peuvent être utilisés en passant leur option appropriée. + id, name, and moniker are all named values in our context, and may benefit from not being translated. The match must be for any of them, with comparison ignoring case. + + + Répare le package sélectionné + + + La commande de réparation de ce package est introuvable. Contactez l’éditeur du package pour obtenir de l’aide. + + + La technologie du programme d’installation utilisée ne correspond pas à la version actuellement installée. + + + Commande de réparation introuvable. + + + La technologie du programme d’installation en cours d’utilisation ne prend pas en charge la réparation. + + + L’opération de réparation s’est terminée correctement. + + + Réparation abandonnée + + + Démarrage de la réparation du package... + + + Échec de la réparation du package Microsoft Store. Code d'erreur : {0} + {Locked="{0}"} Error message displayed when a Microsoft Store application package fails to repair. {0} is a placeholder replaced by an error code. + + + Échec de l’opération de réparation. + + + L’opération de réparation n’est pas applicable. + + + Aucune version de package correspondante n’est disponible à partir des sources configurées. + + + La configuration système actuelle ne prend pas en charge la réparation de ce package. + + + La technologie de programme d’installation utilisée ne prend pas en charge la réparation. + + + Le package installé pour l’étendue de l’utilisateur ne peut pas être réparé en cas d’exécution avec des privilèges d’administrateur. + + + Les opérations de réparation impliquant des privilèges d’administrateur ne sont pas autorisées sur les packages installés dans l’étendue utilisateur. + + + Échec de la réparation avec le code de sortie : {0} + {Locked="{0}"} Error message displayed when an attempt to repair an application package fails. {0} is a placeholder replaced by an error code. + \ No newline at end of file diff --git a/Localization/Resources/it-IT/winget.resw b/Localization/Resources/it-IT/winget.resw index 8b45f97e9e..0d944e8483 100644 --- a/Localization/Resources/it-IT/winget.resw +++ b/Localization/Resources/it-IT/winget.resw @@ -261,6 +261,9 @@ Possono essere configurati tramite il file di impostazioni ' winget settings '.< Filtra i risultati per ID + + Elimina gli output di avviso. + Questa applicazione viene concessa in licenza dal proprietario. @@ -871,8 +874,8 @@ Possono essere configurati tramite il file di impostazioni ' winget settings '.< Il file JSON non specifica uno schema riconosciuto. - Seleziona ambito di installazione (utente o computer) - This argument allows the user to select between installing for just the user or for the entire machine. + Seleziona ambito di installazione (user o machine) + {Locked="user","machine"} This argument allows the user to select between installing for just the user or for the entire machine. Il valore specificato per l'argomento '{0}' non è valido. i valori validi sono: {1} @@ -1018,8 +1021,8 @@ La configurazione è disabilitata a causa dei criteri di gruppo. Dependency graph has loop - Non è stato trovato alcun programma di installazione adatto per manifest: {0} {1} - {Locked="{0} {1}"} Error message displayed when an attempt to get a preferred installer for a manifest fails. {0} is a placeholder replaced by the manifest identifier. {1} is a placeholder replaced by the manifest version. + Non è stato trovato alcun programma di installazione adatto per il manifesto: {0} versione {1} + {Locked="{0}","{1}"} Error message displayed when an attempt to get a preferred installer for a manifest fails. {0} is a placeholder replaced by the manifest identifier. {1} is a placeholder replaced by the manifest version. Errore durante l'elaborazione delle dipendenze del pacchetto. Continuare l'installazione? @@ -1611,8 +1614,8 @@ Specificarne uno utilizzando l'opzione --source per continuare. Non è stato possibile caricare il file delle impostazioni. Utilizzo dei valori predefiniti. - Selezionare il filtro dell'ambito del pacchetto installato (utente o computer) - This argument allows the user to select installed packages for just the user or for the entire machine. + Selezionare il filtro dell'ambito del pacchetto installato (user o machine) + {Locked="user","machine"} This argument allows the user to select installed packages for just the user or for the entire machine. Aggiunta del pin completata @@ -1697,6 +1700,9 @@ Specificarne uno utilizzando l'opzione --source per continuare. {0} pacchetti hanno un PIN che deve essere rimosso prima dell'aggiornamento {Locked="{0}"} {0} is a placeholder that is replaced by an integer number of packages with pins that prevent upgrade + + Non è possibile aggiornare il pacchetto con WinGet. Usare il metodo fornito dal server di pubblicazione per l'aggiornamento di questo pacchetto. + Aggiorna i pacchetti anche se hanno un PIN non bloccante @@ -1832,13 +1838,13 @@ Specificarne uno utilizzando l'opzione --source per continuare. {Locked="--force"} - Abilitazione di {0} [{1}]... - {Locked="{0}","{1}"} Message displayed to the user regarding which Windows Feature is being enabled. + Abilitazione di [{0}] in corso... + {Locked="{0}"} Message displayed to the user regarding which Windows Feature is being enabled. - Non è stato possibile abilitare {0} [{1}] funzionalità. - {Locked="{0}"} Windows Feature display name -{Locked="{1}"} Windows Feature name + Non è stato possibile abilitare la funzionalità [{0}]: {1} + {Locked="{0}","{1}"} An error when enabling a Windows Feature. {0} is a placeholder for the name of the Windows Feature. +{1} is a placeholder for the unrecognized error code. È necessario riavviare il sistema per abilitare completamente le funzionalità di Windows. procedi a causa di --force @@ -2068,10 +2074,744 @@ Specificarne uno utilizzando l'opzione --source per continuare. Specifica il percorso nel computer locale in cui archiviare i moduli. %LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules predefinito - {Locked="allusers","currentuser","default","%LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules"} + {Locked="%LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules"} Il valore di '--module-path' deve essere 'currentuser', 'allusers', 'default' o un percorso assoluto. {Locked="{--module-path}, {currentuser}, {allusers}, {default}} + + Abilita la configurazione di Gestione pacchetti + + + Recupera informazioni sugli errori. Dato un numero, l'output conterrà i dettagli sull'errore, incluso il nome del simbolo se si tratta di un errore specifico di WinGet. In base a una stringa, viene eseguita la ricerca di questo valore negli errori specifici di WinGet. + + + Ottenere informazioni sugli errori + + + Valore da cercare nelle informazioni sull'errore + + + Il numero specificato è troppo grande per essere un HRESULT. + + + Codice di errore sconosciuto + + + Errore interno + + + Argomenti della riga di comando non validi + + + L'esecuzione del comando non è riuscita + + + Apertura del manifesto non riuscita + + + Segnale di annullamento ricevuto + + + L'esecuzione di ShellExecute non è riuscita + + + Impossibile elaborare il manifesto. La versione del manifesto è superiore a quella supportata. Aggiornare il client. + + + Download del programma di installazione non riuscito + + + Impossibile scrivere nell'indice; è una versione dello schema superiore + + + L'indice è danneggiato + + + Le informazioni di origine configurate sono danneggiate + + + Il nome dell'origine è già configurato + + + Il tipo di origine non è valido + + + Il file MSIX è un bundle, non un pacchetto + + + Mancano i dati richiesti dall'origine + + + Nessuno dei programmi di installazione è applicabile al sistema corrente + + + L'hash del file del programma di installazione non corrisponde al manifesto + + + Il nome di origine non esiste + + + Il percorso di origine è già configurato con un altro nome + + + Nessun pacchetto trovato + + + Nessuna origine configurata + + + Sono stati trovati più pacchetti corrispondenti ai criteri + + + Nessun manifesto trovato corrispondente ai criteri + + + Non è stato possibile ottenere la cartella pubblica dal pacchetto di origine + + + Il comando richiede i privilegi di amministratore per essere eseguito + + + Il percorso di origine non è sicuro + + + Il client Microsoft Store è bloccato dai criteri + + + L'applicazione Microsoft Store è bloccata dai criteri + + + La funzionalità è attualmente in fase di sviluppo. Può essere abilitato con le impostazioni di WinGet. + + + Non è stato possibile installare l'app Microsoft Store + + + Non è stato possibile eseguire il completamento automatico + + + Non è stato possibile inizializzare il parser YAML + + + È stata rilevata una chiave YAML non valida + + + È stata rilevata una chiave YAML duplicata + + + Operazione YAML non valida + + + Non è stato possibile compilare il documento YAML + + + Stato dell'emettitore YAML non valido + + + Dati YAML non validi + + + Errore LibYAML + + + Convalida del manifesto riuscita con avviso + + + Convalida del manifesto non riuscita + + + Il manifesto non è valido + + + Non è stato trovato alcun aggiornamento applicabile + + + aggiornamento di winget -- tutto completato con errori + + + Non è stato possibile eseguire il controllo di sicurezza per il programma di installazione + + + La dimensione del download non corrisponde alla lunghezza prevista del contenuto + + + Comando di disinstallazione non trovato + + + L'esecuzione del comando di disinstallazione non è riuscita + + + Errore iteratore di interruzione dell'ICU + + + Errore casemap ICU + + + Errore regex ICU + + + Non è stato possibile installare uno o più pacchetti importati + + + Non è stato possibile trovare uno o più pacchetti richiesti + + + Il file Json non è valido + + + Il percorso di origine non è remoto + + + L'origine rest configurata non è supportata + + + Dati non validi restituiti dall'origine rest + + + L'operazione è bloccata da Criteri di gruppo + + + Errore interno dell'origine rest + + + L'URL dell'origine rest non è valido + + + Tipo MIME non supportato restituito dall'origine rest + + + Versione del contratto di origine rest non valida + + + I dati di origine sono danneggiati o manomessi + + + Errore nella lettura del flusso + + + I contratti del pacchetto non sono stati concordati + + + Errore durante la lettura dell'input nel prompt + + + La richiesta di ricerca non è supportata da una o più origini + + + L'endpoint di origine rest non è stato trovato. + + + Impossibile aprire l'origine. + + + Contratti di origine non accettati + + + Le dimensioni dell'intestazione superano il limite consentito di 1024 caratteri. Ridurre le dimensioni e riprovare. + + + File di risorse mancante + + + L'esecuzione dell'installazione MSI non è riuscita + + + Gli argomenti per msiexec non sono validi + + + Non è stato possibile aprire una o più origini + + + Non è stato possibile convalidare le dipendenze + + + Uno o più pacchetti mancanti + + + Colonna tabella non valida + + + La versione di aggiornamento non è più recente della versione installata + + + La versione dell'aggiornamento è sconosciuta e l'override non è specificato + + + Errore di conversione ICU + + + Non è stato possibile installare il pacchetto portabile + + + Il volume non supporta i punti di reparse + + + Esiste già un pacchetto portabile di un'origine diversa. + + + Impossibile creare il collegamento simbolico. Il percorso punta a una directory. + + + Impossibile eseguire il programma di installazione da un contesto di amministratore. + + + Non è stato possibile disinstallare il pacchetto portabile + + + Non è stato possibile convalidare i valori DisplayVersion rispetto all'indice. + + + Uno o più argomenti non sono supportati. + + + I caratteri null incorporati non sono consentiti in SQLite + + + Impossibile trovare il programma di installazione annidato nell'archivio. + + + Impossibile estrarre l'archivio. + + + È stato specificato un percorso di file relativo non valido per il programma di installazione annidato. + + + Il certificato del server non corrisponde ad alcun valore previsto. + + + È necessario specificare il percorso di installazione. + + + L'analisi del malware dell'archivio non è riuscita. + + + È stata trovata almeno una versione del pacchetto installato. + + + Esiste già un pin per il pacchetto. + + + Nessun pin per il pacchetto. + + + Impossibile aprire il database dei pin. + + + Installazione di una o più applicazioni non riuscita + + + Non è stato possibile disinstallare una o più applicazioni + + + Una o più query non hanno restituito esattamente una corrispondenza + + + Il pacchetto contiene un PIN che impedisce l'aggiornamento. + + + Il pacchetto attualmente installato è il pacchetto stub + + + Segnale di arresto dell'applicazione ricevuto + + + Non è stato possibile scaricare le dipendenze del pacchetto. + + + Non è stato possibile scaricare il pacchetto. Il download per l'installazione offline non è consentito. + + + Un servizio richiesto è occupato o non disponibile. Riprova più tardi. + + + Il GUID specificato non corrisponde a uno stato di ripresa valido. + + + La versione corrente del client non corrisponde alla versione client dello stato salvato. + + + I dati sullo stato di ripresa non sono validi. + + + Impossibile aprire il database del checkpoint. + + + È stato superato il limite massimo di ripresa. + + + Informazioni di autenticazione non valide. + + + Metodo di autenticazione non supportato. + + + Autenticazione non riuscita. + + + Impossibile eseguire l'autenticazione. È richiesta l'autenticazione interattiva. + + + Impossibile eseguire l'autenticazione. Annullato dall'utente. + + + Autenticazione non riuscita. L'account autenticato non è l'account desiderato. + + + L'applicazione è attualmente in esecuzione. Uscire dall'applicazione, quindi riprovare. + + + È già in corso un'altra installazione. Riprova più tardi. + + + È in uso uno o più file. Uscire dall'applicazione, quindi riprovare. + + + Nel sistema manca una dipendenza per questo pacchetto. + + + Non c'è più spazio nel PC. Liberare spazio, quindi riprovare. + + + Memoria insufficiente per l'installazione. Chiudi le altre applicazioni, quindi riprova. + + + Questa applicazione richiede la connettività Internet. Connettiti a una rete e riprova. + + + Errore dell'applicazione durante l'installazione. Contattare il supporto tecnico. + + + Riavvia il PC per completare l'installazione.. + + + Installazione non riuscita. Riavvia il PC e riprova. + + + Il PC verrà riavviato per completare l'installazione. + + + Hai annullato l’installazione. + + + È già installata un'altra versione di questa applicazione. + + + È già installata una versione successiva di questa applicazione. + + + I criteri dell'organizzazione impediscono l'installazione. Contattare l'amministratore. + + + Non è stato possibile installare le dipendenze del pacchetto. + + + L'applicazione è attualmente utilizzata da un'altra applicazione. + + + Parametro non valido. + + + Pacchetto non supportato dal sistema. + + + Il programma di installazione non supporta l'aggiornamento di un pacchetto esistente. + + + La voce App e funzionalità per il pacchetto non è stata trovata. + + + Il percorso di installazione non è applicabile. + + + Il percorso di installazione non è stato trovato. + + + L'hash del file esistente non corrisponde. + + + File non trovato. + + + Il file è stato trovato ma l'hash non è stato controllato. + + + Impossibile accedere al file. + + + Il file di configurazione non è valido. + + + Sintassi YAML non valida. + + + Un campo di configurazione ha un tipo non valido. + + + La versione della configurazione è sconosciuta. + + + Errore durante l'applicazione della configurazione. + + + La configurazione contiene un identificatore duplicato. + + + Nella configurazione manca una dipendenza. + + + La configurazione ha una dipendenza non soddisfatta. + + + Un'asserzione per l'unità di configurazione non è riuscita. + + + La configurazione è stata ignorata manualmente. + + + L'utente ha rifiutato di continuare l'esecuzione. + + + Il grafico delle dipendenze contiene un ciclo che non può essere risolto. + + + La configurazione contiene un valore di campo non valido. + + + Nella configurazione manca un campo. + + + Errore di alcune unità di configurazione durante il test dello stato. + + + Lo stato della configurazione non è stato testato. + + + L'unità di configurazione non è stata installata. + + + Impossibile trovare l'unità di configurazione. + + + Sono state trovate più corrispondenze per l'unità di configurazione; specificare il modulo per selezionare quello corretto. + + + Errore dell'unità di configurazione durante il tentativo di ottenere lo stato corrente del sistema. + + + Errore dell'unità di configurazione durante il tentativo di testare lo stato corrente del sistema. + + + Errore dell'unità di configurazione durante il tentativo di applicare lo stato desiderato. + + + Il modulo per l'unità di configurazione è disponibile in più località con la stessa versione. + + + Caricamento del modulo per l'unità di configurazione non riuscito. + + + L'unità di configurazione ha restituito un risultato imprevisto durante l'esecuzione. + + + Un'unità contiene un'impostazione che richiede la radice di configurazione. + + + Operazione non supportata dal processore di configurazione. + + + Non disponibile + + + Le dipendenze delle funzioni di Windows sono state abilitate + + + Il caricamento del modulo per l'unità di configurazione non è riuscito perché richiede privilegi di amministratore per l'esecuzione. + + + Un'unità contiene un'impostazione che richiede la radice di configurazione. + + + Il caricamento del modulo per l'unità di configurazione non è riuscito perché richiede privilegi di amministratore per l'esecuzione. + + + Riprende l'esecuzione di un comando salvato in precedenza passando l'identificatore univoco del comando salvato. Consente di riprendere un comando eseguito che potrebbe essere stato terminato a causa di un riavvio. + + + Riprende l'esecuzione di un comando salvato in precedenza. + + + Identificatore univoco dello stato salvato da riprendere + + + La ripresa dello stato da una versione client diversa non è supportata: {0} + {Locked= "{0}"} Message displayed to inform the user that the client version of the resume state does not match the current client version. {0} is a placeholder for the client version that created the resume state. + + + Lo stato di ripresa non esiste: {0} + {Locked="{0}" Error message displayed when the user provides a guid that does not correspond to a valid saved state. {0} is a placeholder replaced by the provided guid string. + + + Non sono stati trovati dati nello stato di ripresa. + + + Questo comando non supporta la ripresa. + + + Consente un riavvio, se applicabile + + + Avvio del riavvio per completare l'operazione... + + + Non è stato possibile avviare un riavvio. + + + L'operazione di ripresa supera il limite consentito di {0} curriculum. Per riprendere manualmente, eseguire il comando '{1}'. + {Locked="{0}", "{1}"} {0} is a placeholder that is replaced by an integer number of the number of allowed resumes. {1} is a placeholder for the command to run to perform a manual resume. + + + Ignora il limite per la ripresa di uno stato salvato + + + Schema Uri non supportato: {0} + {Locked="{0}"} Error message displayed when the provided uri is not supported. {0} is a placeholder replaced by the provided uri. + + + Uri non ben formato: {0} + {Locked="{0}"} Error message displayed when the provided uri is not well formed. {0} is a placeholder replaced by the provided uri. + + + Non è stato possibile analizzare {0} contenuto delle impostazioni dell'unità di configurazione o il contenuto delle impostazioni è vuoto. + {Locked="{0}"} {0} is a placeholder replaced by the input winget configure resource unit type. + + + argomento obbligatorio mancante nell'unità di configurazione {0}: {1} + {Locked="{0},{1}"} {0} is a placeholder for the input winget configure resource unit type. {1} is placeholder for the missing arg. + + + {0}'unità di configurazione non contiene l'argomento consigliato: {1} + {Locked="{0},{1}"} {0} is a placeholder for the input winget configure resource unit type. {1} is placeholder for the missing arg. + + + L'unità di configurazione WinGetSource è in conflitto con un'origine nota: {0} + {Locked="WinGetSource,{0}"} {0} is a placeholder for the input winget source in the configuration unit settings. + + + L'unità di configurazione WinGetSource asserisce su un'origine di terze parti: {0} + {Locked="WinGetSource,{0}"} {0} is a placeholder for the input winget source in the configuration unit settings. + + + WinGetPackage dichiara sia UseLatest che Version. ID pacchetto: {0} + {Locked="WinGetPackage,UseLatest,Version,{0}"} + + + L'unità di configurazione WinGetPackage asserisce un pacchetto da un'origine di terze parti. ID pacchetto: {0}; Origine: {1} + {Locked="WinGetPackage,{0},{1}"} + + + Il pacchetto dell'unità di configurazione WinGetPackage dipende da un'origine di terze parti non configurata in precedenza. ID pacchetto: {0}; Origine: {1} + {Locked="WinGetPackage,{0},{1}"} + + + Il pacchetto dell'unità di configurazione WinGetPackage dipende da un'origine di terze parti. È consigliabile dichiarare la dipendenza nella sezione dependsOn uni. ID pacchetto: {0}; Origine: {1} + {Locked="WinGetPackage,dependsOn,{0},{1}"} + + + Impossibile convalidare il pacchetto di unità di configurazione WinGetPackage. Apertura dell'origine non riuscita. ID pacchetto: {0}; Origine: {1} + {Locked="WinGetPackage,{0},{1}"} + + + Impossibile convalidare il pacchetto di unità di configurazione WinGetPackage. Pacchetto non trovato. ID pacchetto: {0} + {Locked="WinGetPackage,{0}"} + + + Impossibile convalidare il pacchetto di unità di configurazione WinGetPackage. Sono stati trovati più pacchetti. ID pacchetto: {0} + {Locked="WinGetPackage,{0}"} + + + Impossibile convalidare il pacchetto di unità di configurazione WinGetPackage. La versione del pacchetto non è stata trovata. ID pacchetto: {0}; Versione {1} + {Locked="WinGetPackage,{0},{1}"} + + + Pacchetto di unità di configurazione WinGetPackage specificato con una versione specifica, ma è disponibile una sola versione del pacchetto. ID pacchetto:{0}; Versione: {1} + {Locked="WinGetPackage,{0},{1}"} + + + Impossibile convalidare il pacchetto di unità di configurazione WinGetPackage. ID pacchetto: {0} + {Locked="WinGetPackage,{0}"} + + + Specificare la preferenza della finestra di autenticazione (silent, silentPreferred o interactive) + {Locked="silent","silentPreferred","interactive"} This argument allows the user to select authentication window popup behavior. + + + Specificare l'account da usare per l'autenticazione + + + Non è stato possibile aggiungere l'origine. Questa versione winget non supporta il metodo di autenticazione dell'origine. Provare a eseguire l'aggiornamento alla versione più recente winget. + {Locked="winget"} + + + L'origine {0} richiede l'autenticazione. La richiesta di autenticazione può essere visualizzata quando necessario. Le informazioni autenticate verranno condivise con l'origine per l'autorizzazione di accesso. + {Locked="{0}"} + + + Ripristina il pacchetto selezionato, trovato eseguendo una ricerca nell'elenco dei pacchetti installati o direttamente da un manifesto. Per impostazione predefinita, la query deve corrispondere senza distinzione tra maiuscole e minuscole all'ID, al nome o al moniker del pacchetto. È possibile usare altri campi passando l'opzione appropriata. + id, name, and moniker are all named values in our context, and may benefit from not being translated. The match must be for any of them, with comparison ignoring case. + + + Ripristina il pacchetto selezionato + + + Impossibile trovare il comando di ripristino per questo pacchetto. Contattare l'editore del pacchetto per ottenere supporto. + + + La tecnologia del programma di installazione in uso non corrisponde alla versione attualmente installata. + + + Comando di ripristino non trovato. + + + La tecnologia del programma di installazione in uso non supporta il ripristino. + + + L'operazione di ripristino è stata completata. + + + Riparazione abbandonata + + + Avvio del ripristino del pacchetto in corso... + + + Non è stato possibile riparare il pacchetto Microsoft Store. Codice di errore: {0} + {Locked="{0}"} Error message displayed when a Microsoft Store application package fails to repair. {0} is a placeholder replaced by an error code. + + + L'operazione di ripristino non è riuscita. + + + L'operazione di ripristino non è applicabile. + + + Non sono disponibili versioni del pacchetto corrispondenti dalle origini configurate. + + + La configurazione di sistema corrente non supporta il ripristino di questo pacchetto. + + + La tecnologia del programma di installazione in uso non supporta il ripristino. + + + Impossibile ripristinare il pacchetto installato per l'ambito utente durante l'esecuzione con privilegi di amministratore. + + + Le operazioni di ripristino che richiedono privilegi di amministratore non sono consentite nei pacchetti installati nell'ambito utente. + + + Ripristino non riuscito con codice di uscita: {0} + {Locked="{0}"} Error message displayed when an attempt to repair an application package fails. {0} is a placeholder replaced by an error code. + \ No newline at end of file diff --git a/Localization/Resources/ja-JP/winget.resw b/Localization/Resources/ja-JP/winget.resw index 595bb21b82..9867de0569 100644 --- a/Localization/Resources/ja-JP/winget.resw +++ b/Localization/Resources/ja-JP/winget.resw @@ -261,6 +261,9 @@ ID で結果をフィルター処理 + + 警告出力を非表示にします。 + このアプリケーションは所有者からライセンス供与されます。 @@ -871,8 +874,8 @@ JSON ファイルでは、認識されるスキーマが指定されていません。 - インストールの範囲 (ユーザーまたはコンピューター) の選択 - This argument allows the user to select between installing for just the user or for the entire machine. + インストールの範囲 (user または machine) の選択 + {Locked="user","machine"} This argument allows the user to select between installing for just the user or for the entire machine. '{0}' 引数に指定された値が無効です。有効な値: {1} @@ -1018,8 +1021,8 @@ Dependency graph has loop - manifest: {0} {1} に適したインストーラーが見つかりません - {Locked="{0} {1}"} Error message displayed when an attempt to get a preferred installer for a manifest fails. {0} is a placeholder replaced by the manifest identifier. {1} is a placeholder replaced by the manifest version. + マニフェストに適したインストーラーが見つかりません: {0} バージョン {1} + {Locked="{0}","{1}"} Error message displayed when an attempt to get a preferred installer for a manifest fails. {0} is a placeholder replaced by the manifest identifier. {1} is a placeholder replaced by the manifest version. パッケージ依存関係の処理中にエラーが発生しました。インストールを続行しますか? @@ -1611,8 +1614,8 @@ 設定ファイルを読み込めませんでした。既定値を使用しています。 - インストールされているパッケージ スコープ フィルター (ユーザーまたはコンピューター) の選択 - This argument allows the user to select installed packages for just the user or for the entire machine. + インストールされているパッケージ スコープ フィルター (user または machine) の選択 + {Locked="user","machine"} This argument allows the user to select installed packages for just the user or for the entire machine. ピンが正常に追加されました @@ -1697,6 +1700,9 @@ {0} 個のパッケージには、アップグレードする前に削除する必要があるピンがあります {Locked="{0}"} {0} is a placeholder that is replaced by an integer number of packages with pins that prevent upgrade + + winget を使用してパッケージをアップグレードすることはできません。このパッケージをアップグレードするには、発行元から提供された方法を使用してください。 + ブロックでないピンを持っている場合でもパッケージをアップグレードする @@ -1832,13 +1838,13 @@ {Locked="--force"} - {0} [{1}] を有効にしています... - {Locked="{0}","{1}"} Message displayed to the user regarding which Windows Feature is being enabled. + [{0}] を有効にしています... + {Locked="{0}"} Message displayed to the user regarding which Windows Feature is being enabled. - {0} [{1}] 機能を有効にできませんでした。 - {Locked="{0}"} Windows Feature display name -{Locked="{1}"} Windows Feature name + [{0}] 機能を有効にできませんでした: {1} + {Locked="{0}","{1}"} An error when enabling a Windows Feature. {0} is a placeholder for the name of the Windows Feature. +{1} is a placeholder for the unrecognized error code. Windows 機能を完全に有効にするには再起動が必要です。--force が原因で続行しています @@ -2068,10 +2074,744 @@ モジュールを格納するローカル コンピューター上の場所を指定します。既定の %LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules - {Locked="allusers","currentuser","default","%LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules"} + {Locked="%LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules"} `--module-path` 値は、`currentuser`、`allusers`、`default`、または絶対パスである必要があります。 {Locked="{--module-path}, {currentuser}, {allusers}, {default}} + + Windows パッケージ マネージャーの構成を有効にする + + + エラーに関する情報を取得します。指定された数値は、winget 固有のエラーの場合のシンボル名を含む、エラーに関する詳細を出力に含めます。文字列を指定すると、winget 固有のエラーがこの値で検索されます。 + + + エラーに関する情報を取得する + + + エラー情報内で検索する値 + + + 指定された数値が大きすぎて HRESULT にできません。 + + + 不明なエラー コード + + + 内部エラー + + + コマンド ラインの引数が無効です + + + コマンドの実行に失敗しました + + + マニフェストを開けませんでした + + + 取り消しシグナルを受信しました + + + ShellExecute の実行に失敗しました + + + マニフェストを処理できません。マニフェストのバージョンがサポートされているバージョンを超えています。クライアントを更新してください。 + + + インストーラーのダウンロードに失敗しました + + + インデックスに書き込めません;上位のスキーマ バージョンです + + + インデックスが壊れています + + + 構成されたソース情報が壊れています + + + ソース名は既に構成されています + + + ソースの種類が無効です + + + MSIX ファイルがパッケージではなくバンドルです + + + ソースに必要なデータがありません + + + 現在のシステムに適用できるインストーラーはありません + + + インストーラー ファイルのハッシュがマニフェストと一致しません + + + ソース名が存在しません + + + ソースの場所は既に別の名前で構成されています + + + パッケージが見つかりません + + + ソースが構成されていません + + + 条件に一致するパッケージが複数見つかりました + + + 条件に一致するマニフェストが見つかりませんでした + + + ソース パッケージからパブリック フォルダーを取得できませんでした + + + コマンドを実行するには管理者権限が必要です + + + ソースの場所がセキュリティで保護されていません + + + Microsoft Store クライアントがポリシーによってブロックされています + + + Microsoft Store アプリがポリシーによってブロックされています + + + この機能は現在開発中です。winget 設定を使用して有効にできます。 + + + Microsoft Store アプリをインストールできませんでした + + + オート コンプリートを実行できませんでした + + + YAML パーサーの初期化に失敗しました + + + 無効な YAML キーが見つかりました + + + 重複している YAML キーが見つかりました + + + YAML 操作が無効です + + + YAML ドキュメントをビルドできませんでした + + + YAML エミッタの状態が無効です + + + YAML データが無効です + + + LibYAML エラー + + + マニフェストの検証は成功しましたが、警告があります + + + マニフェストの検証に失敗しました + + + マニフェストが無効です + + + 適用可能な更新は見つかりませんでした + + + WinGet アップグレード -- すべて完了しましたが、エラーが発生しました + + + インストーラーのセキュリティ チェックに失敗しました + + + ダウンロード サイズが予期されたコンテンツの長さと一致しません + + + アンインストール コマンドが見つかりません + + + アンインストール コマンドの実行に失敗しました + + + ICU ブレーク反復子エラー + + + ICU ケースマップ エラー + + + ICU 正規表現エラー + + + 1 つ以上のインポートされたパッケージをインストールできませんでした + + + 1 つ以上の要求されたパッケージが見つかりませんでした + + + JSON ファイルが無効です + + + ソースの場所がリモートではありません + + + 構成された REST ソースはサポートされていません + + + REST ソースによって無効なデータが返されました + + + 操作はグループ ポリシーによってブロックされています + + + REST ソースの内部エラー + + + REST ソース URL が無効です + + + サポートされていない MIME の種類が REST ソースから返されました + + + REST ソース コントラクト バージョンが無効です + + + ソース データが壊れているか、改ざんされています + + + ストリームからの読み込みエラー + + + パッケージ契約に同意しませんでした + + + プロンプトで入力の読み取り中にエラーが発生しました + + + 検索要求は 1 つ以上のソースでサポートされていません + + + REST ソース エンドポイントが見つかりません。 + + + ソースを開けませんでした。 + + + ソース契約に同意しませんでした + + + ヘッダーのサイズが許容される上限の 1024 文字を超えています。サイズを小さくして、もう一度お試しください。 + + + リソース ファイルがありません + + + MSI インストールの実行に失敗しました + + + msiexec の引数が無効です + + + 1 つ以上のソースを開けませんでした + + + 依存関係の検証ができませんでした + + + 1 つ以上のパッケージが見つかりません + + + テーブル列が無効です + + + アップグレード バージョンが、インストールされているバージョンより新しくありません + + + アップグレード バージョンが不明で、オーバーライドが指定されていません + + + ICU 変換エラー + + + ポータブル パッケージをインストールできませんでした + + + ボリュームは再パース ポイントをサポートしていません + + + 別のソースからのポータブル パッケージが既に存在します。 + + + symlink を作成できません。パスはディレクトリを指しています。 + + + 管理者コンテキストからインストーラーを実行することはできません。 + + + ポータブル パッケージをアンインストールできませんでした + + + インデックスに対して DisplayVersion 値を検証できませんでした。 + + + 1 つ以上の引数がサポートされていません。 + + + SQLite では埋め込み Null 文字は使用できません + + + 入れ子になったインストーラーがアーカイブに見つかりませんでした。 + + + アーカイブを抽出できませんでした。 + + + 指定された入れ子になったインストーラーへの相対ファイル パスが無効です。 + + + サーバー証明書が、予期された値のいずれにも一致しませんでした。 + + + インストールの場所を指定する必要があります。 + + + アーカイブのマルウェア スキャンに失敗しました。 + + + インストールされているパッケージのバージョンが少なくとも 1 つ見つかりました。 + + + パッケージの PIN が既に存在します。 + + + パッケージの PIN がありません。 + + + PIN データベースを開けません。 + + + 1 つ以上のアプリケーションをインストールできませんでした + + + 1 つ以上のアプリケーションをアンインストールできませんでした + + + 1 つ以上のクエリで、返された結果が 1 つのみではありませんでした + + + パッケージがピン留めされているため、アップグレードできません。 + + + 現在インストールされているパッケージはスタブ パッケージです + + + アプリケーション シャットダウン シグナルを受信しました + + + パッケージの依存関係をダウンロードできませんでした。 + + + パッケージをダウンロードできませんでした。オフライン インストール用のダウンロードは禁止されています。 + + + 必要なサービスがビジー状態であるか、利用できません。後でもう一度お試しください。 + + + 指定された GUID は、有効な再開状態に対応していません。 + + + 現在のクライアント バージョンは、保存された状態のクライアント バージョンと一致しませんでした。 + + + 再開状態データが無効です。 + + + チェックポイント データベースを開けません。 + + + 再開の上限を超えました。 + + + 認証情報が無効です。 + + + 認証方法がサポートされていません。 + + + 認証に失敗しました。 + + + 認証に失敗しました。対話型認証が必要です。 + + + 認証に失敗しました。ユーザーにより取り消されました。 + + + 認証に失敗しました。認証されたアカウントは目的のアカウントではありません。 + + + アプリケーションは現在実行中です。アプリケーションを終了してから、もう一度お試しください。 + + + 別のインストールが既に進行中です。後でもう一度お試しください。 + + + 1 つ以上のファイルが使用されています。アプリケーションを終了してから、もう一度お試しください。 + + + このパッケージには、システムに依存関係がありません。 + + + PC にこれ以上空き領域がありません。空き領域を確保してから、もう一度やり直してください。 + + + インストールできるメモリが不足しています。他のアプリケーションを閉じてから、もう一度やり直してください。 + + + このアプリケーションにはインターネット接続が必要です。ネットワークに接続してから、もう一度お試しください。 + + + このアプリケーションのインストール中にエラーが発生しました。サポートにお問い合わせください。 + + + PC を再起動してインストールを完了します。 + + + インストールに失敗しました。PC を再起動してから、もう一度お試しください。 + + + PC が再起動してインストールが完了します。 + + + ユーザーがインストールを取り消しました。 + + + このアプリケーションの別のバージョンが既にインストールされています。 + + + このアプリケーションの上位バージョンは既にインストールされています。 + + + 組織のポリシーが原因でインストールできません。管理者にお問い合わせください。 + + + パッケージの依存関係をインストールできませんでした。 + + + アプリケーションは現在別のアプリケーションで使用されています。 + + + パラメーターが無効です。 + + + パッケージはシステムでサポートされていません。 + + + インストーラーは既存のパッケージのアップグレードをサポートしていません。 + + + パッケージのアプリと機能エントリが見つかりませんでした。 + + + インストールの場所は適用できません。 + + + インストールの場所が見つかりませんでした。 + + + 既存のファイルのハッシュが一致しませんでした。 + + + ファイルが見つかりませんでした。 + + + ファイルは見つかりましたが、ハッシュはチェックされませんでした。 + + + ファイルにアクセスできませんでした。 + + + 構成ファイルが無効です。 + + + YAML 構文が無効です。 + + + 構成フィールドの型が無効です。 + + + 構成のバージョンが不明です。 + + + 構成の適用中にエラーが発生しました。 + + + 重複する識別子が構成に含まれています。 + + + 構成に依存関係がありません。 + + + 構成に不十分な依存関係があります。 + + + 構成単位のアサーションが失敗しました。 + + + この構成は手動でスキップされました。 + + + ユーザーが実行の続行を拒否しました。 + + + 依存関係グラフに、解決できない循環が含まれています。 + + + 構成に無効なフィールド値が含まれています。 + + + 構成にフィールドがありません。 + + + 状態のテスト中に一部の構成ユニットが失敗しました。 + + + 構成の状態がテストされませんでした。 + + + 構成ユニットはインストールされませんでした。 + + + 構成単位が見つかりませんでした。 + + + 構成単位に一致する項目が複数見つかりました。モジュールを指定して、正しいモジュールを選択してください。 + + + 現在のシステム状態の取得中に構成単位が失敗しました。 + + + 現在のシステム状態のテスト中に構成単位が失敗しました。 + + + 必要な状態の適用中に構成単位が失敗しました。 + + + 構成単位のモジュールは、同じバージョンの複数の場所で使用できます。 + + + 構成単位のモジュールを読み込めませんでした。 + + + 構成単位が実行中に予期しない結果を返しました。 + + + ユニットに構成ルートを必要とする設定が含まれています。 + + + 構成プロセッサでは操作がサポートされていません。 + + + 利用不可 + + + Windows 機能の依存関係が正常に有効になりました + + + 構成単位のモジュールを読み込めませんでした。実行するには管理者特権が必要です。 + + + ユニットに構成ルートを必要とする設定が含まれています。 + + + 構成単位のモジュールを読み込めませんでした。実行するには管理者特権が必要です。 + + + 保存されたコマンドの一意識別子を渡すことで、以前に保存されたコマンドの実行を再開します。これは、再起動のために終了した可能性のある、実行されたコマンドを再開するために使用されます。 + + + 以前に保存したコマンドの実行を再開します。 + + + 再開する保存された状態の一意識別子 + + + 別のクライアント バージョンからの状態の再開はサポートされていません: {0} + {Locked= "{0}"} Message displayed to inform the user that the client version of the resume state does not match the current client version. {0} is a placeholder for the client version that created the resume state. + + + 再開状態が存在しません: {0} + {Locked="{0}" Error message displayed when the user provides a guid that does not correspond to a valid saved state. {0} is a placeholder replaced by the provided guid string. + + + 再開状態のデータが見つかりません。 + + + このコマンドは再開をサポートしていません。 + + + 適用可能な場合は再起動を許可します + + + 再起動を開始して操作を完了しています... + + + 再起動を開始できませんでした。 + + + 再開操作が、許可されている再開 {0} 制限を超えています。手動で再開するには、コマンド '{1}' を実行してください。 + {Locked="{0}", "{1}"} {0} is a placeholder that is replaced by an integer number of the number of allowed resumes. {1} is a placeholder for the command to run to perform a manual resume. + + + 保存された状態の再開の制限を無視する + + + URI スキームはサポートされていません: {0} + {Locked="{0}"} Error message displayed when the provided uri is not supported. {0} is a placeholder replaced by the provided uri. + + + 整形式の URL ではありません: {0} + {Locked="{0}"} Error message displayed when the provided uri is not well formed. {0} is a placeholder replaced by the provided uri. + + + 構成単位の設定コンテンツ {0} 解析できなかったか、設定コンテンツが空です。 + {Locked="{0}"} {0} is a placeholder replaced by the input winget configure resource unit type. + + + {0} 構成単位に必要な引数がありません: {1} + {Locked="{0},{1}"} {0} is a placeholder for the input winget configure resource unit type. {1} is placeholder for the missing arg. + + + {0} 構成単位に推奨引数がありません: {1} + {Locked="{0},{1}"} {0} is a placeholder for the input winget configure resource unit type. {1} is placeholder for the missing arg. + + + WinGetSource の構成ユニットが既知のソースと競合しています: {0} + {Locked="WinGetSource,{0}"} {0} is a placeholder for the input winget source in the configuration unit settings. + + + WinGetSource の構成ユニットがサード パーティのソースに対してアサートしています: {0} + {Locked="WinGetSource,{0}"} {0} is a placeholder for the input winget source in the configuration unit settings. + + + WinGetPackage で UseLatest と Version の両方が宣言されています。パッケージ ID: {0} + {Locked="WinGetPackage,UseLatest,Version,{0}"} + + + WinGetPackage 構成単位は、サード パーティのソースからのパッケージに対してアサートします。パッケージ ID: {0};ソース: {1} + {Locked="WinGetPackage,{0},{1}"} + + + WinGetPackage 構成単位パッケージは、以前に構成されていないサード パーティのソースに依存しています。パッケージ ID: {0};ソース: {1} + {Locked="WinGetPackage,{0},{1}"} + + + WinGetPackage 構成単位パッケージはサード パーティのソースに依存しています。uni dependsOn セクションで依存関係を宣言することをお勧めします。パッケージ ID: {0};ソース: {1} + {Locked="WinGetPackage,dependsOn,{0},{1}"} + + + WinGetPackage 構成単位パッケージを検証できません。ソースを開けませんでした。パッケージ ID: {0};ソース: {1} + {Locked="WinGetPackage,{0},{1}"} + + + WinGetPackage 構成単位パッケージを検証できません。パッケージが見つかりません。パッケージ ID: {0} + {Locked="WinGetPackage,{0}"} + + + WinGetPackage 構成単位パッケージを検証できません。複数のパッケージが見つかりました。パッケージ ID: {0} + {Locked="WinGetPackage,{0}"} + + + WinGetPackage 構成単位パッケージを検証できません。パッケージ バージョンが見つかりません。パッケージ ID: {0};バージョン {1} + {Locked="WinGetPackage,{0},{1}"} + + + 特定のバージョンで指定された WinGetPackage 構成ユニット パッケージ。使用可能なパッケージのバージョンは 1 つだけです。パッケージ ID: {0}; バージョン: {1} + {Locked="WinGetPackage,{0},{1}"} + + + WinGetPackage 構成単位パッケージを検証できません。パッケージ ID: {0} + {Locked="WinGetPackage,{0}"} + + + 認証ウィンドウの設定を指定する (silent、silentPreferred、または interactive) + {Locked="silent","silentPreferred","interactive"} This argument allows the user to select authentication window popup behavior. + + + 認証に使用するアカウントを指定します + + + ソースを追加できませんでした。この winget バージョンは、ソースの認証方法をサポートしていません。最新の winget バージョンにアップグレードしてみてください。 + {Locked="winget"} + + + {0} ソースには認証が必要です。必要に応じて認証プロンプトが表示されることがあります。認証された情報は、アクセス承認のためにソースと共有されます。 + {Locked="{0}"} + + + インストールされたパッケージリスト、またはマニフェストから検索し、選択されたパッケージを修復します。既定では、クエリはパッケージのID、名前、モニカーに大文字小文字の区別なく一致する必要があります。その他のフィールドは、適切なオプションを渡すことで使用することができます。 + id, name, and moniker are all named values in our context, and may benefit from not being translated. The match must be for any of them, with comparison ignoring case. + + + 選択したパッケージを修復します + + + このパッケージの修復コマンドが見つかりません。サポートが必要な場合は、パッケージの発行元にお問い合わせください。 + + + 使用中のインストーラー テクノロジが、現在インストールされているバージョンと一致しません。 + + + 修復コマンドが見つかりません。 + + + 使用中のインストーラー テクノロジは修復をサポートしていません。 + + + 修復操作が正常に完了しました。 + + + 修復が中止されました + + + パッケージの修復を開始しています... + + + Microsoft Store パッケージを修復できませんでした。エラー コード: {0} + {Locked="{0}"} Error message displayed when a Microsoft Store application package fails to repair. {0} is a placeholder replaced by an error code. + + + 修復操作に失敗しました。 + + + 修復操作は適用できません。 + + + 構成されたソースから入手できるパッケージ バージョンの中に、一致するものはありません。 + + + 現在のシステム構成では、このパッケージの修復はサポートされていません。 + + + 使用中のインストーラー テクノロジは修復をサポートしていません。 + + + 管理者特権で実行している場合、ユーザー スコープ用にインストールされたパッケージは修復できません。 + + + 管理者特権を含む修復操作は、ユーザースコープ内にインストールされたパッケージでは許可されていません。 + + + 修復が終了コードで失敗しました: {0} + {Locked="{0}"} Error message displayed when an attempt to repair an application package fails. {0} is a placeholder replaced by an error code. + \ No newline at end of file diff --git a/Localization/Resources/ko-KR/winget.resw b/Localization/Resources/ko-KR/winget.resw index de853c03ff..f551778486 100644 --- a/Localization/Resources/ko-KR/winget.resw +++ b/Localization/Resources/ko-KR/winget.resw @@ -261,6 +261,9 @@ ID를 기준으로 결과 필터링 + + 경고 출력을 표시하지 않습니다. + 이 응용 프로그램의 라이선스는 그 소유자가 사용자에게 부여했습니다. @@ -871,8 +874,8 @@ JSON 파일에서 인식되는 스키마를 지정하지 않습니다. - 설치 범위 선택(사용자 또는 컴퓨터) - This argument allows the user to select between installing for just the user or for the entire machine. + 설치 범위 선택(user 또는 machine) + {Locked="user","machine"} This argument allows the user to select between installing for just the user or for the entire machine. '{0}' 인수에 제공된 값이 잘못되었습니다. 유효한 값: {1} @@ -1018,8 +1021,8 @@ Dependency graph has loop - manifest: {0} {1} 적합한 설치 관리자를 찾을 수 없습니다. - {Locked="{0} {1}"} Error message displayed when an attempt to get a preferred installer for a manifest fails. {0} is a placeholder replaced by the manifest identifier. {1} is a placeholder replaced by the manifest version. + 매니페스트에 적합한 설치 관리자를 찾을 수 없습니다. {0} 버전 {1} + {Locked="{0}","{1}"} Error message displayed when an attempt to get a preferred installer for a manifest fails. {0} is a placeholder replaced by the manifest identifier. {1} is a placeholder replaced by the manifest version. 패키지 종속성을 처리하는 동안 오류가 발생했습니다. 설치를 계속하시겠습니까? @@ -1611,8 +1614,8 @@ 설정 파일을 로드할 수 없습니다. 기본값을 사용합니다. - 설치된 패키지 범위 필터 선택(사용자 또는 컴퓨터) - This argument allows the user to select installed packages for just the user or for the entire machine. + 설치된 패키지 범위 필터 선택(user 또는 machine) + {Locked="user","machine"} This argument allows the user to select installed packages for just the user or for the entire machine. 고정이 추가됨 @@ -1697,6 +1700,9 @@ {0} 패키지에 업그레이드 전에 제거해야 하는 PIN이 있습니다. {Locked="{0}"} {0} is a placeholder that is replaced by an integer number of packages with pins that prevent upgrade + + winget을 사용하여 패키지를 업그레이드할 수 없습니다. 게시자가 제공한 메서드를 사용하여 이 패키지를 업그레이드하세요. + 차단되지 않는 PIN이 있는 경우에도 패키지 업그레이드 @@ -1832,13 +1838,13 @@ {Locked="--force"} - {0}[{1}]을(를) 사용하도록 설정하는 중 - {Locked="{0}","{1}"} Message displayed to the user regarding which Windows Feature is being enabled. + [{0} ]활성화하는 중... + {Locked="{0}"} Message displayed to the user regarding which Windows Feature is being enabled. - {0}[{1}] 기능을 사용하도록 설정하지 못했습니다. - {Locked="{0}"} Windows Feature display name -{Locked="{1}"} Windows Feature name + [{0}] 기능을 사용하도록 설정하지 못했습니다.{1} + {Locked="{0}","{1}"} An error when enabling a Windows Feature. {0} is a placeholder for the name of the Windows Feature. +{1} is a placeholder for the unrecognized error code. Windows 기능을 완전히 사용하도록 설정하려면 다시 부팅해야 합니다. --force로 인해 계속 @@ -2068,10 +2074,744 @@ 모듈을 저장할 로컬 컴퓨터의 위치를 지정합니다. 기본값 %LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules - {Locked="allusers","currentuser","default","%LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules"} + {Locked="%LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules"} '--module-path' 값은 'currentuser', 'allusers', 'default' 또는 절대 경로여야 합니다. {Locked="{--module-path}, {currentuser}, {allusers}, {default}} + + Windows 패키지 관리자 구성 사용 + + + 오류에 대한 정보를 검색합니다. 숫자로 지정하면 출력에 winget 특정 오류인 경우 기호 이름을 포함하여 오류에 대한 세부 정보가 포함됩니다. 문자열이 지정되면 winget 관련 오류가 이 값을 검색합니다. + + + 오류에 대한 정보 가져오기 + + + 오류 정보 내에서 검색할 값입니다. + + + 주어진 숫자가 너무 커서 HRESULT가 될 수 없습니다. + + + 알 수 없는 오류 코드 + + + 내부 오류 + + + 잘못된 명령줄 인수 + + + 명령을 실행하지 못했습니다. + + + 매니페스트를 열지 못했습니다. + + + 취소 신호 수신됨 + + + ShellExecute를 실행하지 못했습니다. + + + 매니페스트를 처리할 수 없습니다. 매니페스트 버전이 지원되는 버전보다 높습니다. 클라이언트를 업데이트하세요. + + + 설치 관리자를 다운로드하지 못했습니다. + + + 인덱스에 쓸 수 없습니다. 상위 스키마 버전입니다. + + + 인덱스가 손상되었습니다. + + + 구성된 원본 정보가 손상되었습니다. + + + 원본 이름이 이미 구성되어 있습니다. + + + 원본 유형이 잘못되었습니다. + + + MSIX 파일은 패키지가 아닌 번들입니다. + + + 원본에 필요한 데이터가 없습니다. + + + 현재 시스템에 적용할 수 있는 설치 관리자가 없습니다. + + + 설치 관리자 파일의 해시가 매니페스트와 일치하지 않습니다. + + + 원본 이름이 없습니다. + + + 원본 위치가 이미 다른 이름으로 구성되어 있습니다. + + + 패키지를 찾을 수 없음 + + + 원본이 구성되지 않았습니다. + + + 조건과 일치하는 여러 패키지가 있습니다. + + + 조건과 일치하는 매니페스트를 찾을 수 없습니다. + + + 원본 패키지에서 공용 폴더를 가져오지 못했습니다. + + + 명령을 실행하려면 관리자 권한이 필요합니다. + + + 원본 위치가 안전하지 않습니다. + + + Microsoft Store 클라이언트가 정책에 의해 차단됨 + + + Microsoft Store 앱이 정책에 의해 차단됨 + + + 이 기능은 현재 개발 중입니다. winget 설정을 사용하여 사용하도록 설정할 수 있습니다. + + + Microsoft Store 앱을 설치하지 못했습니다. + + + 자동 완성을 수행하지 못했습니다. + + + YAML 파서 초기화 실패 + + + 잘못된 YAML 키가 발견되었습니다. + + + 중복된 YAML 키가 발견되었습니다. + + + 잘못된 YAML 작업 + + + YAML 문서를 빌드하지 못했습니다. + + + 잘못된 YAML 발신기 상태 + + + 잘못된 YAML 데이터 + + + LibYAML 오류 + + + 매니페스트 유효성 검사에 성공했으나 경고가 발생했습니다. + + + 매니페스트 유효성 검사 실패 + + + 매니페스트가 잘못되었습니다. + + + 적용 가능한 업데이트를 찾을 수 없음 + + + winget 업그레이드 -- 모두 실패로 완료됨 + + + 설치 관리자에서 보안 검사 실패 + + + 다운로드 크기가 예상 콘텐츠 길이와 일치하지 않습니다. + + + 제거 명령을 찾을 수 없음 + + + 제거 명령을 실행하지 못했습니다. + + + ICU 중단 반복기 오류 + + + ICU casemap 오류 + + + ICU regex 오류 + + + 가져온 패키지를 하나 이상 설치하지 못했습니다. + + + 요청한 패키지를 하나 이상 찾을 수 없습니다. + + + Json 파일이 잘못되었습니다. + + + 원본 위치가 원격이 아닙니다. + + + 구성된 rest 원본은 지원되지 않습니다. + + + REST 원본에서 반환된 데이터가 잘못되었습니다. + + + 작업이 그룹 정책 의해 차단되었습니다. + + + Rest 원본 내부 오류 + + + 잘못된 REST 원본 URL + + + rest 원본에서 반환된 지원되지 않는 MIME 형식 + + + 잘못된 REST 원본 계약 버전 + + + 원본 데이터가 손상되었거나 변조되었습니다. + + + 스트림에서 읽는 동안 오류가 발생했습니다. + + + 패키지 계약이 다음에 동의하지 않았습니다. + + + 프롬프트에서 입력을 읽는 동안 오류가 발생했습니다. + + + 하나 이상의 원본에서 검색 요청을 지원하지 않습니다. + + + 나머지 원본 엔드포인트를 찾을 수 없습니다. + + + 원본을 열지 못했습니다. + + + 원본 계약이 다음에 동의하지 않았습니다. + + + 헤더 크기가 허용되는 제한인 1024자를 초과합니다. 크기를 줄이고 다시 시도하세요. + + + 누락된 리소스 파일 + + + MSI 설치를 실행하지 못했습니다. + + + msiexec에 대한 인수가 잘못되었습니다. + + + 하나 이상의 원본을 열지 못했습니다. + + + 종속성 유효성을 검사하지 못했습니다. + + + 하나 이상의 패키지가 없습니다. + + + 잘못된 테이블 열 + + + 업그레이드 버전이 설치된 버전보다 최신 버전이 아닙니다. + + + 업그레이드 버전을 알 수 없으며 재정의가 지정되지 않았습니다. + + + ICU 변환 오류 + + + 휴대용 패키지를 설치하지 못했습니다. + + + 볼륨에서 다시 지점 구문 분석을 지원하지 않습니다. + + + 다른 원본의 휴대용 패키지가 이미 있습니다. + + + symlink를 만들 수 없습니다. 경로가 디렉터리를 가리킵니다. + + + 관리자 컨텍스트에서 설치 관리자를 실행할 수 없습니다. + + + 휴대용 패키지를 제거하지 못했습니다. + + + 인덱스에 대해 DisplayVersion 값의 유효성을 검사하지 못했습니다. + + + 하나 이상의 인수가 지원되지 않습니다. + + + 포함된 null 문자는 SQLite에 대해 허용되지 않습니다. + + + 보관함에서 중첩 설치 관리자를 찾지 못했습니다. + + + 보관 파일을 추출하지 못했습니다. + + + 제공된 중첩 설치 관리자의 상대 파일 경로가 잘못되었습니다. + + + 서버 인증서가 필요한 값과 일치하지 않습니다. + + + 설치 위치를 제공해야 합니다. + + + 보관 맬웨어 검색에 실패했습니다. + + + 설치된 패키지의 버전을 하나 이상 찾았습니다. + + + 패키지에 대한 핀이 이미 있습니다. + + + 패키지에 대한 핀이 없습니다. + + + 고정 데이터베이스를 열 수 없습니다. + + + 하나 이상의 응용 프로그램을 설치하지 못했습니다. + + + 하나 이상의 애플리케이션을 제거하지 못했습니다. + + + 하나 이상의 쿼리가 정확히 하나의 일치 항목을 반환하지 않았습니다. + + + 패키지에 업그레이드를 방지하는 PIN이 있습니다. + + + 현재 설치된 패키지는 스텁 패키지입니다. + + + 응용 프로그램 종료 신호 수신됨 + + + 패키지 종속성을 다운로드하지 못했습니다. + + + 패키지를 다운로드하지 못했습니다. 오프라인 설치를 위해 다운로드할 수 없습니다. + + + 필요한 서비스가 사용 중이거나 사용할 수 없습니다. 나중에 다시 시도하세요. + + + 제공된 GUID가 올바른 다시 시작 상태에 해당하지 않습니다. + + + 현재 클라이언트 버전이 저장된 상태의 클라이언트 버전과 일치하지 않습니다. + + + 다시 시작 상태 데이터가 잘못되었습니다. + + + 검사점 데이터베이스를 열 수 없습니다. + + + 최대 다시 시작 제한을 초과했습니다. + + + 잘못된 인증 정보입니다. + + + 지원되지 않는 인증 방법입니다. + + + 인증에 실패했습니다. + + + 인증에 실패했습니다. 대화형 인증이 필요합니다. + + + 인증에 실패했습니다. 사용자가 취소했습니다. + + + 인증에 실패했습니다. 인증된 계정이 원하는 계정이 아닙니다. + + + 응용 프로그램이 현재 실행 중입니다. 애플리케이션을 종료한 후 다시 시도하세요. + + + 다른 설치가 이미 진행 중입니다. 나중에 다시 시도하세요. + + + 하나 이상의 파일을 사용하고 있습니다. 애플리케이션을 종료한 후 다시 시도하세요. + + + 이 패키지에 시스템에 종속성이 없습니다. + + + PC에 더 이상 공간이 없습니다. 공간을 확보한 후 다시 시도하세요. + + + 설치할 수 있는 메모리가 부족합니다. 다른 애플리케이션을 닫은 후 다시 시도하세요. + + + 이 응용 프로그램을 사용하려면 인터넷에 연결해야 합니다. 네트워크에 연결한 후 다시 시도하세요. + + + 설치하는 동안 이 응용 프로그램에 오류가 발생했습니다. 고객 지원에 문의하세요. + + + PC를 다시 시작하여 설치를 완료합니다. + + + 설치하지 못했습니다. PC를 다시 시작한 후 다시 시도하세요. + + + 설치를 마치기 위해 PC가 다시 시작됩니다. + + + 설치를 취소했습니다. + + + 이 응용 프로그램의 다른 버전이 이미 설치되어 있습니다. + + + 이 응용 프로그램의 상위 버전이 이미 설치되어 있습니다. + + + 조직 정책으로 인해 설치할 수 없습니다. 관리자에게 문의하세요. + + + 패키지 종속성을 설치하지 못했습니다. + + + 현재 다른 응용 프로그램에서 응용 프로그램을 사용하고 있습니다. + + + 잘못된 매개 변수입니다. + + + 시스템에서 패키지가 지원되지 않습니다. + + + 설치 관리자가 기존 패키지 업그레이드를 지원하지 않습니다. + + + 패키지에 대한 앱 및 기능 항목을 찾을 수 없습니다. + + + 설치 위치를 적용할 수 없습니다. + + + 설치 위치를 찾을 수 없습니다. + + + 기존 파일의 해시가 일치하지 않습니다. + + + 파일을 찾을 수 없습니다. + + + 파일을 찾았지만 해시가 확인되지 않았습니다. + + + 파일에 액세스할 수 없습니다. + + + 구성 파일이 잘못되었습니다. + + + YAML 구문이 잘못되었습니다. + + + 구성 필드에 잘못된 형식이 있습니다. + + + 구성에 알 수 없는 버전이 있습니다. + + + 구성을 적용하는 동안 오류가 발생했습니다. + + + 구성에 중복 식별자가 포함되어 있습니다. + + + 구성에 종속성이 없습니다. + + + 구성에 만족스럽지 않은 종속성이 있습니다. + + + 구성 단위에 대한 어설션이 실패했습니다. + + + 구성을 수동으로 건너뛰었습니다. + + + 사용자가 실행을 계속하기를 거부했습니다. + + + 종속성 그래프 확인할 수 없는 주기가 포함되어 있습니다. + + + 구성에 잘못된 필드 값이 있습니다. + + + 구성에 필드가 없습니다. + + + 상태를 테스트하는 동안 일부 구성 단위가 실패했습니다. + + + 구성 상태가 테스트되지 않았습니다. + + + 구성 단위가 설치되지 않았습니다. + + + 구성 단위를 찾을 수 없습니다. + + + 구성 단위와 일치하는 항목이 여러 개 있습니다. 모듈을 지정하여 올바른 모듈을 선택하십시오. + + + 현재 시스템 상태를 가져오는 동안 구성 단위가 실패했습니다. + + + 현재 시스템 상태를 테스트하는 동안 구성 단위가 실패했습니다. + + + 원하는 상태를 적용하는 동안 구성 단위가 실패했습니다. + + + 구성 단위의 모듈은 같은 버전으로 여러 위치에서 사용할 수 있습니다. + + + 구성 단위에 대한 모듈을 로드하지 못했습니다. + + + 구성 단위가 실행 중에 예기치 않은 결과를 반환했습니다. + + + 구성 루트가 필요한 설정이 단위에 포함되어 있습니다. + + + 구성 프로세서에서 지원하지 않는 작업입니다. + + + 사용할 수 없음 + + + Windows 기능 종속성을 사용하도록 설정함 + + + 구성 단위를 실행하려면 관리자 권한이 필요하므로 구성 단위에 대한 모듈을 로드하지 못했습니다. + + + 구성 루트가 필요한 설정이 단위에 포함되어 있습니다. + + + 구성 단위를 실행하려면 관리자 권한이 필요하므로 구성 단위에 대한 모듈을 로드하지 못했습니다. + + + 저장된 명령의 고유 식별자를 전달하여 이전에 저장한 명령의 실행을 다시 시작합니다. 다시 부팅으로 인해 종료되었을 수 있는 실행된 명령을 다시 시작하는 데 사용됩니다. + + + 이전에 저장된 명령의 실행을 다시 시작합니다. + + + 다시 시작할 저장된 상태의 고유 식별자입니다. + + + 다른 클라이언트 버전에서 상태를 다시 시작하는 것은 지원되지 않습니다. {0} + {Locked= "{0}"} Message displayed to inform the user that the client version of the resume state does not match the current client version. {0} is a placeholder for the client version that created the resume state. + + + 다시 시작 상태가 없습니다. {0} + {Locked="{0}" Error message displayed when the user provides a guid that does not correspond to a valid saved state. {0} is a placeholder replaced by the provided guid string. + + + 다시 시작 상태에서 데이터를 찾을 수 없습니다. + + + 이 명령은 다시 시작이 지원되지 않습니다. + + + 해당하는 경우 다시 부팅 허용 + + + 작업을 완료하기 위해 다시 부팅을 시작하는 중... + + + 다시 부팅을 시작하지 못했습니다. + + + 다시 시작 작업이 허용되는 {0} 다시 시작 제한을 초과합니다. 수동으로 다시 시작하려면 '{1}' 명령을 실행하십시오. + {Locked="{0}", "{1}"} {0} is a placeholder that is replaced by an integer number of the number of allowed resumes. {1} is a placeholder for the command to run to perform a manual resume. + + + 저장된 상태 다시 시작 시 제한 무시 + + + {0} URI 체계는 지원되지 않습니다. + {Locked="{0}"} Error message displayed when the provided uri is not supported. {0} is a placeholder replaced by the provided uri. + + + URI 형식이 잘못되었습니다. {0} + {Locked="{0}"} Error message displayed when the provided uri is not well formed. {0} is a placeholder replaced by the provided uri. + + + 구성 단위 설정 콘텐츠 또는 설정 콘텐츠가 비어 {0} 구문 분석하지 못했습니다. + {Locked="{0}"} {0} is a placeholder replaced by the input winget configure resource unit type. + + + {0} 구성 단위에 필수 인수가 없습니다. {1} + {Locked="{0},{1}"} {0} is a placeholder for the input winget configure resource unit type. {1} is placeholder for the missing arg. + + + {0} 구성 단위에 권장 인수가 없습니다. {1} + {Locked="{0},{1}"} {0} is a placeholder for the input winget configure resource unit type. {1} is placeholder for the missing arg. + + + WinGetSource 구성 단위가 알려진 원본과 충돌합니다. {0} + {Locked="WinGetSource,{0}"} {0} is a placeholder for the input winget source in the configuration unit settings. + + + WinGetSource 구성 단위는 타사 원본에서 어설션합니다. {0} + {Locked="WinGetSource,{0}"} {0} is a placeholder for the input winget source in the configuration unit settings. + + + WinGetPackage가 UseLatest와 Version을 모두 선언합니다. 패키지 ID: {0} + {Locked="WinGetPackage,UseLatest,Version,{0}"} + + + WinGetPackage 구성 단위는 타사 소스의 패키지에 대해 어설션합니다. 패키지 ID: {0}; 원본: {1} + {Locked="WinGetPackage,{0},{1}"} + + + WinGetPackage 구성 단위 패키지는 이전에 구성되지 않은 타사 원본에 종속됩니다. 패키지 ID: {0}; 원본: {1} + {Locked="WinGetPackage,{0},{1}"} + + + WinGetPackage 구성 단위 패키지는 타사 원본에 종속됩니다. uni dependsOn 섹션에 종속성을 선언하는 것이 좋습니다. 패키지 ID: {0}; 원본: {1} + {Locked="WinGetPackage,dependsOn,{0},{1}"} + + + WinGetPackage 구성 단위 패키지의 유효성을 검사할 수 없습니다. 원본을 열지 못했습니다. 패키지 ID: {0}; 원본: {1} + {Locked="WinGetPackage,{0},{1}"} + + + WinGetPackage 구성 단위 패키지의 유효성을 검사할 수 없습니다. 패키지를 찾을 수 없습니다. 패키지 ID: {0} + {Locked="WinGetPackage,{0}"} + + + WinGetPackage 구성 단위 패키지의 유효성을 검사할 수 없습니다. 패키지를 두 개 이상 찾았습니다. 패키지 ID: {0} + {Locked="WinGetPackage,{0}"} + + + WinGetPackage 구성 단위 패키지의 유효성을 검사할 수 없습니다. 패키지 버전을 찾을 수 없습니다. 패키지 ID: {0}; 버전 {1} + {Locked="WinGetPackage,{0},{1}"} + + + WinGetPackage 구성 단위 패키지는 특정 버전으로 지정되지만 하나의 패키지 버전만 사용할 수 있습니다. 패키지 ID: {0}, 버전: {1} + {Locked="WinGetPackage,{0},{1}"} + + + WinGetPackage 구성 단위 패키지의 유효성을 검사할 수 없습니다. 패키지 ID: {0} + {Locked="WinGetPackage,{0}"} + + + 인증 창 기본 설정 지정(silent, silentPreferred 또는 interactive) + {Locked="silent","silentPreferred","interactive"} This argument allows the user to select authentication window popup behavior. + + + 인증에 사용할 계정 지정 + + + 원본을 추가하지 못했습니다. 이 winget 버전에서는 원본의 인증 방법을 지원하지 않습니다. 최신 winget 버전으로 업그레이드해 보세요. + {Locked="winget"} + + + {0} 원본을 인증해야 합니다. 필요한 경우 인증 프롬프트가 표시될 수 있습니다. 인증된 정보는 액세스 권한 부여를 위해 원본과 공유됩니다. + {Locked="{0}"} + + + 설치된 패키지 목록을 검색하거나 매니페스트에서 직접 선택한 패키지를 복구합니다. 기본적으로 쿼리는 대/소문자를 구분하지 않는 패키지의 ID, 이름 또는 모니커와 일치해야 합니다. 다른 필드는 해당 옵션을 전달하여 사용할 수 있습니다. + id, name, and moniker are all named values in our context, and may benefit from not being translated. The match must be for any of them, with comparison ignoring case. + + + 선택한 패키지를 복구합니다. + + + 이 패키지에 대한 복구 명령을 찾을 수 없습니다. 지원을 받으려면 패키지 게시자에 문의하세요. + + + 사용 중인 설치 관리자 기술이 현재 설치된 버전과 일치하지 않습니다. + + + 복구 명령을 찾을 수 없습니다. + + + 사용 중인 설치 관리자 기술이 복구를 지원하지 않습니다. + + + 복구 작업이 완료되었습니다. + + + 복구 중단됨 + + + 패키지 복구를 시작하는 중... + + + Microsoft Store 패키지를 복구하지 못했습니다. 오류 코드: {0} + {Locked="{0}"} Error message displayed when a Microsoft Store application package fails to repair. {0} is a placeholder replaced by an error code. + + + 복구 작업에 실패했습니다. + + + 복구 작업은 적용할 수 없습니다. + + + 구성된 원본에서 사용할 수 있는 일치하는 패키지 버전이 없습니다. + + + 현재 시스템 구성은 이 패키지의 복구를 지원하지 않습니다. + + + 사용 중인 설치 관리자 기술이 복구를 지원하지 않습니다. + + + 관리자 권한으로 실행하는 경우 사용자 scope 위해 설치된 패키지를 복구할 수 없습니다. + + + 사용자 scope 내에 설치된 패키지에서는 관리자 권한과 관련된 복구 작업이 허용되지 않습니다. + + + 복구하지 못했습니다. 종료 코드: {0} + {Locked="{0}"} Error message displayed when an attempt to repair an application package fails. {0} is a placeholder replaced by an error code. + \ No newline at end of file diff --git a/Localization/Resources/pt-BR/winget.resw b/Localization/Resources/pt-BR/winget.resw index 13d0f0769c..2c8ba5aaf2 100644 --- a/Localization/Resources/pt-BR/winget.resw +++ b/Localization/Resources/pt-BR/winget.resw @@ -261,6 +261,9 @@ Eles podem ser configurados por meio do arquivo de configurações ' winget sett Filtrar resultados por id + + Suprime as saídas de aviso. + Este aplicativo é licenciado para você pelo proprietário. @@ -871,8 +874,8 @@ Eles podem ser configurados por meio do arquivo de configurações ' winget sett O arquivo JSON não especifica um esquema reconhecido. - Selecione instalar escopo (usuário ou máquina) - This argument allows the user to select between installing for just the user or for the entire machine. + Selecione instalar escopo (user ou machine) + {Locked="user","machine"} This argument allows the user to select between installing for just the user or for the entire machine. O valor fornecido para o argumento '{0}' é inválido; os valores válidos são: {1} @@ -1018,8 +1021,8 @@ A configuração está desabilitada devido à política de grupo. Dependency graph has loop - Nenhum instalador adequado encontrado para o manifesto: {0} {1} - {Locked="{0} {1}"} Error message displayed when an attempt to get a preferred installer for a manifest fails. {0} is a placeholder replaced by the manifest identifier. {1} is a placeholder replaced by the manifest version. + Nenhum instalador adequado encontrado para o manifesto: {0} versão {1} + {Locked="{0}","{1}"} Error message displayed when an attempt to get a preferred installer for a manifest fails. {0} is a placeholder replaced by the manifest identifier. {1} is a placeholder replaced by the manifest version. Erro ao processar dependências de pacote. Deseja continuar a instalação? @@ -1611,8 +1614,8 @@ Especifique um deles usando a opção --source para continuar. Não foi possível carregar o arquivo de configurações. Usando valores padrão. - Selecione o filtro de escopo do pacote instalado (usuário ou computador) - This argument allows the user to select installed packages for just the user or for the entire machine. + Selecione o filtro de escopo do pacote instalado (user ou machine) + {Locked="user","machine"} This argument allows the user to select installed packages for just the user or for the entire machine. Marcador adicionado com êxito @@ -1697,6 +1700,9 @@ Especifique um deles usando a opção --source para continuar. {0} pacote(s) têm um pin que precisa ser removido antes da atualização {Locked="{0}"} {0} is a placeholder that is replaced by an integer number of packages with pins that prevent upgrade + + O pacote não pode ser atualizado usando winget. Use o método fornecido pelo editor para atualizar este pacote. + Atualizar pacotes mesmo que eles tenham um marcador sem bloqueio @@ -1832,13 +1838,13 @@ Especifique um deles usando a opção --source para continuar. {Locked="--force"} - Habilitando {0} [{1}]... - {Locked="{0}","{1}"} Message displayed to the user regarding which Windows Feature is being enabled. + Habilitando o [{0}]... + {Locked="{0}"} Message displayed to the user regarding which Windows Feature is being enabled. - Falha ao habilitar {0} recurso [{1}]. - {Locked="{0}"} Windows Feature display name -{Locked="{1}"} Windows Feature name + Falha ao habilitar o recurso [{0}]: {1} + {Locked="{0}","{1}"} An error when enabling a Windows Feature. {0} is a placeholder for the name of the Windows Feature. +{1} is a placeholder for the unrecognized error code. Reinicialização necessária para habilitar totalmente o(s) Recurso(s) do Windows; prosseguir devido a --force @@ -2068,10 +2074,744 @@ Especifique um deles usando a opção --source para continuar. Especifica o local no computador local para armazenar módulos. Padrão %LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules - {Locked="allusers","currentuser","default","%LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules"} + {Locked="%LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules"} O valor '--module-path' deve ser 'currentuser', 'allusers', 'default' ou um caminho absoluto. {Locked="{--module-path}, {currentuser}, {allusers}, {default}} + + Habilitar as Configurações do Gerenciador de Pacotes do Windows + + + Recuperar informações sobre erros. Dado um número, a saída conterá detalhes sobre o erro, incluindo o nome do símbolo se for um erro específico do winget. Dado uma cadeia de caracteres, os erros específicos do winget são pesquisados para esse valor. + + + Obter informações sobre erros + + + Um valor a ser pesquisado dentro das informações de erro + + + O número fornecido é muito grande para ser um HRESULT. + + + Código de erro desconhecido + + + ERRO INTERNO + + + Argumentos da linha de comando inválidos + + + Falha na execução do comando + + + Falha na abertura do manifesto + + + Sinal de cancelamento recebido + + + Falha na execução do ShellExecute + + + Não é possível processar o manifesto. A versão do manifesto é maior do que a suportada. Atualize o cliente. + + + Falha no download do instalador + + + Não é possível gravar no índice; é uma versão de esquema superior + + + O índice está corrompido + + + As informações da origem configurada estão corrompidas + + + O nome da origem já está configurado + + + O tipo de fonte é inválido + + + O arquivo MSIX é um pacote, não um pacote + + + Os dados exigidos pela origem estão ausentes + + + Nenhum dos instaladores é aplicável ao sistema atual + + + O hash do arquivo do instalador não corresponde ao manifesto + + + O nome da origem não existe + + + O local de origem já está configurado com outro nome + + + Nenhum pacote encontrado + + + Nenhuma fonte está configurada + + + Vários pacotes encontrados que correspondem aos critérios + + + Nenhum manifesto encontrado que corresponda aos critérios + + + Falha ao obter a pasta Pública do pacote de origem + + + O comando requer privilégios de administrador para ser executado + + + O local de origem não é seguro + + + O cliente da Microsoft Store está bloqueado pela política + + + O aplicativo da Microsoft Store está bloqueado pela política + + + O recurso está atualmente em desenvolvimento. Pode ser habilitado usando configurações de winget. + + + Falha ao instalar o aplicativo da Microsoft Store + + + Falha ao executar a conclusão automática + + + Falha ao inicializar o analisador YAML + + + Encontrou uma chave YAML inválida + + + Encontrou uma chave YAML duplicada + + + Operação YAML inválida + + + Falha ao criar o documento YAML + + + O estado do emissor YAML é inválido + + + Dados YAML inválidos + + + Erro da LibYAML + + + A validação do manifesto foi bem-sucedida com um aviso + + + Falha na validação do manifesto + + + O manifesto é inválido + + + Nenhuma atualização aplicável foi encontrada + + + A atualização do winget --all foi concluída com falhas + + + Falha na verificação de segurança do instalador + + + O tamanho do download não corresponde ao tamanho do conteúdo esperado + + + Comando de desinstalação não encontrado + + + Falha na execução do comando de desinstalação + + + Erro no iterador de interrupção de ICU + + + Erro no mapa de casos da ICU + + + Erro de regex ICU + + + Falha ao instalar um ou mais pacotes importados + + + Não foi possível localizar um ou mais pacotes solicitados + + + O arquivo Json é inválido + + + O local de origem não é remoto + + + Não há suporte para a origem REST configurada + + + Dados inválidos retornados pela origem REST + + + A operação está bloqueada pela Política de Grupo + + + Erro interno da origem REST + + + URL de origem REST inválida + + + Não há suporte para o tipo MIME retornado pela origem REST + + + Versão inválida do contrato da origem REST + + + Os dados de origem estão corrompidos ou adulterados + + + Erro na leitura do fluxo + + + Os contratos de pacotes não foram aceitos + + + Erro na leitura da entrada no prompt + + + Uma ou mais fontes não dão suporte à solicitação de pesquisa + + + O ponto de extremidade da origem REST não foi encontrado. + + + Falha ao abrir a origem. + + + Os contratos de origem não foram aceitos + + + O tamanho do cabeçalho excede o limite permitido de 1024 caracteres. Reduza o tamanho e tente novamente. + + + Arquivo de recurso ausente + + + Falha na execução da instalação MSI + + + Os argumentos para o msiexec são inválidos + + + Falha ao abrir uma ou mais fontes + + + Falha na validação das dependências + + + Um ou mais pacotes estão ausentes + + + Coluna de tabela inválida + + + A versão de atualização não é mais recente do que a versão instalada + + + A versão de atualização é desconhecida e a substituição não foi especificada + + + Erro de conversão de ICU + + + Falha ao instalar o pacote portátil + + + Não há suporte para pontos de reparo no volume + + + Já existe um pacote portátil de uma fonte diferente. + + + Não é possível criar symlink, o caminho aponta para um diretório. + + + O instalador não pode ser executado de um contexto de administrador. + + + Falha ao desinstalar o pacote portátil + + + Falha ao validar os valores de DisplayVersion em relação ao índice. + + + Não há suporte para um ou mais argumentos. + + + Os caracteres nulos inseridos não são permitidos no SQLite + + + Falha ao localizar o instalador aninhado no arquivo morto. + + + Falha ao extrair o arquivo. + + + Caminho de arquivo relativo inválido para o instalador aninhado fornecido. + + + O certificado do servidor não correspondeu a nenhum dos valores esperados. + + + O local de instalação deve ser fornecido. + + + Falha na verificação do arquivo de malware. + + + Encontrada pelo menos uma versão do pacote instalado. + + + Já existe uma marcação para o pacote. + + + Não há pino para o pacote. + + + Não é possível abrir o banco de dados de pinos. + + + Falha na instalação de um ou mais aplicativos + + + Falha na desinstalação de um ou mais aplicativos + + + Uma ou mais consultas não retornaram exatamente uma correspondência + + + O pacote tem um PIN que impede a atualização. + + + O pacote atualmente instalado é o pacote stub + + + Sinal de desligamento do aplicativo recebido + + + Falha no download das dependências do pacote. + + + Falha ao baixar o pacote. O download para instalação offline é proibido. + + + Um serviço necessário está ocupado ou indisponível. Tente novamente mais tarde. + + + O guid fornecido não corresponde a um estado de retomada válido. + + + A versão atual do cliente não correspondeu à versão do cliente do estado salvo. + + + Os dados do estado de retomada são inválidos. + + + Não é possível abrir o banco de dados de pontos de verificação. + + + Excedeu o limite máximo de retomadas. + + + Informações de autenticação inválidas. + + + Não há suporte para o método de autenticação. + + + Falha na autenticação. + + + Falha na autenticação. É necessária autenticação interativa. + + + Falha na autenticação. Usuário cancelado. + + + Falha na autenticação. A conta autenticada não é a conta desejada. + + + O aplicativo está em execução no momento. Saia do aplicativo e tente novamente. + + + Outra instalação já está em andamento. Tente novamente mais tarde. + + + Um ou mais arquivos estão sendo usados. Saia do aplicativo e tente novamente. + + + Este pacote tem uma dependência ausente do sistema. + + + Não há mais espaço no computador. Libere espaço e tente novamente. + + + Não há memória suficiente disponível para instalar. Fechar outros aplicativos e depois tentar novamente. + + + Este aplicativo requer conectividade com a Internet. Conecte-se a uma rede e tente novamente. + + + Este aplicativo encontrou um erro durante a instalação. Entre em contato com o suporte. + + + Reiniciar seu PC para terminar a instalação. + + + Falha na instalação. Reinicie o computador e tente novamente. + + + Seu PC será reiniciado para terminar a instalação. + + + Você cancelou a instalação. + + + Outra versão deste aplicativo já está instalada. + + + Uma versão superior deste aplicativo já está instalada. + + + As políticas da organização estão impedindo a instalação. Entre em contato com o administrador. + + + Falha ao instalar as dependências do pacote. + + + O aplicativo está sendo usado por outro aplicativo no momento. + + + Parâmetro inválido. + + + Não há suporte para o pacote no sistema. + + + O instalador não oferece suporte à atualização de um pacote existente. + + + Não foi possível encontrar a Entrada de Aplicativos e Recursos do pacote. + + + O local de instalação não é aplicável. + + + Não foi possível encontrar o local da instalação. + + + O hash do arquivo existente não correspondeu. + + + Arquivo não encontrado. + + + O arquivo foi encontrado, mas o hash não foi verificado. + + + O arquivo não pôde ser acessado. + + + O arquivo de configuração é inválido. + + + A sintaxe YAML é inválida. + + + Um campo de configuração tem um tipo inválido. + + + A configuração tem uma versão desconhecida. + + + Ocorreu um erro ao aplicar a configuração. + + + A configuração contém um identificador duplicado. + + + Uma dependência está ausente na configuração. + + + A configuração tem uma dependência não atendida. + + + Falha na instrução de declaração da unidade de configuração. + + + A configuração foi ignorada manualmente. + + + O usuário se recusou a continuar a execução. + + + O grafo de dependência contém um ciclo que não pode ser resolvido. + + + A configuração tem um valor de campo inválido. + + + A configuração está ausente em um campo. + + + Algumas das unidades de configuração falharam ao testar seu estado. + + + O estado de configuração não foi testado. + + + A unidade de configuração não foi instalada. + + + Não foi possível encontrar a unidade de configuração. + + + Foram encontradas várias correspondências para a unidade de configuração. Especifique o módulo para selecionar o correto. + + + A unidade de configuração falhou ao tentar obter o estado atual do sistema. + + + A unidade de configuração falhou ao tentar testar o estado atual do sistema. + + + A unidade de configuração falhou ao tentar aplicar o estado desejado. + + + O módulo para a unidade de configuração está disponível em vários locais com a mesma versão. + + + Falha ao carregar o módulo para a unidade de configuração. + + + A unidade de configuração retornou um resultado inesperado durante a execução. + + + Uma unidade contém uma configuração que requer a raiz de configuração. + + + Não há suporte para a operação no processador de configuração. + + + Não disponível + + + Habilitação bem-sucedida das Dependências de Recursos do Windows + + + Falha ao carregar o módulo para a unidade de configuração porque ele requer privilégios de administrador para ser executado. + + + Uma unidade contém uma configuração que requer a raiz de configuração. + + + Falha ao carregar o módulo para a unidade de configuração porque ele requer privilégios de administrador para ser executado. + + + Retoma a execução de um comando salvo anteriormente passando o identificador exclusivo do comando salvo. Isso é usado para retomar um comando executado que pode ter sido encerrado devido a uma reinicialização. + + + Retoma a execução de um comando salvo anteriormente. + + + O identificador exclusivo do estado salvo a ser retomado + + + Não há suporte para retomar o estado de uma versão de cliente diferente: {0} + {Locked= "{0}"} Message displayed to inform the user that the client version of the resume state does not match the current client version. {0} is a placeholder for the client version that created the resume state. + + + O estado de retomada não existe: {0} + {Locked="{0}" Error message displayed when the user provides a guid that does not correspond to a valid saved state. {0} is a placeholder replaced by the provided guid string. + + + Nenhum dado encontrado no estado do retomada. + + + Esse comando não dá suporte à retomada. + + + Permite uma reinicialização, se aplicável + + + Iniciando a reinicialização para concluir a operação... + + + Falha ao iniciar uma reinicialização. + + + A operação retomar excede o limite permitido de {0} retomada(s). Para retomar manualmente, execute o comando '{1}'. + {Locked="{0}", "{1}"} {0} is a placeholder that is replaced by an integer number of the number of allowed resumes. {1} is a placeholder for the command to run to perform a manual resume. + + + Ignorar o limite para retomar um estado salvo + + + Não há suporte para o esquema de URI: {0} + {Locked="{0}"} Error message displayed when the provided uri is not supported. {0} is a placeholder replaced by the provided uri. + + + O Uri não está bem formado: {0} + {Locked="{0}"} Error message displayed when the provided uri is not well formed. {0} is a placeholder replaced by the provided uri. + + + Falha ao analisar {0} conteúdo das configurações da unidade de configuração ou se o conteúdo das configurações está vazio. + {Locked="{0}"} {0} is a placeholder replaced by the input winget configure resource unit type. + + + {0} unidade de configuração não tem o argumento necessário: {1} + {Locked="{0},{1}"} {0} is a placeholder for the input winget configure resource unit type. {1} is placeholder for the missing arg. + + + {0} unidade de configuração não tem o argumento recomendado: {1} + {Locked="{0},{1}"} {0} is a placeholder for the input winget configure resource unit type. {1} is placeholder for the missing arg. + + + A unidade de configuração WinGetSource está em conflito com uma fonte conhecida: {0} + {Locked="WinGetSource,{0}"} {0} is a placeholder for the input winget source in the configuration unit settings. + + + A unidade de configuração WinGetSource asser em uma fonte de terceiros: {0} + {Locked="WinGetSource,{0}"} {0} is a placeholder for the input winget source in the configuration unit settings. + + + WinGetPackage declara UseLatest e Version. ID do Pacote: {0} + {Locked="WinGetPackage,UseLatest,Version,{0}"} + + + A unidade de configuração WinGetPackage asser em um pacote de origem de terceiros. ID do Pacote: {0}; Origem: {1} + {Locked="WinGetPackage,{0},{1}"} + + + O pacote da unidade de configuração WinGetPackage depende de uma fonte de terceiros que não foi configurada anteriormente. ID do Pacote: {0}; Origem: {1} + {Locked="WinGetPackage,{0},{1}"} + + + O pacote da unidade de configuração WinGetPackage depende de uma fonte de terceiros. É recomendável declarar a dependência na seção uni dependsOn. ID do Pacote: {0}; Origem: {1} + {Locked="WinGetPackage,dependsOn,{0},{1}"} + + + O pacote da unidade de configuração WinGetPackage não pode ser validado. Falha ao abrir o código-fonte. ID do Pacote: {0}; Origem: {1} + {Locked="WinGetPackage,{0},{1}"} + + + O pacote da unidade de configuração WinGetPackage não pode ser validado. Pacote não encontrado. ID do Pacote: {0} + {Locked="WinGetPackage,{0}"} + + + O pacote da unidade de configuração WinGetPackage não pode ser validado. Mais de um pacote encontrado. ID do Pacote: {0} + {Locked="WinGetPackage,{0}"} + + + O pacote da unidade de configuração WinGetPackage não pode ser validado. Versão do pacote não encontrada. ID do Pacote: {0}; Versão {1} + {Locked="WinGetPackage,{0},{1}"} + + + Pacote da unidade de configuração do WinGetPackage especificado com uma versão específica enquanto apenas uma versão do pacote estiver disponível. ID do pacote: {0}; Versão: {1} + {Locked="WinGetPackage,{0},{1}"} + + + O pacote da unidade de configuração WinGetPackage não pode ser validado. ID do Pacote: {0} + {Locked="WinGetPackage,{0}"} + + + Especificar a preferência da janela de autenticação (silent, silentPreferred ou interactive) + {Locked="silent","silentPreferred","interactive"} This argument allows the user to select authentication window popup behavior. + + + Especifique a conta a ser usada para autenticação + + + Falha ao adicionar origem. Esta winget não dá suporte ao método de autenticação da origem. Tente atualizar para a versão winget versão mais recente. + {Locked="winget"} + + + A fonte {0} requer autenticação. O prompt de autenticação pode aparecer quando necessário. As informações autenticadas serão compartilhadas com a origem para autorização de acesso. + {Locked="{0}"} + + + Repara o pacote selecionado, encontrado pesquisando a lista de pacotes instalados ou diretamente de um manifesto. Por padrão, a consulta deve corresponder sem diferenciar maiúsculas de minúsculas à ID, ao nome ou ao moniker do pacote. Outros campos podem ser usados passando a opção apropriada. + id, name, and moniker are all named values in our context, and may benefit from not being translated. The match must be for any of them, with comparison ignoring case. + + + Repara o pacote selecionado + + + O comando de reparo deste pacote não foi encontrado. Entre em contato com o fornecedor do pacote para obter suporte. + + + A tecnologia do instalador em uso não corresponde à versão instalada no momento. + + + Comando de reparo não encontrado. + + + A tecnologia do instalador em uso não dá suporte ao reparo. + + + A operação de reparo foi concluída com êxito. + + + Reparo abandonado + + + Início do reparo do pacote... + + + Falha ao reparar o pacote da Microsoft Store. Código de erro: {0} + {Locked="{0}"} Error message displayed when a Microsoft Store application package fails to repair. {0} is a placeholder replaced by an error code. + + + Falha na operação de reparo. + + + A operação de reparo não é aplicável. + + + Nenhuma versão de pacote correspondente está disponível nas origens configuradas. + + + A configuração atual do sistema não dá suporte ao reparo deste pacote. + + + A tecnologia do instalador em uso não dá suporte ao reparo. + + + O pacote instalado para o escopo do usuário não pode ser reparado durante a execução com privilégios de administrador. + + + Operações de reparo envolvendo privilégios de administrador não são permitidas em pacotes instalados no escopo do usuário. + + + O reparo falhou com o código de saída: {0} + {Locked="{0}"} Error message displayed when an attempt to repair an application package fails. {0} is a placeholder replaced by an error code. + \ No newline at end of file diff --git a/Localization/Resources/ru-RU/winget.resw b/Localization/Resources/ru-RU/winget.resw index db17620598..c125f7db6c 100644 --- a/Localization/Resources/ru-RU/winget.resw +++ b/Localization/Resources/ru-RU/winget.resw @@ -261,6 +261,9 @@ Фильтровать результаты по идентификатору + + Подавляет вывод предупреждений. + Лицензия на это приложение предоставлена вам владельцем. @@ -871,8 +874,8 @@ В JSON-файле не указана распознанная схема. - Выберите область установки (пользователь или компьютер) - This argument allows the user to select between installing for just the user or for the entire machine. + Выберите область установки (user или machine) + {Locked="user","machine"} This argument allows the user to select between installing for just the user or for the entire machine. Для аргумента "{0}" указано недопустимое значение; допустимые значения: {1} @@ -1018,8 +1021,8 @@ Dependency graph has loop - Не найден подходящий установщик для manifest: {0} {1} - {Locked="{0} {1}"} Error message displayed when an attempt to get a preferred installer for a manifest fails. {0} is a placeholder replaced by the manifest identifier. {1} is a placeholder replaced by the manifest version. + Не найден подходящий установщик для манифеста: {0} версии {1} + {Locked="{0}","{1}"} Error message displayed when an attempt to get a preferred installer for a manifest fails. {0} is a placeholder replaced by the manifest identifier. {1} is a placeholder replaced by the manifest version. Ошибка обработки зависимостей пакета. Продолжить установку? @@ -1611,8 +1614,8 @@ Не удалось загрузить файл параметров. Используются значения по умолчанию. - Выберите фильтр области установленного пакета (пользователь или компьютер) - This argument allows the user to select installed packages for just the user or for the entire machine. + Выберите фильтр установленных пакетов (для user или machine) + {Locked="user","machine"} This argument allows the user to select installed packages for just the user or for the entire machine. Закрепление добавлено @@ -1697,6 +1700,9 @@ Несколько ({0}) пакетов используют закрепление, которое необходимо удалить перед обновлением {Locked="{0}"} {0} is a placeholder that is replaced by an integer number of packages with pins that prevent upgrade + + Невозможно обновить пакет с помощью winget. Для обновления этого пакета используйте метод, предоставленный издателем. + Обновление пакетов, даже если они используют неблокирующее закрепление @@ -1832,13 +1838,13 @@ {Locked="--force"} - Включение {0} [{1}]... - {Locked="{0}","{1}"} Message displayed to the user regarding which Windows Feature is being enabled. + Включение компонента [{0}]… + {Locked="{0}"} Message displayed to the user regarding which Windows Feature is being enabled. - Не удалось включить компонент {0} [{1}]. - {Locked="{0}"} Windows Feature display name -{Locked="{1}"} Windows Feature name + Не удалось включить компонент [{0}]: {1} + {Locked="{0}","{1}"} An error when enabling a Windows Feature. {0} is a placeholder for the name of the Windows Feature. +{1} is a placeholder for the unrecognized error code. Для полного включения компонентов Windows требуется перезагрузка; продолжение из-за --force @@ -2068,10 +2074,744 @@ Указывает расположение на локальном компьютере для хранения модулей. По умолчанию: %LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules. - {Locked="allusers","currentuser","default","%LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules"} + {Locked="%LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules"} Для --module-path должно быть задано значение currentuser, allusers, default или абсолютный путь. {Locked="{--module-path}, {currentuser}, {allusers}, {default}} + + Включить конфигурацию Диспетчера пакетов Windows + + + Получение сведений об ошибках. Если указано число, выходные данные будут содержать сведения об ошибке, включая имя символа, если это ошибка winget. При указании строки для этого значения будут искаться ошибки, относящиеся к winget. + + + Получить информацию об ошибках + + + Значение для поиска в сведениях об ошибке + + + Указанное число слишком велико для HRESULT. + + + Неизвестный код ошибки + + + Внутренняя ошибка + + + Недопустимые аргументы командной строки + + + Не удалось выполнить команду + + + Не удалось открыть манифест + + + Получен сигнал отмены + + + Сбой при выполнении ShellExecute + + + Не удается обработать манифест. Версия манифеста выше поддерживаемой. Обновите клиент. + + + Не удалось скачать установщик + + + Не удается выполнить запись в индекс; более поздняя версия схемы + + + Индекс поврежден + + + Сведения о настроенном источнике повреждены + + + Имя источника уже настроено + + + Недопустимый тип источника + + + Файл MSIX является набором, а не пакетом + + + Отсутствуют данные, требуемые источником + + + Ни один из установщиков не подходит для текущей системы + + + Хэш файла установщика не соответствует манифесту + + + Имя источника не существует + + + Исходное расположение уже настроено под другим именем + + + Пакеты не найдены + + + Источники не настроены + + + Найдено несколько пакетов, соответствующих условиям + + + Соответствующих условиям манифестов не найдено + + + Не удалось получить общедоступную папку из исходного пакета + + + Для выполнения команды требуются права администратора + + + Исходное расположение не защищено + + + Клиент Microsoft Store заблокирован политикой + + + Приложение Microsoft Store заблокировано политикой + + + Эта функция сейчас находится в разработке. Его можно включить с помощью параметров winget. + + + Не удалось установить приложение Microsoft Store + + + Не удалось выполнить автозаполнение + + + Не удается инициализировать средство синтаксического анализа YAML + + + Обнаружен недопустимый ключ YAML + + + Обнаружен повторяющийся ключ YAML + + + Недопустимая операция YAML + + + Не удалось создать документ YAML + + + Недопустимое состояние передатчика YAML + + + Недопустимые данные YAML + + + Ошибка LibYAML + + + Проверка манифеста завершена с предупреждениями + + + Ошибка проверки манифеста + + + Недопустимый манифест + + + Применимые обновления не найдены + + + Команда winget upgrade --all завершилась с ошибками + + + Установщик не прошел проверку безопасности + + + Размер скачиваемого файла не соответствует ожидаемому размеру содержимого + + + Команда удаления не найдена + + + Не удалось выполнить команду удаления + + + Ошибка итератора прерывания ICU + + + Ошибка сопоставления регистра ICU + + + Ошибка регулярного выражения ICU + + + Не удалось установить один или несколько импортированных пакетов + + + Не удалось найти один или несколько запрошенного пакета + + + Недопустимый JSON-файл + + + Расположение источника не является удаленным + + + Настроенный источник REST не поддерживается + + + Источник REST вернул недопустимые данные + + + Операция заблокирована групповой политикой + + + Внутренняя ошибка источника REST + + + Недопустимый URL-адрес источника REST + + + Источник REST вернул неподдерживаемый тип MIME + + + Недопустимая версия контракта источника REST + + + Исходные данные повреждены или незаконно изменены + + + Ошибка чтения из потока + + + Соглашения для пакетов не приняты + + + Ошибка при чтении входных данных в запросе + + + Запрос поиска не поддерживается одним или несколькими источниками + + + Конечная точка источника REST не найдена. + + + Не удалось открыть источник. + + + Соглашения для источников не приняты + + + Размер заголовка превышает допустимый предел в 1024 символа. Уменьшите размер и повторите попытку. + + + Отсутствует файл ресурсов + + + Не удалось выполнить установку MSI + + + Недопустимые аргументы для msiexec + + + Не удалось открыть один или несколько источников + + + Не удалось проверить зависимости + + + Отсутствует один или несколько пакетов + + + Недопустимый столбец таблицы + + + Версия обновления не новее установленной версии + + + Версия обновления неизвестна, и переопределение не указано + + + Ошибка преобразования ICU + + + Не удалось установить переносимый пакет + + + Том не поддерживает точки повторного анализа + + + Переносимый пакет из другого источника уже существует. + + + Не удалось создать symlink, путь указывает на каталог. + + + Не удается запустить установщик из контекста администратора. + + + Не удалось удалить переносимый пакет + + + Не удалось проверить значения DisplayVersion на соответствие индексу. + + + Один или несколько аргументов не поддерживаются. + + + Внедренные нуль-символы запрещены для SQLite + + + Не удалось найти вложенный установщик в архиве. + + + Не удалось извлечь из архива. + + + Указан недопустимый относительный путь к вложенным установщикам. + + + Сертификат сервера не соответствует ни одному из ожидаемых значений. + + + Необходимо указать папку для установки. + + + Не удалось проверить архив на наличие вредоносных программ. + + + Найдена по крайней мере одна версия установленного пакета. + + + Закрепление для пакета уже существует. + + + Нет закрепления для пакета. + + + Не удалось открыть базу данных закреплений. + + + Не удалось установить одно или несколько приложений + + + Не удалось удалить одно или несколько приложений + + + Один или несколько запросов вернули больше одного совпадения + + + Пакет защищен ПИН-кодом, что не позволяет выполнить обновление. + + + Установленный пакет является заглушкой + + + Получен сигнал завершения работы приложения + + + Не удалось скачать зависимости пакета. + + + Не удалось скачать пакет. Скачивание для автономной установки запрещено. + + + Требуемая служба занята или недоступна. Повторите попытку позже. + + + Указанный GUID не соответствует допустимому состоянию возобновления. + + + Текущая версия клиента не соответствует версии клиента сохраненного состояния. + + + Недопустимые данные о состоянии возобновления. + + + Не удалось открыть базу данных контрольных точек. + + + Превышено максимальное ограничение возобновления. + + + Неверные сведения для проверки подлинности. + + + Метод проверки подлинности не поддерживается. + + + Произошел сбой проверки подлинности. + + + Сбой проверки подлинности. Требуется интерактивная проверка подлинности. + + + Сбой проверки подлинности. Отменено пользователем. + + + Сбой проверки подлинности. Прошедшая проверку подлинности учетная запись не подходит. + + + Приложение сейчас запущено. Выйдите из приложения и повторите попытку. + + + Уже выполняется другая установка. Повторите попытку позже. + + + Используется один или несколько файлов. Выйдите из приложения и повторите попытку. + + + У этого пакета отсутствует зависимость в вашей системе. + + + На вашем компьютере больше нет места. Освободите место и повторите попытку. + + + Недостаточно памяти для установки. Закройте другие приложения и повторите попытку. + + + Для этого приложения требуется подключение к Интернету. Подключитесь к сети и повторите попытку. + + + Приложение обнаружило ошибку во время установки. Обратитесь в службу поддержки. + + + Перезапустите компьютер, чтобы завершить установку. + + + Сбой установки. Перезагрузите компьютер и повторите попытку. + + + Ваш компьютер будет перезагружен, чтобы завершить установку. + + + Вы отменили установку. + + + Уже установлена другая версия этого приложения. + + + Уже установлена более поздняя версия этого приложения. + + + Установка запрещена политиками организации. Обратитесь к администратору. + + + Не удалось установить зависимости пакета. + + + Приложение сейчас используется другим приложением. + + + Недопустимый параметр. + + + Пакет не поддерживается системой. + + + Установщик не поддерживает обновление существующего пакета. + + + Не удалось найти запись "Приложения и компоненты" для пакета. + + + Расположение установки неприменимо. + + + Не удалось найти расположение установки. + + + Хэш существующего файла не совпадает. + + + Файл не найден. + + + Файл найден, но хэш не был проверен. + + + Не удалось получить доступ к файлу. + + + Файл конфигурации недопустим. + + + Синтаксис YAML недопустим. + + + Поле конфигурации относится к недопустимому типу. + + + Версия конфигурации неизвестна. + + + Произошла ошибка при применении конфигурации. + + + Конфигурация содержит повторяющийся идентификатор. + + + В конфигурации отсутствует зависимость. + + + В конфигурации есть неудовлетворенная зависимость. + + + Сбой утверждения для блока конфигурации. + + + Конфигурация пропущена вручную. + + + Пользователь отклонил продолжение выполнения. + + + Этот граф зависимостей содержит цикл, который невозможно разрешить. + + + В конфигурации есть недопустимое значение поля. + + + В конфигурации отсутствует поле. + + + Сбой некоторых модулей конфигурации при проверке их состояния. + + + Состояние конфигурации не протестировано. + + + Блок конфигурации не установлен. + + + Не удалось найти блок конфигурации. + + + Обнаружено несколько соответствий для единицы конфигурации; укажите модуль, чтобы выбрать правильный модуль. + + + Сбой единицы конфигурации при попытке получить текущее состояние системы. + + + Сбой единицы конфигурации при попытке проверить текущее состояние системы. + + + Сбой блока конфигурации при попытке применить нужное состояние. + + + Модуль для блока конфигурации доступен в нескольких расположениях с одинаковой версией. + + + Не удалось загрузить модуль для единицы конфигурации. + + + Модуль конфигурации вернул непредвиденный результат во время выполнения. + + + Блок содержит параметр, требующий корня конфигурации. + + + Операция не поддерживается обработчиком конфигурации. + + + Недоступно + + + Зависимости компонентов Windows включены + + + Не удалось загрузить модуль для единицы конфигурации, так как для его запуска требуются права администратора. + + + Блок содержит параметр, требующий корня конфигурации. + + + Не удалось загрузить модуль для единицы конфигурации, так как для его запуска требуются права администратора. + + + Возобновление выполнения ранее сохраненной команды путем передачи уникального идентификатора сохраненной команды. Используется для возобновления выполнения команды, которая может быть прервана из-за перезагрузки. + + + Возобновление выполнения ранее сохраненной команды. + + + Уникальный идентификатор сохраненного состояния для возобновления + + + Возобновление состояния из другой версии клиента не поддерживается: {0} + {Locked= "{0}"} Message displayed to inform the user that the client version of the resume state does not match the current client version. {0} is a placeholder for the client version that created the resume state. + + + Состояние возобновления не существует: {0} + {Locked="{0}" Error message displayed when the user provides a guid that does not correspond to a valid saved state. {0} is a placeholder replaced by the provided guid string. + + + Не найдены данные в состоянии возобновления. + + + Эта команда не поддерживает возобновление. + + + Разрешает перезагрузку, если применимо + + + Запуск перезагрузки для завершения операции... + + + Не удалось инициировать перезагрузку. + + + Операция возобновления превышает допустимый предел {0} возобновления. Чтобы возобновить работу вручную, выполните команду "{1}". + {Locked="{0}", "{1}"} {0} is a placeholder that is replaced by an integer number of the number of allowed resumes. {1} is a placeholder for the command to run to perform a manual resume. + + + Игнорировать ограничение на возобновление сохраненного состояния + + + Схема URI не поддерживается: {0} + {Locked="{0}"} Error message displayed when the provided uri is not supported. {0} is a placeholder replaced by the provided uri. + + + Неправильный формат URI: {0} + {Locked="{0}"} Error message displayed when the provided uri is not well formed. {0} is a placeholder replaced by the provided uri. + + + Не удалось проанализировать {0} содержимое параметров единицы конфигурации или содержимое параметров пусто. + {Locked="{0}"} {0} is a placeholder replaced by the input winget configure resource unit type. + + + В блоке конфигурации {0} отсутствует требуемый аргумент: {1} + {Locked="{0},{1}"} {0} is a placeholder for the input winget configure resource unit type. {1} is placeholder for the missing arg. + + + В блоке конфигурации {0} отсутствует рекомендуемый аргумент: {1} + {Locked="{0},{1}"} {0} is a placeholder for the input winget configure resource unit type. {1} is placeholder for the missing arg. + + + Блок конфигурации WinGetSource конфликтует с известным источником: {0} + {Locked="WinGetSource,{0}"} {0} is a placeholder for the input winget source in the configuration unit settings. + + + Блок конфигурации WinGetSource утверждает сторонний источник: {0} + {Locked="WinGetSource,{0}"} {0} is a placeholder for the input winget source in the configuration unit settings. + + + WinGetPackage объявляет UseLatest и Version. Идентификатор пакета: {0} + {Locked="WinGetPackage,UseLatest,Version,{0}"} + + + Единица конфигурации WinGetPackage утверждает пакет из стороннего источника. Идентификатор пакета: {0}; Источник: {1} + {Locked="WinGetPackage,{0},{1}"} + + + Пакет единиц конфигурации WinGetPackage зависит от стороннего источника, не настроенного ранее. Идентификатор пакета: {0}; Источник: {1} + {Locked="WinGetPackage,{0},{1}"} + + + Пакет единиц конфигурации WinGetPackage зависит от стороннего источника. Рекомендуется объявить зависимость в разделе uni dependsOn. Идентификатор пакета: {0}; Источник: {1} + {Locked="WinGetPackage,dependsOn,{0},{1}"} + + + Не удается проверить пакет единиц конфигурации WinGetPackage. Не удалось открыть источник. Идентификатор пакета: {0}; Источник: {1} + {Locked="WinGetPackage,{0},{1}"} + + + Не удается проверить пакет единиц конфигурации WinGetPackage. Пакет не найден. Идентификатор пакета: {0} + {Locked="WinGetPackage,{0}"} + + + Не удается проверить пакет единиц конфигурации WinGetPackage. Найдено несколько пакетов. Идентификатор пакета: {0} + {Locked="WinGetPackage,{0}"} + + + Не удается проверить пакет единиц конфигурации WinGetPackage. Версия пакета не найдена. Идентификатор пакета: {0}; Версия {1} + {Locked="WinGetPackage,{0},{1}"} + + + Пакет блока конфигурации WinGetPackage указан с определенной версией, но доступна только одна версия пакета. Идентификатор пакета:{0}; версия: {1} + {Locked="WinGetPackage,{0},{1}"} + + + Не удается проверить пакет единиц конфигурации WinGetPackage. Идентификатор пакета: {0} + {Locked="WinGetPackage,{0}"} + + + Укажите параметры окна проверки подлинности (silent, silentPreferred или interactive) + {Locked="silent","silentPreferred","interactive"} This argument allows the user to select authentication window popup behavior. + + + Укажите учетную запись, которая будет использоваться для проверки подлинности + + + Не удалось добавить источник. Эта winget не поддерживает метод проверки подлинности источника. Попробуйте обновиться до последней winget версии. + {Locked="winget"} + + + Источник {0} требует проверки подлинности. При необходимости может появиться запрос проверки подлинности. Сведения, прошедшие проверку подлинности, будут предоставлены источнику для авторизации доступа. + {Locked="{0}"} + + + Восстановление выбранного пакета путем поиска в списке установленных пакетов или непосредственно из манифеста. По умолчанию запрос должен без учета регистра совпадать с идентификатором, именем или моникером пакета. Другие поля можно использовать путем передачи соответствующего параметра. + id, name, and moniker are all named values in our context, and may benefit from not being translated. The match must be for any of them, with comparison ignoring case. + + + Восстановление выбранного пакета + + + Не удается найти команду восстановления для этого пакета. Обратитесь за поддержкой к издателю пакета. + + + Используемая технология установщика не соответствует установленной версии. + + + Команда восстановления не найдена. + + + Используемая технология установщика не поддерживает восстановление. + + + Операция восстановления успешно завершена. + + + Восстановление прервано + + + Запуск восстановления пакета... + + + Не удалось восстановить пакет Microsoft Store. Код ошибки: {0} + {Locked="{0}"} Error message displayed when a Microsoft Store application package fails to repair. {0} is a placeholder replaced by an error code. + + + Не удалось выполнить операцию восстановления. + + + Операция восстановления неприменима. + + + В настроенных источниках недоступны соответствующие версии пакетов. + + + Текущая конфигурация системы не поддерживает восстановление этого пакета. + + + Используемая технология установщика не поддерживает восстановление. + + + Пакет, установленный для область не может быть восстановлен при выполнении с правами администратора. + + + Операции восстановления с правами администратора не разрешены для пакетов, установленных в пользовательском область. + + + Сбой восстановления с кодом выхода: {0} + {Locked="{0}"} Error message displayed when an attempt to repair an application package fails. {0} is a placeholder replaced by an error code. + \ No newline at end of file diff --git a/Localization/Resources/zh-CN/winget.resw b/Localization/Resources/zh-CN/winget.resw index 720e748757..25450554db 100644 --- a/Localization/Resources/zh-CN/winget.resw +++ b/Localization/Resources/zh-CN/winget.resw @@ -261,6 +261,9 @@ 按 id 筛选结果 + + 禁止显示警告输出。 + 此应用程序由其所有者授权给你。 @@ -871,8 +874,8 @@ JSON 文件未指定可识别的架构。 - 选择安装范围(用户或计算机) - This argument allows the user to select between installing for just the user or for the entire machine. + 选择安装范围 (user 或 machine) + {Locked="user","machine"} This argument allows the user to select between installing for just the user or for the entire machine. 为 '{0}' 参数提供的值无效;有效值为: {1} @@ -1018,8 +1021,8 @@ Dependency graph has loop - 找不到适用于 manifest: {0} {1} 的安装程序 - {Locked="{0} {1}"} Error message displayed when an attempt to get a preferred installer for a manifest fails. {0} is a placeholder replaced by the manifest identifier. {1} is a placeholder replaced by the manifest version. + 找不到适用于清单的安装程序: {0} 版本 {1} + {Locked="{0}","{1}"} Error message displayed when an attempt to get a preferred installer for a manifest fails. {0} is a placeholder replaced by the manifest identifier. {1} is a placeholder replaced by the manifest version. 处理包依赖项时出错,是否要继续安装? @@ -1611,8 +1614,8 @@ 无法加载设置文件。正在使用默认值。 - (用户或计算机)选择已安装的包范围筛选器 - This argument allows the user to select installed packages for just the user or for the entire machine. + 选择已安装的程序包范围筛选器 (user 或 machine) + {Locked="user","machine"} This argument allows the user to select installed packages for just the user or for the entire machine. 已成功添加包钉 @@ -1697,6 +1700,9 @@ {0} 程序包拥有需要在升级前移除的包钉 {Locked="{0}"} {0} is a placeholder that is replaced by an integer number of packages with pins that prevent upgrade + + 无法使用 winget 升级包。请使用发布者提供的方法升级此包。 + 即使程序包拥有非阻止性包钉,也要升级程序包 @@ -1832,13 +1838,13 @@ {Locked="--force"} - 正在启用{0} [{1}]... - {Locked="{0}","{1}"} Message displayed to the user regarding which Windows Feature is being enabled. + 正在启用 [{0}]... + {Locked="{0}"} Message displayed to the user regarding which Windows Feature is being enabled. - 无法启用 {0} [{1}] 功能。 - {Locked="{0}"} Windows Feature display name -{Locked="{1}"} Windows Feature name + 未能启用 [{0}] 功能: {1} + {Locked="{0}","{1}"} An error when enabling a Windows Feature. {0} is a placeholder for the name of the Windows Feature. +{1} is a placeholder for the unrecognized error code. 需要重新启动才能完全启用 Windows 功能;由于 --force 而继续 @@ -2068,10 +2074,744 @@ 指定本地计算机上用于存储模块的位置。默认为 %LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules - {Locked="allusers","currentuser","default","%LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules"} + {Locked="%LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules"} “--module-path”值必须是“currentuser”、“allusers”、“default”或绝对路径。 {Locked="{--module-path}, {currentuser}, {allusers}, {default}} + + 启用 Windows 程序包管理器配置 + + + 检索有关错误的信息。给定一个数字,输出将包含有关错误的详细信息,如果是 winget 特定的错误,则包括符号名称。给定一个字符串,将搜索 winget 特定的错误以查找此值。 + + + 获取错误相关信息 + + + 要在错误信息中搜索的值 + + + 给定的数字太大,无法为 HRESULT。 + + + 未知错误代码 + + + 内部错误 + + + 命令行参数无效 + + + 执行命令失败 + + + 打开清单失败 + + + 已收到取消信号 + + + 运行 ShellExecute 失败 + + + 无法处理清单。清单版本高于支持的版本。请更新客户端。 + + + 下载安装程序失败 + + + 无法写入索引;它是更高版本的架构 + + + 索引已损坏 + + + 配置的源信息已损坏 + + + 已配置源名称 + + + 源类型无效 + + + MSIX 文件是捆绑包,不是程序包 + + + 缺少源所需的数据 + + + 所有安装程序都不适用于当前系统 + + + 安装程序文件的哈希与清单不匹配 + + + 源名称不存在 + + + 已使用其他名称配置源位置 + + + 找不到程序包 + + + 未配置任何源 + + + 找到多个与条件匹配的程序包 + + + 找不到与条件匹配的清单 + + + 未能从源包获取公用文件夹 + + + 需要管理员权限才能运行命令 + + + 源位置不安全 + + + Microsoft Store 客户端遭到策略阻止 + + + Microsoft Store 应用遭到策略阻止 + + + 该功能当前正在开发中。可以使用 winget 设置启用它。 + + + 未能安装 Microsoft Store 应用 + + + 未能执行自动完成 + + + 未能初始化 XML 分析程序 + + + 遇到无效的 YAML 密钥 + + + 遇到重复的 YAML 密钥 + + + YAML 操作无效 + + + 未能生成 YAML 文档 + + + YAML 发出程序状态无效 + + + YAML 数据无效 + + + LibYAML 错误 + + + 清单验证成功,但出现警告 + + + 清单验证失败 + + + 清单无效 + + + 找不到适用的更新 + + + winget upgrade --all 完成,但出现故障 + + + 安装程序未通过安全性检查 + + + 下载大小与预期内容长度不匹配 + + + 找不到卸载命令 + + + 运行卸载命令失败 + + + ICU 中断迭代器错误 + + + ICU casemap 错误 + + + ICU 正则表达式错误 + + + 无法安装一个或多个导入的包 + + + 找不到一个或多个请求的包 + + + Json 文件无效 + + + 源位置不是远程位置 + + + 配置的 REST 源不受支持。 + + + REST 源返回的数据无效 + + + 操作被组策略阻止 + + + REST 源内部错误 + + + REST 源 URL 无效 + + + REST 源返回的 MIME 类型不受支持 + + + REST 源合同版本无效 + + + 源数据已损坏或被篡改 + + + 从流中读取时出错 + + + 未同意程序包协议 + + + 在提示中读取输入时出错 + + + 一个或多个源不支持搜索请求 + + + 找不到 REST 源终结点。 + + + 未能打开源。 + + + 未同意源协议 + + + 标头大小超过了允许的 1024 个字符的限制。请减小大小,然后重试。 + + + 缺少资源文件 + + + 运行 MSI 安装失败 + + + msiexec 的参数无效 + + + 未能打开一个或多个源 + + + 未能验证依赖项 + + + 缺少一个或多个程序包 + + + 表列无效 + + + 升级版本不高于已安装的版本 + + + 升级版本未知,未指定替代 + + + ICU 转换错误 + + + 未能安装可移植包 + + + 卷不支持重新分析点 + + + 已存在来自其他源的可移植包。 + + + 无法创建符号链接,路径指向目录。 + + + 无法从管理员上下文运行安装程序。 + + + 未能卸载可移植包 + + + 未能根据索引验证 DisplayVersion 值。 + + + 一个或多个参数不受支持。 + + + SQLite 不允许嵌入的 null 字符 + + + 在存档中找不到嵌套安装程序。 + + + 未能解压缩存档。 + + + 提供的嵌套安装程序的相对文件路径无效。 + + + 服务器证书与任何预期值都不匹配。 + + + 必须提供安装位置。 + + + 存档恶意软件扫描失败。 + + + 找到至少一个已安装的包版本。 + + + 包的 PIN 已存在。 + + + 包没有 PIN。 + + + 无法打开 PIN 数据库。 + + + 一个或多个应用程序安装失败 + + + 一个或多个应用程序未能安装 + + + 一个或多个查询并不是恰好返回一个匹配项 + + + 包具有阻止升级的 PIN。 + + + 当前安装的程序包是存根程序包 + + + 已收到应用程序关闭信号 + + + 未能下载程序包依赖项。 + + + 未能下载包。禁止下载以进行脱机安装。 + + + 所需的服务正忙或不可用。请稍后重试。 + + + 提供的 GUID 与有效的恢复状态不对应。 + + + 当前客户端版本与已保存状态的客户端版本不匹配。 + + + 恢复状态数据无效。 + + + 无法打开检查点数据库。 + + + 超过了最大恢复限制。 + + + 身份验证信息无效。 + + + 不支持的身份验证方法。 + + + 身份验证失败。 + + + 身份验证失败。需要交互式身份验证。 + + + 身份验证失败。用户已取消。 + + + 身份验证失败。经过身份验证的帐户不是所需的帐户。 + + + 应用程序当前正在运行。退出应用程序,然后重试。 + + + 另一个安装已在进行中。请稍后再试。 + + + 正在使用一个或多个文件。退出应用程序,然后重试。 + + + 系统中缺少此包的依赖项。 + + + 你的电脑上没有更多空间。腾出空间,然后重试。 + + + 内存不足,无法安装。关闭其他应用程序,然后重试。 + + + 此应用程序需要 Internet 连接。请连接到网络,然后重试。 + + + 此应用程序在安装过程中遇到错误。请联系支持人员。 + + + 重启电脑以完成安装。 + + + 安装失败。请重新启动电脑,然后重试。 + + + 你的电脑将重启以完成安装。 + + + 你已取消安装。 + + + 已安装此应用程序的另一个版本。 + + + 已安装此应用程序的更高版本。 + + + 组织策略正在阻止安装。请与管理员联系。 + + + 未能安装程序包依赖项。 + + + 应用程序当前正由另一个应用程序使用。 + + + 参数无效。 + + + 系统不支持程序包。 + + + 安装程序不支持升级现有包。 + + + 找不到包的“应用和功能”条目。 + + + 安装位置不适用。 + + + 找不到安装位置。 + + + 现有文件的哈希不匹配。 + + + 找不到文件。 + + + 找到文件,但未检查哈希。 + + + 无法访问该文件。 + + + 配置文件无效。 + + + YAML 语法无效。 + + + 配置字段的类型无效。 + + + 配置具有未知版本。 + + + 应用配置时出错。 + + + 配置包含重复的标识符。 + + + 配置缺少依赖项。 + + + 配置具有未满足的依赖项。 + + + 配置单元的断言失败。 + + + 已手动跳过配置。 + + + 用户拒绝继续执行。 + + + 依赖项关系图包含无法解析的循环。 + + + 配置具有无效的字段值。 + + + 配置缺少字段。 + + + 某些配置单元在测试其状态时失败。 + + + 未测试配置状态。 + + + 未安装配置单元。 + + + 未找到配置单元。 + + + 已找到配置单元的多个匹配项;指定模块以选择正确的模块。 + + + 尝试获取当前系统状态时配置单元失败。 + + + 尝试测试当前系统状态时配置单元失败。 + + + 尝试应用所需状态时配置单元失败。 + + + 配置单元的模块在具有相同版本的多个位置可用。 + + + 加载配置单元的模块失败。 + + + 配置单元在执行过程中返回了意外结果。 + + + 单元包含需要配置根的设置。 + + + 配置处理器不支持此操作。 + + + 不可用 + + + 已成功启用 Windows 功能依赖项 + + + 加载配置单元的模块失败,因为它需要管理员权限才能运行。 + + + 单元包含需要配置根的设置。 + + + 加载配置单元的模块失败,因为它需要管理员权限才能运行。 + + + 通过传递已保存命令的唯一标识符来恢复执行以前保存的命令。这用于恢复可能因重新启动而终止的已执行命令。 + + + 继续执行以前保存的命令。 + + + 要恢复的已保存状态的唯一标识符 + + + 不支持从其他客户端版本恢复状态: {0} + {Locked= "{0}"} Message displayed to inform the user that the client version of the resume state does not match the current client version. {0} is a placeholder for the client version that created the resume state. + + + 恢复状态不存在: {0} + {Locked="{0}" Error message displayed when the user provides a guid that does not correspond to a valid saved state. {0} is a placeholder replaced by the provided guid string. + + + 在恢复状态下找不到数据。 + + + 此命令不支持恢复。 + + + 如果适用,允许重启 + + + 正在发起重启以完成操作... + + + 未能发起重启。 + + + 恢复操作超出了允许的 {0} 恢复() 限制。若要手动恢复,请运行命令 “{1}”。 + {Locked="{0}", "{1}"} {0} is a placeholder that is replaced by an integer number of the number of allowed resumes. {1} is a placeholder for the command to run to perform a manual resume. + + + 忽略恢复已保存状态的限制 + + + 不支持 URI 方案: {0} + {Locked="{0}"} Error message displayed when the provided uri is not supported. {0} is a placeholder replaced by the provided uri. + + + URI 格式不标准: {0} + {Locked="{0}"} Error message displayed when the provided uri is not well formed. {0} is a placeholder replaced by the provided uri. + + + 无法分析 {0} 配置单元设置内容或设置内容为空。 + {Locked="{0}"} {0} is a placeholder replaced by the input winget configure resource unit type. + + + {0} 配置单元缺少必需的参数: {1} + {Locked="{0},{1}"} {0} is a placeholder for the input winget configure resource unit type. {1} is placeholder for the missing arg. + + + {0} 配置单元缺少建议的参数: {1} + {Locked="{0},{1}"} {0} is a placeholder for the input winget configure resource unit type. {1} is placeholder for the missing arg. + + + WinGetSource 配置单元与已知源冲突: {0} + {Locked="WinGetSource,{0}"} {0} is a placeholder for the input winget source in the configuration unit settings. + + + 第三方源上的 WinGetSource 配置单元声明: {0} + {Locked="WinGetSource,{0}"} {0} is a placeholder for the input winget source in the configuration unit settings. + + + WinGetPackage 声明 UseLatest 和 Version。包 ID: {0} + {Locked="WinGetPackage,UseLatest,Version,{0}"} + + + WinGetPackage 配置单元声明来自第三方源的包。包 ID: {0};源: {1} + {Locked="WinGetPackage,{0},{1}"} + + + WinGetPackage 配置单元包依赖于以前未配置的第三方源。包 ID: {0};源: {1} + {Locked="WinGetPackage,{0},{1}"} + + + WinGetPackage 配置单元包依赖于第三方源。建议在 uni dependsOn 节中声明依赖项。包 ID: {0};源: {1} + {Locked="WinGetPackage,dependsOn,{0},{1}"} + + + 无法验证 WinGetPackage 配置单元包。源打开失败。包 ID: {0};源: {1} + {Locked="WinGetPackage,{0},{1}"} + + + 无法验证 WinGetPackage 配置单元包。找不到包。包 ID: {0} + {Locked="WinGetPackage,{0}"} + + + 无法验证 WinGetPackage 配置单元包。找到多个包。包 ID: {0} + {Locked="WinGetPackage,{0}"} + + + 无法验证 WinGetPackage 配置单元包。找不到包版本。包 ID: {0};版本 {1} + {Locked="WinGetPackage,{0},{1}"} + + + 使用特定版本指定的 WinGetPackage 配置单元包,而只有一个包版本可用。包 ID: {0};版本: {1} + {Locked="WinGetPackage,{0},{1}"} + + + 无法验证 WinGetPackage 配置单元包。包 ID: {0} + {Locked="WinGetPackage,{0}"} + + + 指定身份验证窗口首选项(silent、silentPreferred 或 interactive) + {Locked="silent","silentPreferred","interactive"} This argument allows the user to select authentication window popup behavior. + + + 指定用于身份验证的帐户 + + + 无法添加源。此 winget 版本不支持源的身份验证方法。请尝试升级到最新 winget 版本。 + {Locked="winget"} + + + {0} 源需要身份验证。必要时可能会显示身份验证提示。将与源共享经过身份验证的信息以进行访问授权。 + {Locked="{0}"} + + + 修复通过搜索已安装的包列表或直接从清单中找到的所选包。默认情况下,查询必须以不区分大小写方式匹配包的 ID、名称或名字对象。可通过传递相应的选项来使用其他字段。 + id, name, and moniker are all named values in our context, and may benefit from not being translated. The match must be for any of them, with comparison ignoring case. + + + 修复所选包 + + + 找不到此包的修复命令。请联系包发布者以获取支持。 + + + 正在使用的安装程序技术与当前安装的版本不匹配。 + + + 找不到修复命令。 + + + 正在使用的安装程序技术不支持修复。 + + + 修复操作成功完成。 + + + 已放弃修复 + + + 正在启动包修复... + + + 未能修复 Microsoft Store 包。错误代码: {0} + {Locked="{0}"} Error message displayed when a Microsoft Store application package fails to repair. {0} is a placeholder replaced by an error code. + + + 修复操作失败。 + + + 修复操作不适用。 + + + 配置的源中没有可用的匹配包版本。 + + + 当前系统配置不支持修复此包。 + + + 正在使用的安装程序技术不支持修复。 + + + 使用管理员权限运行时,无法修复为用户范围安装的包。 + + + 不允许对用户范围内安装的包执行涉及管理员特权的修复操作。 + + + 修复失败,退出代码为: {0} + {Locked="{0}"} Error message displayed when an attempt to repair an application package fails. {0} is a placeholder replaced by an error code. + \ No newline at end of file diff --git a/Localization/Resources/zh-TW/winget.resw b/Localization/Resources/zh-TW/winget.resw index bf877d133c..081feed14f 100644 --- a/Localization/Resources/zh-TW/winget.resw +++ b/Localization/Resources/zh-TW/winget.resw @@ -261,6 +261,9 @@ 依識別碼篩選結果 + + 抑制警告輸出。 + 此應用程式已由其擁有者授權給您。 @@ -871,8 +874,8 @@ JSON 檔案未指定可識別的結構描述。 - 選取安裝範圍 (使用者或電腦) - This argument allows the user to select between installing for just the user or for the entire machine. + 選取安裝範圍 (user 或 machine) + {Locked="user","machine"} This argument allows the user to select between installing for just the user or for the entire machine. `{0}` 引數提供的值無效;有效值為: {1} @@ -1018,8 +1021,8 @@ Dependency graph has loop - 找不到適用于 manifest: {0} {1} 的安裝程式 - {Locked="{0} {1}"} Error message displayed when an attempt to get a preferred installer for a manifest fails. {0} is a placeholder replaced by the manifest identifier. {1} is a placeholder replaced by the manifest version. + 找不到適合指令清單的安裝程式: {0} 版本 {1} + {Locked="{0}","{1}"} Error message displayed when an attempt to get a preferred installer for a manifest fails. {0} is a placeholder replaced by the manifest identifier. {1} is a placeholder replaced by the manifest version. 處理套件相依性時發生錯誤,是否要繼續安裝? @@ -1611,8 +1614,8 @@ 無法載入設定檔案。使用預設值。 - 選取已安裝的套件範圍篩選條件 (使用者或電腦) - This argument allows the user to select installed packages for just the user or for the entire machine. + 選取已安裝的套件範圍篩選條件 (user 或 machine) + {Locked="user","machine"} This argument allows the user to select installed packages for just the user or for the entire machine. 成功新增釘選 @@ -1697,6 +1700,9 @@ {0} 個包裹具有更新前需要先移除的釘選 {Locked="{0}"} {0} is a placeholder that is replaced by an integer number of packages with pins that prevent upgrade + + 無法使用 winget 升級封裝。請使用發行者提供的方法來升級此套件。 + 即使有非封鎖釘選仍要更新套件 @@ -1832,13 +1838,13 @@ {Locked="--force"} - 啟用 {0} [{1}]... - {Locked="{0}","{1}"} Message displayed to the user regarding which Windows Feature is being enabled. + 正在啟用 [{0}]... + {Locked="{0}"} Message displayed to the user regarding which Windows Feature is being enabled. - 無法啟用 {0} [{1}] 功能。 - {Locked="{0}"} Windows Feature display name -{Locked="{1}"} Windows Feature name + 無法啟用 [{0}] 功能: {1} + {Locked="{0}","{1}"} An error when enabling a Windows Feature. {0} is a placeholder for the name of the Windows Feature. +{1} is a placeholder for the unrecognized error code. 必須重新開機,才能完全啟用 Windows 功能;因為 [--force] 而繼續 @@ -2068,10 +2074,744 @@ 在本機電腦上指定位置以儲存模組。預設 %LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules - {Locked="allusers","currentuser","default","%LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules"} + {Locked="%LOCALAPPDATA%\Microsoft\WinGet\Configuration\Modules"} '--module-path' 值必須是 'currentuser'、'allusers'、'default' 或絕對路徑。 {Locked="{--module-path}, {currentuser}, {allusers}, {default}} + + 啟用 Windows 封裝管理員設定 + + + 擷取錯誤的相關信息。指定數位后,輸出將包含錯誤的詳細數據,包括符號名稱,如果是 Winget 特定的錯誤。指定字串時,會搜尋 winget 特定錯誤以尋找此值。 + + + 取得關於錯誤的資訊 + + + 要在錯誤資訊中搜尋的值 + + + 指定的數位太大,無法成為 HRESULT。 + + + 未知錯誤代碼 + + + 內部錯誤 + + + 命令列引數無效 + + + 執行命令失敗 + + + 開啟資訊清單失敗 + + + 已收到取消訊號 + + + ShellExecute 執行失敗 + + + 無法處理指令清單。指令清單版本高於支援。請更新用戶端。 + + + 下載安裝程序失敗 + + + 無法寫入索引;這是較高的架構版本 + + + 索引已損毀 + + + 設定的來源資訊已損毀 + + + 已設定來源名稱 + + + 來源類型無效 + + + MSIX 檔案是套件組合,而不是套件 + + + 遺失來源所需的資料 + + + 沒有任何安裝程式適用於目前的系統 + + + 安裝程式檔案的哈希不符合指令清單 + + + 來源名稱不存在 + + + 來源位置已在另一個名稱下設定 + + + 找不到封裝 + + + 未設定任何來源 + + + 找到多個符合準則的封裝 + + + 找不到符合準則的資訊清單。 + + + 無法從來源套件取得公用資料夾 + + + 命令需要系統管理員權限才能執行 + + + 來源位置不安全 + + + 原則已封鎖 Microsoft Store 用戶端 + + + 原則已封鎖 Microsoft Store 應用程式 + + + 功能目前正在開發中。您可以使用 winget 設定來啟用它。 + + + 安裝 Microsoft Store 應用程式失敗 + + + 無法執行自動完成 + + + 無法初始化 YAML 剖析器 + + + 遇到無效的 YAML 金鑰 + + + 遇到重複的 YAML 金鑰 + + + YAML 作業無效 + + + 無法建置 YAML 文件 + + + YAML 發射器狀態無效 + + + 無效的 YAML 資料 + + + LibYAML 錯誤 + + + 資訊清單驗證成功,但出現警告 + + + 資訊清單驗證失敗 + + + 資訊清單無效 + + + 找不到適用的更新 + + + winget 升級 -- 全部完成,但有失敗部分 + + + 安裝程式的安全性檢查失敗 + + + 下載大小不符合預期的內容長度 + + + 找不到解除安裝命令 + + + 執行解除安裝命令失敗 + + + ICU 中斷列舉程式錯誤 + + + ICU 案例對應錯誤 + + + ICU Regex 錯誤 + + + 無法安裝一或多個匯入的套件 + + + 找不到一或多個要求的套件 + + + 無效的 Json 檔案 + + + 來源位置非遠端 + + + 不支援設定的剩餘來源 + + + 剩餘來源傳回的資料無效 + + + [群組原則] 封鎖作業 + + + 剩餘來源內部錯誤 + + + 剩餘來源 URL 無效 + + + 剩餘來源傳回不支援的 MIME 類型 + + + 休息來源合約版本無效 + + + 來源資料已損毀或遭竄改 + + + 從資料流讀取時發生錯誤 + + + 未同意的封裝合約。 + + + 讀取輸入提示時發生錯誤 + + + 一或多個來源不支持搜尋要求 + + + 找不到剩餘來源端點。 + + + 無法開啟來源。 + + + 未同意的來源合約 + + + 標頭大小超過允許的1024個字元限制。請縮減大小,然後再試一次。 + + + 遺失資源檔案 + + + 執行 MSI 安裝失敗 + + + msiexec 的引數無效 + + + 無法開啟一或多個來源 + + + 無法驗證相依性 + + + 一或多個封裝遺失 + + + 無效資料行欄 + + + 升級版本不比安裝的版本新 + + + 升級版本不明,且未指定覆寫 + + + ICU 轉換錯誤 + + + 無法安裝可攜式封裝 + + + 磁碟區不支援重新分析點 + + + 來自不同來源的可攜式封裝已經存在。 + + + 無法建立符號連結,路徑指向目錄。 + + + 無法從系統管理員內容執行安裝程式。 + + + 無法解除安裝可攜式封裝 + + + 無法根據索引驗證 DisplayVersion 值。 + + + 不支援一個或多個引數。 + + + SQLite 不允許內嵌 Null 字元 + + + 在封存中找不到巢狀安裝程式。 + + + 無法解壓縮封存。 + + + 提供的巢狀安裝程式相對檔案路徑無效。 + + + 伺服器證書不符合任何預期值。 + + + 必須提供安裝位置。 + + + 封存惡意代碼掃描失敗。 + + + 找到至少一個已安裝的套件版本。 + + + 封裝已經有釘選。 + + + 沒有適用於封裝的釘選。 + + + 無法開啟釘選資料庫。 + + + 一個或多個應用程式無法安裝 + + + 無法解除安裝一個或多個應用程式 + + + 一或多個查詢未傳回完全相符的專案 + + + 封裝有防止升級的 PIN。 + + + 目前安裝的套件是存根套件 + + + 已收到應用程式關機訊號 + + + 無法下載封裝相依性。 + + + 無法下載套件。禁止下載以進行離線安裝。 + + + 必要服務忙碌中或無法使用。請稍後再試。 + + + 提供的 GUID 未對應到有效的繼續狀態。 + + + 目前的用戶端版本不符合儲存狀態的用戶端版本。 + + + 恢復狀態資料無效。 + + + 無法開啟檢查點資料庫。 + + + 已超過最大恢復限制。 + + + 無效驗證資訊。 + + + 不支援驗證方法。 + + + 驗證失敗。 + + + 驗證失敗。需要互動式驗證。 + + + 驗證失敗。使用者已取消。 + + + 驗證失敗。已驗證的帳戶不是所需的帳戶。 + + + 應用程式目前正在執行。結束應用程式,然後再試一次。 + + + 另一個安裝已在進行中。請稍後再試。 + + + 一或多個檔案正在使用中。結束應用程式,然後再試一次。 + + + 您的系統遺漏此套件的相依性。 + + + 您的電腦上已經沒有空間。請釋出空間,然後再試一次。 + + + 記憶體不足,無法安裝。請關閉其他應用程式,然後再試一次。 + + + 此應用程式需要因特網連線。請連線到網路,然後再試一次。 + + + 此應用程式在安裝期間發生錯誤。連絡客戶支援。 + + + 重新啟動您的電腦以完成安裝。 + + + 安裝失敗。請重新啟動您的計算機,然後再試一次。 + + + 將重新開機您的電腦以完成安裝。 + + + 您取消了安裝。 + + + 已安裝此應用程式的另一個版本。 + + + 已安裝此應用程式的較新版本。 + + + 組織原則導致無法安裝。請連絡您的系統管理員。 + + + 無法安裝封裝相依性。 + + + 應用程式目前正由另一個應用程式使用中。 + + + 參數無效。 + + + 系統不支援封裝。 + + + 安裝程式不支持升級現有的封裝。 + + + 找不到套件的應用程式和功能專案。 + + + 安裝位置不適用。 + + + 找不到安裝位置。 + + + 現有檔案的哈希不符。 + + + 找不到檔案。 + + + 找到檔案,但未檢查哈希。 + + + 無法存取檔案。 + + + 設定檔案無效。 + + + YAML 語法無效。 + + + 設定欄位的類型無效。 + + + 設定的版本不明。 + + + 在套用設定時發生錯誤。 + + + 設定包含重複的識別碼。 + + + 設定缺少相依性。 + + + 設定具有未滿足的相依性。 + + + 設定單位的聲明失敗。 + + + 已手動略過設定。 + + + 使用者拒絕繼續執行。 + + + 相依性圖形包含無法解析的迴圈。 + + + 設定具有無效的欄位值。 + + + 設定缺少一個欄位。 + + + 部分設定單位在測試其狀態時失敗。 + + + 組態狀態未進行測試。 + + + 未安裝設定單位。 + + + 找不到設定單位。 + + + 找到多個符合設定單位的項目;指定模組以選取正確的項目。 + + + 嘗試取得目前的系統狀態時,設定單位失敗。 + + + 嘗試測試目前的系統狀態時,組態單位失敗。 + + + 嘗試套用所需的狀態時,組態單位失敗。 + + + 設定單位的模組可在多個具有相同版本的位置使用。 + + + 載入設定單位的模組失敗。 + + + 組態單位在執行期間傳回非預期的結果。 + + + 單位包含需要設定根目錄的設定。 + + + 設定處理器不支援此作業。 + + + 無法使用 + + + 已成功啟用 Windows 功能相依性 + + + 載入組態單位的模組失敗,因為它需要系統管理員許可權才能執行。 + + + 單位包含需要設定根目錄的設定。 + + + 載入組態單位的模組失敗,因為它需要系統管理員許可權才能執行。 + + + 傳入儲存命令的唯一標識符,以繼續執行先前儲存的命令。這可用來繼續可能因重新啟動而終止的已執行命令。 + + + 繼續執行先前儲存的命令。 + + + 要繼續之儲存狀態的唯一標識符 + + + 不支援從不同的用戶端版本繼續狀態: {0} + {Locked= "{0}"} Message displayed to inform the user that the client version of the resume state does not match the current client version. {0} is a placeholder for the client version that created the resume state. + + + 恢復狀態不存在: {0} + {Locked="{0}" Error message displayed when the user provides a guid that does not correspond to a valid saved state. {0} is a placeholder replaced by the provided guid string. + + + 在恢復狀態中找不到任何資料。 + + + 此命令不支持恢復。 + + + 如果適用,則允許重新開機 + + + 正在起始重新開機,以完成作業... + + + 無法起始重新開機。 + + + 繼續作業超過允許的 {0} 繼續() 限制。若要手動繼續,請執行命令 '{1}'。 + {Locked="{0}", "{1}"} {0} is a placeholder that is replaced by an integer number of the number of allowed resumes. {1} is a placeholder for the command to run to perform a manual resume. + + + 略過繼續儲存狀態的限制 + + + 不支援 Uri 配置: {0} + {Locked="{0}"} Error message displayed when the provided uri is not supported. {0} is a placeholder replaced by the provided uri. + + + Uri 的格式不正確: {0} + {Locked="{0}"} Error message displayed when the provided uri is not well formed. {0} is a placeholder replaced by the provided uri. + + + 無法剖析 {0} 組態單位設定內容或設定內容是空的。 + {Locked="{0}"} {0} is a placeholder replaced by the input winget configure resource unit type. + + + {0} 組態單位遺漏必要的自變數: {1} + {Locked="{0},{1}"} {0} is a placeholder for the input winget configure resource unit type. {1} is placeholder for the missing arg. + + + {0} 組態單位遺漏建議的自變數: {1} + {Locked="{0},{1}"} {0} is a placeholder for the input winget configure resource unit type. {1} is placeholder for the missing arg. + + + WinGetSource 組態單位與已知來源衝突: {0} + {Locked="WinGetSource,{0}"} {0} is a placeholder for the input winget source in the configuration unit settings. + + + 第三方來源的 WinGetSource 組態單位判斷提示: {0} + {Locked="WinGetSource,{0}"} {0} is a placeholder for the input winget source in the configuration unit settings. + + + WinGetPackage 宣告 UseLatest 和 Version。套件識別碼: {0} + {Locked="WinGetPackage,UseLatest,Version,{0}"} + + + WinGetPackage 組態單位在來自第三方來源的封裝上宣告。套件標識碼: {0};來源: {1} + {Locked="WinGetPackage,{0},{1}"} + + + WinGetPackage 設定單元套件相依於先前未設定的第三方來源。套件標識碼: {0};來源: {1} + {Locked="WinGetPackage,{0},{1}"} + + + WinGetPackage 設定單元套件相依於第三方來源。建議您在 uni dependsOn 區段中宣告相依性。套件標識碼: {0};來源: {1} + {Locked="WinGetPackage,dependsOn,{0},{1}"} + + + 無法驗證 WinGetPackage 設定單元套件。來源開啟失敗。套件標識碼: {0};來源: {1} + {Locked="WinGetPackage,{0},{1}"} + + + 無法驗證 WinGetPackage 設定單元套件。找不到套件。套件識別碼: {0} + {Locked="WinGetPackage,{0}"} + + + 無法驗證 WinGetPackage 設定單元套件。找到多個套件。套件識別碼: {0} + {Locked="WinGetPackage,{0}"} + + + 無法驗證 WinGetPackage 設定單元套件。找不到套件版本。套件標識碼: {0};版本 {1} + {Locked="WinGetPackage,{0},{1}"} + + + 以特定版本指定的 WinGetPackage 設定單元封裝,其中只有一個封裝版本可用。封裝識別碼: {0};版本: {1} + {Locked="WinGetPackage,{0},{1}"} + + + 無法驗證 WinGetPackage 設定單元套件。套件識別碼: {0} + {Locked="WinGetPackage,{0}"} + + + 指定驗證視窗喜好設定 (silent、silentPreferred 或 interactive) + {Locked="silent","silentPreferred","interactive"} This argument allows the user to select authentication window popup behavior. + + + 指定要用於驗證的帳戶 + + + 無法新增來源。此 winget 版本不支援來源的驗證方法。嘗試升級至最新 winget 版本。 + {Locked="winget"} + + + {0} 來源需要驗證。必要時可能會顯示驗證提示。已驗證的資訊將與來源共用以取得存取授權。 + {Locked="{0}"} + + + 修復選取的套件,您可以搜尋已安裝的套件清單,或直接從指令清單找到該套件。根據預設,查詢必須不區分大小寫地符合封裝的標識碼、名稱或Moniker。傳遞其他欄位的適當選項即可使用。 + id, name, and moniker are all named values in our context, and may benefit from not being translated. The match must be for any of them, with comparison ignoring case. + + + 修復選取的封裝 + + + 找不到此封裝的修復命令。請連絡套件發行者以取得支援。 + + + 使用中的安裝程序技術與目前安裝的版本不符。 + + + 找不到修復命令。 + + + 使用中的安裝程序技術不支持修復。 + + + 修復作業已成功完成。 + + + 已放棄修復 + + + 正在啟動封裝修復... + + + 無法修復 Microsoft Store 封裝。錯誤碼: {0} + {Locked="{0}"} Error message displayed when a Microsoft Store application package fails to repair. {0} is a placeholder replaced by an error code. + + + 修復作業失敗。 + + + 修復作業不適用。 + + + 沒有相符的封裝版本可從設定的來源使用。 + + + 目前的系統設定不支援修復此封裝。 + + + 使用中的安裝程序技術不支持修復。 + + + 以系統管理員許可權執行時,無法修復為用戶範圍安裝的套件。 + + + 不允許在使用者範圍內安裝的套件上修復涉及系統管理員許可權的作業。 + + + 修復失敗,結束代碼為: {0} + {Locked="{0}"} Error message displayed when an attempt to repair an application package fails. {0} is a placeholder replaced by an error code. + \ No newline at end of file