我无法弄清楚如何回显标准错误流并重定向可执行文件的错误流.
我来自Bourne shell和Korn shell背景,我将使用它;
# Write to stderr
echo "Error Message!" >&2
# Redirect stderr to file
/do/error 2>/tmp/err.msg
Run Code Online (Sandbox Code Playgroud) 在命令行上指定文件名时,以下脚本运行良好.
tail.bat@echo off
set "COUNT=%1"
set "COUNT=%COUNT:-=%"
set "FILENAME=%~2"
powershell "Get-Content %FILENAME% -Last %COUNT%"
Run Code Online (Sandbox Code Playgroud)
但是,我需要的是能够Get-Content从stdin 管道文本.我想编写以下内容以获取分配给项目的最后三个Subversion标记.我该怎么做才能使源Get-Content成为标准输入?
svn ls svn://ahost/arepo/aproject/tags | call tail.bat -3
Run Code Online (Sandbox Code Playgroud)
注意:我不允许tail从外面安装任何有用的工具.必须使用机器上已有的程序完成.
我刚刚遇到了一个意想不到的行为,Where-Object我找不到任何解释:
$foo = $null | Where-Object {$false}
$foo -eq $null
> True
($null, 1 | Measure-Object).Count
> 1
($foo, 1 | Measure-Object).Count
> 1
($null, $null, 1 | Measure-Object).Count
> 1
($foo, $foo, 1 | Measure-Object).Count
> 0
Run Code Online (Sandbox Code Playgroud)
如果 的条件Where-Object为假,$foo则应该为$null(这看起来是正确的)。
然而,$foo在任何值进入管道之前至少进行两次管道传输似乎会破坏它。
是什么原因造成的?
其他不一致之处:
($foo, $null, 1 | Measure-Object).Count
> 1
($foo, $null, $foo, 1 | Measure-Object).Count
> 0
($null, $foo, $null, 1 | Measure-Object).Count
> 1
($foo, 1, $foo, $foo …Run Code Online (Sandbox Code Playgroud) 我的脚本将一些信息从 Sharepoint 站点导出到文件中.CSV。
# Enter Web Application URL
$WebAppURL="http://server"
# Enter Path to CSV-file
$CSVFilePath="Path"
$SiteCollections = Get-SPWebApplication $WebAppURL | Get-SPSite -Limit All
$Tree = foreach ($Site in $SiteCollections) {
foreach ($Web in $Site.AllWebs) {
$Groups = New-Object System.Collections.ArrayList
foreach ($Group in $web.Groups) {
[void]$Groups.Add($Group.Name)
}
$Groups = $Groups -join ','
[PSCustomObject]@{
Url = $web.URL
Title = $web.Title
CountOfLists= $web.Lists.Count
PermissionsInherited = $web.Permissions.Inherited
Groups = $Groups
}
}
}
$Tree | Export-CSV $CSVFilePath -NoTypeInformation -Encoding UTF8
Run Code Online (Sandbox Code Playgroud)
如果我使用[void] …
function Main {
$result1 = DoWork1
$result1.GetType()
$result2 = DoWork2
$result2.GetType()
}
function DoWork1 {
$result1 = Invoke-Sqlcmd -Query "select top 1 * from customer" -ServerInstance "(localdb)\MSSQLLocalDB" -Database "Database1" -OutputAs DataTables
#assign to variable then return
return $result1
}
function DoWork2 {
#return results without assigning to variable
return Invoke-Sqlcmd -Query "select top 1 * from customer" -ServerInstance "(localdb)\MSSQLLocalDB" -Database "Database1" -OutputAs DataTables
}
Main
Run Code Online (Sandbox Code Playgroud)
这是意外的输出:
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False DataRow System.Object
True True …Run Code Online (Sandbox Code Playgroud) 使用 BorderAround 会向控制台发出“True”。
$range = $sum_wksht.Range('B{0}:G{0}' -f ($crow))
$range.BorderAround(1, -4138)
Run Code Online (Sandbox Code Playgroud)
这可以通过使用以下方法之一来克服。
$wasted = $range.BorderAround(1, -4138)
[void]$range.BorderAround(1, -4138)
Run Code Online (Sandbox Code Playgroud)
为什么需要这个?我没有正确创建范围吗?有更好的解决方法吗?