2016-08-30 35 views
0

需要专家的帮助,你需要专家的帮助(3天后尝试自己的大声笑)。这里是我的脚本失败的部分:Powershell报价使用现状

$yy=(get-date).Year 

Invoke-Command -ComputerName *ipaddress* -Credential $moveitcred { 
move-item -path "C:\iCApps\Dev\LetterGenerator\Letters\FTS\EDMS\*.txt" -destination "C:\Moveitft\Dev\Letters\Outbound" -force 
Start-Process -FilePath "C:\Program Files\7-Zip\7z.exe" -ArgumentList "a -y C:\Moveitft\Dev\Letters\archive\Letters$yy_.zip C:\Moveitft\Dev\Letters\Outbound\*.*" 
} 

该举措正常工作。和拉链工作正常,除非我想包括年变量($ YY)在参数列表中。 Powershell不想填充变量来调整文件名。要么是引用了$ null,要么是在$ yy应该是空白的情况下完成工作。

如果我从提示符运行$ yy,它确实会返回正确的年份值,所以我猜测它是不正确使用引号。但经过3天的搜索,我自己尝试了各种组合,现在我正在扔毛巾。任何帮助/指导将大大如此赞赏:)

回答

0

试过以上,谢谢!我认为这可能归结为PowerShell版本。我试图在运行powershell v2.0的服务器上对另一台2012服务器执行此操作。

我已经缩短下来的代码只是问题(这样我就可以“F8”它测试的结果),这是该行: 调用命令-ComputerName ip地址 -Credential $ {moveitcred开始 -Process -FilePath“C:\ Program Files \ 7-Zip \ 7z.exe”-argumentlist“a -y C:\ Moveitft \ Dev \ Letters \ archive \ Letters $ {yy} .zip C:\ Moveitft \ Dev \字母\出站*。*“ }

您的两条建议”工作“,因为命令处理,但它仍然没有正确读取变量。这是我得到的结果.ZIP

enter image description here

我想它的PowerShell中的原因,如果我复制/粘贴我自己的生产机器上的相同的命令到PowerShell的4.0版是监守,你可以通过颜色编码立即看到“$ yy”被视为一个变量,因为它变成了红色 - 然后代码在我的PS4.0机器上正常工作。

在PSv2.0服务器上,我试图让它运行,“-argumentlist”的同一行出现所有褐色/棕色 - 包括$ yy部分。所以它的一种暗示是否适合我。

+0

是否有理由认为目标服务器的年份与执行调用的年份不同?尝试在启动进程行之前在脚本块中声明$ yy,然后查看是否得到了你需要的内容。否则,你可能不得不使用-ArgumentList和Invoke-Command – notjustme

+0

正确!也感谢mjsr的高级管理人员,他们昨天真的很想念这个问题。然后对你来说,以及谁今天早上确认它:)这解决了它 - 在脚本块中声明! –

1

问题不在于引用是关于变量的范围。在你正在执行的scriptblock内部,powershell对变种$yy var一无所知。所以你需要告诉它在哪里获得价值。你可以使用argumentList参数来做到这一点。我看到你已经这样做了,但是你做错了(move-item不支持该参数)。看下面的例子来把握这个概念,我认为你会解决你的问题:

# this is fine and simple 
$yy="Hello scriptblocks!" 
Invoke-Command -ScriptBlock { "whatever you want to run that use the an external var. $yy" } -ArgumentList $yy 

# this is incorrect 
Invoke-Command -ScriptBlock { "whatever you want to run that use the an external var. $yyCarefulWithThisText" } -ArgumentList $yy 

# this shows how you could resolve the variable when you want to put text around 
Invoke-Command -ScriptBlock { "whatever you want to run that use the an external var. $($yy)CarefulWithThisText" } -ArgumentList $yy 

# output1: whatever you want to run that use the an external var. Hello scriptblocks! 
# output2: whatever you want to run that use the an external var. 
# output3: whatever you want to run that use the an external var. Hello scriptblocks!CarefulWithThisText