我试图使用Remove-Item cmdlet作为系统自动化的一部分.这些文件存储在需要提升权限才能执行文件删除的服务器上.我可以访问用于此类自动化脚本的域管理员帐户.
下面的代码将构建PSCredential对象:
$password = New-Object System.Security.SecureString
"passwordhere".ToCharArray() | ForEach-Object { $password.AppendChar($_) }
$cred = New-Object System.Management.Automation.PSCredential("domain\username",$password)
$cred
我将此对象传递给以下操作:
Remove-Item -LiteralPath $path -Force -Credential $cred
有任何想法吗?
几年前,我使用Make-shell创建了带有自定义cmdlet的自定义shell.后来我使用了snap-in技术,我忘记了这个选项.
现在我应该为一大批客户部署一组自定义cmdlet,最好提供一个零配置解决方案; 因此,我记得自定义shell解决方案,我想知道它是否仍然是这种情况下的最佳解决方案.它也会有所帮助,因为我的cmdlet使用WF 4.0,因此shell应该在最新的框架版本下运行.无论如何,我对它的支持有点害怕:它是否仍在使用Powershell 2.0功能?
是否有其他方法可以在客户的计算机上轻松部署cmdlet?
谢谢
在新AzureDeployment cmdlet中未从-Name参数的值更新部署名称.根据此处的 MSFT文档,-Name参数映射到部署名称,但在我测试时,使用-Name参数值更新了部署唯一名称.而且,我可以使用像'.'这样的特殊字符.和"/"中部署名称直接从门户网站上传包时,但该cmdlet不会让我使用任何特殊字符
想知道是否有人遇到过这个问题?
这是我在使用特殊字符时看到的错误的屏幕截图
新Azuredeployment:HTTP状态代码:BadRequest - HTTP错误消息:部署名称无效

我想对用户隐藏 PowerShell Cmdlet 参数。有没有办法在 C# 中做到这一点?
我想在我的代码中使用此参数来触发具有隐藏参数的相同 cmdlet。
我使用 PowerShell 2.0。
谢谢。
我正在从Visual Studio创建一个PowerShell cmdlet,我无法找到如何从我的C#文件中调用cmdlet,或者这是否可能?我一个接一个地运行我的cmdlet没有问题,但我想设置一个cmdlet来在续集中运行多个cmdlet.
Msdn 文档对 WriteVerbose 方法说:
“只能从 BeginProcessing、ProcessRecord 和 EndProcessing 方法的实现中调用此方法,并且只能从该线程调用。如果从这些实现外部或另一个线程调用此方法,则会引发 InvalidOperationException 异常。”
但是在我的测试代码中,我能够在三个标准方法之外调用该方法。但是当从不同的线程调用该方法时,我得到了一个异常。
我相信这里的大多数人在实现自定义 cmdlet 时都需要多线程支持。
我正在使用后台工作者来完成简单的多线程。在继续之前,我在 ProcessRecord 函数中等待 doWork 事件完成。现在我想使用来自 doWork 的 writeverbose 向用户报告进度,但由于它是一个不同的线程,我不能这样做。
我已经尝试使用带有 AutoResetEvent 的并发队列来实现这一点,但是有没有更好的方法以更简单的方式解决这个问题?
我想看看使用 Robocopy 的解决方案是否比使用Get-ChildItem获取给定文件夹(和子文件夹......)内的文件列表更快。
在我的代码中,我使用Get-ChildItemcmdlet 来获取特定文件夹内所有文件的列表,以便在每个文件上循环:
$files = Get-ChildItem "C:\aaa" -Recurse | where {! $_.PIsContainer} # ! because I don't want to list folders
foreach ($file in $files){
...
}
现在,我有 robocopy 命令来获取所有文件的列表,但是,robocopy 的输出是一个字符串。
[string]$result = robocopy "C:\aaa" NULL /l /s /ndl /xx /nc /ns /njh /njs /fp
那么,我如何使用 robocopy 命令的输出来循环每个文件(类似于使用Get-ChildItem?
我有一个管道函数,它在begin块中分配一些需要在最后处理的资源.我已尝试在end块中执行此操作但在函数执行中止时不会调用它,例如ctrl+ c.
如何修改以下代码以确保$sw始终处置:
function Out-UnixFile([string] $Path, [switch] $Append) {
    <#
    .SYNOPSIS
    Sends output to a file encoded with UTF-8 without BOM with Unix line endings.
    #>
    begin {
        $encoding = new-object System.Text.UTF8Encoding($false)
        $sw = new-object System.IO.StreamWriter($Path, $Append, $encoding)
        $sw.NewLine = "`n"
    }
    process { $sw.WriteLine($_) }
    # FIXME not called on Ctrl+C
    end { $sw.Close() }
}
编辑:简化功能
我知道我们可以在Powershell V3.0中使用参数-File,但是如何在Powershell V2中只获取带有Get-childitem cmdlet的文件?
我想使用一个if \ else语句来确定运行哪个cmdlet,同时为两个命令保持相同的参数:
例如我有这个电话:
    New-AzureRmResourceGroupDeployment `
        -ResourceGroupName $ResourceGroup `
        -TemplateFile $TemplateUri `
        -TemplateParameterFile $TemplateParamFile 
但我想用变量来确定动词:
    $myVerb = if ($booleanTest) {"Test"} else {"New"}
    [$myVerb]-AzureRmResourceGroupDeployment `
         -ResourceGroupName $ResourceGroup `
         -TemplateFile $TemplateUri `
         -TemplateParameterFile $TemplateParamFile 
或类似的东西:
    $command = if ($booleanTest) {"Test-AzureRmResourceGroupDeployment"} else {"New-AzureRmResourceGroupDeployment"}
    $command `
         -ResourceGroupName $ResourceGroup `
         -TemplateFile $TemplateUri `
         -TemplateParameterFile $TemplateParamFile 
我尝试了这个$command版本,但它失败了:
在C:\ Users\Administrator\Dropbox\projects\deloitte\Suncore\Dev\scripts\az -d eploy.ps1:36 char:13 + -ResourceGroupName $ ResourceGroup
+ ~~~~~~~~~~~~~~~~~~ Unexpected token '-ResourceGroupName' in expression or statement. At C:\Users\Administrator\Dropbox\projects\deloitte\Suncore\Dev\scripts\az-d eploy.ps1:36 char:32 + -ResourceGroupName $ResourceGroup …