我正在与 Jenkins 合作远程部署 PowerShell 脚本。因此,我试图弄清楚使用$PSScriptRootover$MyInvocation.MyCommand.Path获取当前脚本根目录是否会出现问题。
一位同事顺便告诉我,使用$PSScriptRoot远程功能是一个坏主意,因为我可能偶尔会发现它在运行时由于某种原因或其他原因没有返回预期值,即使它以前工作过。但是,无法解释为什么会这样。
在我的研究中,我没有发现任何可以进一步解释这一点或避免此类问题的最佳实践方法的任何内容。我主要发现这两者基本上可以互换;然而,$PSScriptRoot可以仅在PowerShell中V3或更高版本一起使用。通过你们中的一些人的帮助,我还了解到它$MyInvocation具有情境差异,可以根据范围和模块进行更改。但我仍然没有发现这是否或为什么会成为 PowerShell Remoting 的问题。
示例 001
所以我在 Jenkins 中有一个 PowerShell 脚本,它$PSScriptRoot用作查找我希望通过相对路径调用的脚本的手段。我是否能够依靠它来始终为所述脚本提供相同/预期的路径?
示例 002
使用由 Jenkins 启动的 PowerShell 脚本调用的 PowerShell 脚本,我是否能够期望$PSScriptRoot能够为我提供该脚本实际所在位置的路径,或者它会给我一个基于 Jenkins 的路径?
就我个人而言,我希望两者$PSScriptRoot都能为我提供正在运行的脚本的实际物理位置,而不是根据调用它的初始脚本更改的相对路径。
由于有了这种理解将帮助我节省大量时间和头痛,我希望像您这样的程序员可以帮助我了解这是否属实,以及为什么会发生这样的问题。
我想知道使用$PSScriptRoot是否会导致我在 PowerShell Remoting 中出现问题,从而使使用$MyInvocation更可行的选项?
因此,我有一段代码用于启动服务,如果服务花费太长时间并且在大多数情况下工作正常,则服务超时。不幸的是,当该服务尝试启动无法启动的服务时,它会显示以下警告消息:
WARNING: Waiting for 'ServiceName <ServiceName>' to start...
Run Code Online (Sandbox Code Playgroud)
此消息将每 1-2 秒显示一次,但从未发生超时,并且 Start-Service 操作似乎会无休止地继续。我可以安全地验证它至少会持续 30 分钟(在我手动终止该操作之前)。
代码如下:
Start-Service $ServiceName -ErrorAction SilentlyContinue
$results = Wait-ServiceState -ServiceName $ServiceName -ServiceState 'Running' -SecondsToWait $SecondsToWait
Function Wait-ServiceState {
Param (...)
Process {
Try {
$check = Get-Service $ServiceName
$timeout = New-TimeSpan -Seconds $SecondsToWait
$check.WaitForStatus($ServiceState, $timeout.ToString())
If ($check.Status -ne $ServiceState) { return $False }
Else { return $true }
}
Catch {
# do nothing: handled by an upper level function
}
}
}
Run Code Online (Sandbox Code Playgroud)
我已经针对其他几个服务测试了上述功能,它似乎工作正常。我也成功地使用了它,并且Stop-Service …
我正在通过PowerShell运行一些git命令,但我在捕获输出时遇到问题.
在我尝试使用之前,我所研究的许多方法都未能捕获任何输出Out-File.不幸的是,尽管这对我来说有多好,但我发现git push命令出了问题,导致我无法捕获输出...
我的代码如下:
git add . | Out-File $logFilePath -Append
git status . | Out-File $logFilePath -Append
git commit -m "Some Relevant update message" | Out-File $logFilePath -Append
git push origin $branchname | Out-File $logFilePath -Append
Run Code Online (Sandbox Code Playgroud)
当我查看日志文件时,它会显示除了输出之外的所有内容git push.因此,在对此进行故障排除时,我| Out-File从行中删除了,并注意到即使输出窗口也没有显示输出git push.只有当我完全删除Out-File所有git命令时,我才能使输出再次按预期显示.不幸的是,这让我回到原点.
有谁知道如何使用PowerShell最好地捕获git命令的输出,或者可以指出我做错了什么?
我正在尝试做一些条件映射,我阅读的所有文档和问题似乎都没有涵盖这个特定的条件。我希望这里有人有经验或知道如何最好地解决这个问题。
我正在映射一个具有两个属性的对象。但是,如果特定属性具有值,我不想映射 EITHER 属性。为了形象化:
foreach(var object in objectB) {
If (object.propertyA == "SomeValue")
continue;
else
Mapper.Map<ObjectA>(object);
}
Run Code Online (Sandbox Code Playgroud)
但是,我想要AutoMapper与上述声明等效的内容。所以更像是:
cfg.CreateMap<ObjectB, ObjectA>()
.ForMember(dest => dest.PropertyA, m => m.Condition(source => source.PropertyA != "SomeValue"))
.ForMember(dest => dest.PropertyB, m => m.Condition(source => source.PropertyA != "SomeVAlue" ? source.PropertyB : ignore))
Run Code Online (Sandbox Code Playgroud)
但是上面的版本显然不行。预先感谢您的帮助。