【问题标题】:PowerShell - send variable via Invoke-CommandPowerShell - 通过 Invoke-Command 发送变量
【发布时间】:2018-09-07 12:20:46
【问题描述】:

我有 3 台 Windows 2016 服务器和一些我想要自动化的例行任务。 我是 PowerShell 的新手,所以我花了很多时间在 StackOverflow 和“谷歌搜索”中寻找答案。

我的任务是在远程服务器上通过 7zip 备份一些文件。

有一个命令很好用:

Invoke-Command -ComputerName 10.10.0.20 -ScriptBlock {start-Process  -wait-FilePath 'C:\Program Files\7-Zip\7z.exe' -ArgumentList 'a','-t7z','C:\BlueCollar_backup\bluecollar_121.zip','C:\Services\BlueCollar' -wait}

但我需要在 bluecollar_121.zip 存档名称中添加日期,它应该看起来像 bluecollar_13.08.2018.zip

我尝试了很多变种,但都没有运气。

[string]$stime = get-date -f 'dd.MM.yyyy
Invoke-Command -ComputerName 10.10.0.20 -ScriptBlock {start-Process -FilePath 'C:\Program Files\7-Zip\7z.exe' -ArgumentsList 'a -t7z C:\BlueCollar_backup\bluecollar_'$stime'.zip C:\Services\BlueCollar' -wait}

第二次尝试是:

[string]$stime = get-date -f 'dd.MM.yyyy
[string]$tmp1="C:\BlueCollar_backup\bluecollar_$stime.zip"
$command = {start-Process -FilePath 'C:\Program Files\7-Zip\7z.exe' -ArgumentsList 'a -t7z $stime C:\Services\BlueCollar' -wait}

最后一次尝试:

[string]$stime = get-date -f 'dd.MM.yyyy
$arguments = @()
$arguments += "a"
$arguments += "-t7z"
$arguments +=  "$tmp1"
$arguments +=  "C:\Services\BlueCollar"
Invoke-Command -ComputerName 10.10.0.20 -ScriptBlock {start-Process -FilePath 'C:\Program Files\7-Zip\7z.exe' -ArgumentList($arguments) -wait}

他们都没有工作。问题是 $stime 变量。 如何将变量 $stime 放入 Invoke-Command ?

UPD1: 我解决了那个问题!

Invoke-Command -ComputerName '10.10.0.20' -ArgumentList  $stime -ScriptBlock{
$stime = $args[0]
start-Process -FilePath 'C:\Program Files\7-Zip\7z.exe' "a -t7z C:\BlueCollar_backup\bluecollar_$stime.zip C:\Services\BlueCollar" -wait
}

【问题讨论】:

    标签: windows powershell server invoke-command scriptblock


    【解决方案1】:

    问题是您正在执行命令的计算机知道 $stime 变量,但远程计算机不知道它。所以你必须把它传入。

    有几个选项,一个是使用 $Using 变量

    [string]$stime = get-date -f 'dd.MM.yyyy
    Invoke-Command -ComputerName 10.10.0.20 -ScriptBlock {
        start-Process -FilePath 'C:\Program Files\7-Zip\7z.exe' -ArgumentsList "a -t7z C:\BlueCollar_backup\bluecollar_$($Using:stime).zip C:\Services\BlueCollar" -wait
    }
    

    另一个可能看起来更简洁的选项是让您的 ScriptBlock 成为一个文本字符串,然后将其传递给远程计算机:

    $ScriptBlock=[ScriptBlock]::Create("start-Process -FilePath 'C:\Program Files\7-Zip\7z.exe' -ArgumentsList 'a -t7z C:\BlueCollar_backup\bluecollar_$stime.zip C:\Services\BlueCollar'")
    Invoke-Command -ComputerName 10.10.0.20 -ScriptBlock $ScriptBlock
    

    一个重要的区别是单引号和双引号。当您使用单引号时,它会完全按原样解析文本。当您使用双引号时,它会解析变量。

    【讨论】:

    • 两种变体都没有帮助,有一个错误。找不到与参数名称对应的参数:“ArgumentsList”。 + CategoryInfo : InvalidArgument: (:) [Start-Process], ParameterBindingException + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.StartProcessCommand + PSComputerName : 10.10.0.20
    • 我认为它可能是“ArgumentList”而不是“ArgumentSlist”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多