2011-05-18 13 views
10

Estoy tratando de editar algunos xml en Powershell. Esto es lo que estoy haciendo:¿Cómo edito XML usando Powershell?

$path = 'C:\Projects\NuGetTestPackage\NuGetTestPackage' 
$projName = 'NuGetTestPackage1.csproj' 
cd $path 
$file = gi $projName 
$pattern = 'TextTemplatingFileGenerator' 
$xml = [xml](gc $file) 
$node = [xml] $xml.Project.ItemGroup.None.Generator | 
    Where { $_.Project.ItemGroup.None.Generator -eq $pattern } | 
    Foreach {$_.Project.ItemGroup.None.Generator = ''} 
$xml.Save($file.Fullname) 

aquí es el XML:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> 
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> 
    <ProductVersion> 
    </ProductVersion> 
    <SchemaVersion>2.0</SchemaVersion> 
    <ProjectGuid>{E750ACF1-17B5-4D83-8FC8-5A4488193099}</ProjectGuid> 
    <ProjectTypeGuids>{E53F8FEA-EAE0-44A6-8774-FFD645390401};{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids> 
    <OutputType>Library</OutputType> 
    <AppDesignerFolder>Properties</AppDesignerFolder> 
    <RootNamespace>NuGetTestPackage</RootNamespace> 
    <AssemblyName>NuGetTestPackage</AssemblyName> 
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion> 
    <MvcBuildViews>false</MvcBuildViews> 
    <UseIISExpress>false</UseIISExpress> 
    </PropertyGroup> 
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> 
    <DebugSymbols>true</DebugSymbols> 
    <DebugType>full</DebugType> 
    <Optimize>false</Optimize> 
    <OutputPath>bin\</OutputPath> 
    <DefineConstants>DEBUG;TRACE</DefineConstants> 
    <ErrorReport>prompt</ErrorReport> 
    <WarningLevel>4</WarningLevel> 
    </PropertyGroup> 
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> 
    <DebugType>pdbonly</DebugType> 
    <Optimize>true</Optimize> 
    <OutputPath>bin\</OutputPath> 
    <DefineConstants>TRACE</DefineConstants> 
    <ErrorReport>prompt</ErrorReport> 
    <WarningLevel>4</WarningLevel> 
    </PropertyGroup> 
    <ItemGroup> 
    <Reference Include="EntityFramework, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"> 
     <Private>True</Private> 
     <HintPath>..\packages\EntityFramework.4.1.10331.0\lib\EntityFramework.dll</HintPath> 
    </Reference> 
    <Reference Include="System.Data.Entity" /> 
    <Reference Include="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" /> 
    <Reference Include="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" /> 
    <Reference Include="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" /> 
    <Reference Include="Microsoft.CSharp" /> 
    <Reference Include="System" /> 
    <Reference Include="System.Data" /> 
    <Reference Include="System.Drawing" /> 
    <Reference Include="System.Web.DynamicData" /> 
    <Reference Include="System.Web.Entity" /> 
    <Reference Include="System.Web.ApplicationServices" /> 
    <Reference Include="System.ComponentModel.DataAnnotations" /> 
    <Reference Include="System.Core" /> 
    <Reference Include="System.Data.DataSetExtensions" /> 
    <Reference Include="System.Xml.Linq" /> 
    <Reference Include="System.Web" /> 
    <Reference Include="System.Web.Extensions" /> 
    <Reference Include="System.Web.Abstractions" /> 
    <Reference Include="System.Web.Routing" /> 
    <Reference Include="System.Xml" /> 
    <Reference Include="System.Configuration" /> 
    <Reference Include="System.Web.Services" /> 
    <Reference Include="System.EnterpriseServices" /> 
    </ItemGroup> 
    <ItemGroup> 
    <Compile Include="Application\ApplicationConfigurationSettings.cs" /> 
    <Compile Include="Global.asax.cs"> 
     <DependentUpon>Global.asax</DependentUpon> 
    </Compile> 
    <Compile Include="Properties\AssemblyInfo.cs" /> 
    </ItemGroup> 
    <ItemGroup> 
    <Content Include="Content\themes\base\images\ui-bg_flat_0_aaaaaa_40x100.png" /> 
    <Content Include="Content\themes\base\images\ui-bg_flat_75_ffffff_40x100.png" /> 
    <Content Include="Content\themes\base\images\ui-bg_glass_55_fbf9ee_1x400.png" /> 
    <Content Include="Content\themes\base\images\ui-bg_glass_65_ffffff_1x400.png" /> 
    <Content Include="Content\themes\base\images\ui-bg_glass_75_dadada_1x400.png" /> 
    <Content Include="Content\themes\base\images\ui-bg_glass_75_e6e6e6_1x400.png" /> 
    <Content Include="Content\themes\base\images\ui-bg_glass_95_fef1ec_1x400.png" /> 
    <Content Include="Content\themes\base\images\ui-bg_highlight-soft_75_cccccc_1x100.png" /> 
    <Content Include="Content\themes\base\images\ui-icons_222222_256x240.png" /> 
    <Content Include="Content\themes\base\images\ui-icons_2e83ff_256x240.png" /> 
    <Content Include="Content\themes\base\images\ui-icons_454545_256x240.png" /> 
    <Content Include="Content\themes\base\images\ui-icons_888888_256x240.png" /> 
    <Content Include="Content\themes\base\images\ui-icons_cd0a0a_256x240.png" /> 
    <Content Include="Content\themes\base\jquery.ui.accordion.css" /> 
    <Content Include="Content\themes\base\jquery.ui.all.css" /> 
    <Content Include="Content\themes\base\jquery.ui.autocomplete.css" /> 
    <Content Include="Content\themes\base\jquery.ui.base.css" /> 
    <Content Include="Content\themes\base\jquery.ui.button.css" /> 
    <Content Include="Content\themes\base\jquery.ui.core.css" /> 
    <Content Include="Content\themes\base\jquery.ui.datepicker.css" /> 
    <Content Include="Content\themes\base\jquery.ui.dialog.css" /> 
    <Content Include="Content\themes\base\jquery.ui.progressbar.css" /> 
    <Content Include="Content\themes\base\jquery.ui.resizable.css" /> 
    <Content Include="Content\themes\base\jquery.ui.selectable.css" /> 
    <Content Include="Content\themes\base\jquery.ui.slider.css" /> 
    <Content Include="Content\themes\base\jquery.ui.tabs.css" /> 
    <Content Include="Content\themes\base\jquery.ui.theme.css" /> 
    <Content Include="Global.asax" /> 
    <Content Include="Content\Site.css" /> 
    <Content Include="Scripts\jquery-1.5.1-vsdoc.js" /> 
    <Content Include="Scripts\jquery-1.5.1.js" /> 
    <Content Include="Scripts\jquery-1.5.1.min.js" /> 
    <Content Include="Scripts\jquery-ui-1.8.11.js" /> 
    <Content Include="Scripts\jquery-ui-1.8.11.min.js" /> 
    <Content Include="Scripts\jquery.validate-vsdoc.js" /> 
    <Content Include="Scripts\jquery.validate.js" /> 
    <Content Include="Scripts\jquery.validate.min.js" /> 
    <Content Include="Scripts\modernizr-1.7.js" /> 
    <Content Include="Scripts\modernizr-1.7.min.js" /> 
    <Content Include="T4\WebConfigSettingGeneratorScript.txt"> 
     <AutoGen>True</AutoGen> 
     <DesignTime>True</DesignTime> 
     <DependentUpon>WebConfigSettingGeneratorScript.tt</DependentUpon> 
    </Content> 
    <Content Include="T4\WebConfigSettingGeneratorScript1.txt" /> 
    <Content Include="Web.config" /> 
    <Content Include="Web.Debug.config"> 
     <DependentUpon>Web.config</DependentUpon> 
    </Content> 
    <Content Include="Web.Release.config"> 
     <DependentUpon>Web.config</DependentUpon> 
    </Content> 
    <Content Include="Scripts\jquery.unobtrusive-ajax.js" /> 
    <Content Include="Scripts\jquery.unobtrusive-ajax.min.js" /> 
    <Content Include="Scripts\jquery.validate.unobtrusive.js" /> 
    <Content Include="Scripts\jquery.validate.unobtrusive.min.js" /> 
    <Content Include="Scripts\MicrosoftAjax.js" /> 
    <Content Include="Scripts\MicrosoftAjax.debug.js" /> 
    <Content Include="Scripts\MicrosoftMvcAjax.js" /> 
    <Content Include="Scripts\MicrosoftMvcAjax.debug.js" /> 
    <Content Include="Scripts\MicrosoftMvcValidation.js" /> 
    <Content Include="Scripts\MicrosoftMvcValidation.debug.js" /> 
    <Content Include="Views\Web.config" /> 
    <Content Include="Views\_ViewStart.cshtml" /> 
    <Content Include="Views\Shared\Error.cshtml" /> 
    <Content Include="Views\Shared\_Layout.cshtml" /> 
    </ItemGroup> 
    <ItemGroup> 
    <Folder Include="Controllers\" /> 
    <Folder Include="Models\" /> 
    </ItemGroup> 
    <ItemGroup> 
    <Content Include="packages.config" /> 
    </ItemGroup> 
    <ItemGroup> 
    <None Include="CodeTemplates\AddController\Controller.tt" /> 
    <None Include="CodeTemplates\AddController\ControllerWithContext.tt" /> 
    <None Include="CodeTemplates\AddView\CSHTML\Create.tt" /> 
    <None Include="CodeTemplates\AddView\CSHTML\Delete.tt" /> 
    <None Include="CodeTemplates\AddView\CSHTML\Details.tt" /> 
    <None Include="CodeTemplates\AddView\CSHTML\Edit.tt" /> 
    <None Include="CodeTemplates\AddView\CSHTML\Empty.tt" /> 
    <None Include="CodeTemplates\AddView\CSHTML\List.tt" /> 
    <None Include="T4\Generators\WebConfigGenerator.tt" /> 
    <None Include="T4\Templates\WebConfigTemplate.tt" /> 
    <None Include="T4\WebConfigSettingGeneratorScript.tt"> 
     <Generator>TextTemplatingFileGenerator</Generator> 
     <LastGenOutput>WebConfigSettingGeneratorScript.txt</LastGenOutput> 
    </None> 
    <None Include="T4\WebConfigSettingGeneratorScript.tt.log"> 
     <DependentUpon>WebConfigSettingGeneratorScript.tt</DependentUpon> 
    </None> 
    </ItemGroup> 
    <ItemGroup> 
    <Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" /> 
    </ItemGroup> 
    <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> 
    <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" /> 
    <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
    Other similar extension points exist, see Microsoft.Common.targets. 
    <Target Name="BeforeBuild"> 
    </Target> 
    <Target Name="AfterBuild"> 
    </Target> --> 
    <Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'"> 
    <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" /> 
    </Target> 
    <ProjectExtensions> 
    <VisualStudio> 
     <FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}"> 
     <WebProjectProperties> 
      <UseIIS>False</UseIIS> 
      <AutoAssignPort>True</AutoAssignPort> 
      <DevelopmentServerPort>55059</DevelopmentServerPort> 
      <DevelopmentServerVPath>/</DevelopmentServerVPath> 
      <IISUrl> 
      </IISUrl> 
      <NTLMAuthentication>False</NTLMAuthentication> 
      <UseCustomServer>False</UseCustomServer> 
      <CustomServerUrl> 
      </CustomServerUrl> 
      <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile> 
     </WebProjectProperties> 
     </FlavorProperties> 
    </VisualStudio> 
    </ProjectExtensions> 
</Project> 

La idea es despejar el valor del nodo generador. Parece que no puedo hacer que este código funcione. ¿Estoy accediendo a las propiedades xml incorrectamente? Parece que recibo un valor en cada uno, pero tengo problemas para acceder correctamente.


Ok, gracias @Keith Hill. Aquí está la respuesta:

$path = 'C:\Projects\NuGetTestPackage\NuGetTestPackage' 
$ns = @{msb = 'http://schemas.microsoft.com/developer/msbuild/2003'} 
cd $path 
$results = 0 
$projName = 'NuGetTestPackage1.csproj' 
$file = gi $projName 
$xml = [xml](gc $projName) 
$xml | Select-Xml "//msb:Generator" -Namespace $ns | 
     Foreach { 
      $_.Node.set_InnerText('') 
      $results = 1 
     } 
if($results -eq 1){ 
    $xml.Save($file.FullName) 
} 
+0

¿Olvidaste la cadena "patrón"? No entiendo cómo funcionaría esto, ¿cómo es? – D3vtr0n

+2

Me encantaría ver los detalles y responder tan genéricos como el título de esta pregunta. –

Respuesta

13

Esto está ocurriendo porque tener más de un elemento "ItemGroup" y más de un elemento "None". En ese momento, ItemGroup es una colección y no tiene una propiedad ".None". Sería mejor utilizar XPath IMO, por ejemplo:

$ns = @{msb = 'http://schemas.microsoft.com/developer/msbuild/2003'} 
$pattern = 'TextTemplatingFileGenerator' 
$xml = [xml](gc C:\temp\test.csproj) 
$xml | Select-Xml "//msb:Generator[text() = $pattern]" -Namespace $ns | 
     Foreach {$_.Node.set_InnerText('')} 
$xml.Save('C:\temp\test.csproj') 
+0

No estoy en desacuerdo. Pero, cuando lo he intentado, termino con NADA. Incluso cuando pruebo su código, que se ve bien, todavía obtengo NADA. ¿Algunas ideas? –

+0

Ok, más información. Si digo Foreach {$ _. Node.InnerText}, entonces obtengo el valor correcto. El problema parece estar en establecer el valor. –

+1

Hmm, me funciona dado el archivo de proyecto C# que proporcionó anteriormente (PowerShell 2.0). Puede intentar '$ _. Node.set_InnerText ('')' en su lugar para ver si eso funciona. Por cierto, defina lo que quiere decir con "terminar con NADA"? ¿No hay nada en el archivo de proyecto C# actualizado? –

3

Realmente no entiendo su problema

$file = get-item "c:\Yourfile.xml" 

$xml = [xml](get-content $file) 

$xml.Project.ItemGroup.None.Generator = "" 

$xml.Save("c:\YourModifiedFile.xml") 

Editar: el primer archivo que se dio fue:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup> 
    <None Include="T4\WebConfigSettingGeneratorScript.tt"> 
     <Generator>TextTemplatingFileGenerator</Generator> 
     <LastGenOutput>WebConfigSettingGeneratorScript.txt</LastGenOutput> 
    </None> 
    </ItemGroup> 
</Project> 
+0

Eso produce un error. ¿No debería? - La propiedad 'Generator' no se puede encontrar en este objeto; asegúrese de que exista y que sea configurable. –

+0

Hmmmm ... Reduje mi XML para que sea solo lo que te proporcioné y ahora funciona. Tal vez estoy teniendo este problema porque mi XML es muy complicado? –

Cuestiones relacionadas