我有一个剧本,如下所示:
- hosts: localhost
tasks:
- name: update a file
blockinfile:
dest: /tmp/test
block: |
line 1
line 2
Run Code Online (Sandbox Code Playgroud)
运行剧本后,文件/tmp/test变为:
a # this is the end line of the original file
# BEGIN ANSIBLE MANAGED BLOCK
line 1
line 2
# END ANSIBLE MANAGED BLOCK
Run Code Online (Sandbox Code Playgroud)
我想在标记“ # BEGIN ANSIBLE MANAGED BLOCK”之前添加一个空行(换行符)以获得视觉效果,最简单的方法是什么?最好在任务范围内,但欢迎任何想法。如果我重新定义标记,它将影响“BEGIN”和“END”标记。
我想杀死 nodepad 进程(如果存在)。如果我使用这个:
PS C:\> get-process -name notepad | Stop-Process -Force
Run Code Online (Sandbox Code Playgroud)
当进程不存在时,我会收到错误消息。
get-process : Cannot find a process with the name "notepad". Verify the process name and call the cmdlet again.
At line:1 char:1
+ get-process -name notepad | Stop-Process -Force
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (notepad:String) [Get-Process], ProcessCommandException
+ FullyQualifiedErrorId : NoProcessFoundForGivenName,Microsoft.PowerShell.Commands.GetProcessCommand
Run Code Online (Sandbox Code Playgroud)
我觉得它应该是沉默的,因为它不是一个错误,该对象应该为空。
我知道我可以这样做:
PS C:\> get-process | where { $_.processname -eq 'notepad' } | Stop-Process -Force
Run Code Online (Sandbox Code Playgroud)
但我更喜欢一种简单的方法(如果存在的话)。谢谢。
PS:我需要杀死记事本,因为当我非交互式安装 ClamAV 时,它会创建带有用户手册的记事本。我找不到告诉 ClamAV 不要打开用户手册的方法。
我错误地创建了一个文件,并且我一生都无法删除它。如果您安装了7-Zip,则可以生成它。如果没有,安装也很容易。
以下是文件的创建方式:
PS C:\temp> mkdir abc
PS C:\temp> cd abc
PS C:\temp\abc> & 'C:\Program Files\7-Zip\7z.exe' a -spf .\DuoWindowsLogon.admx,.\en-us\DuoWindowsLogon.adml
Creating archive: .\DuoWindowsLogon.admx,.\en-us\DuoWindowsLogon.adml
Run Code Online (Sandbox Code Playgroud)
后来,我了解到我应该输入的正确命令是:
& 'C:\Program Files\7-Zip\7z.exe' a abc.7z -spf DuoWindowsLogon.admx en-us\DuoWindowsLogon.adml
Run Code Online (Sandbox Code Playgroud)
意识到错误后,我尝试删除错误创建的目录:
PS C:\temp\abc> ls
d----- 11/15/2020 11:09 PM DuoWindowsLogon.admx,.
PS C:\temp\abc> ls D*
ls : Could not find item C:\temp\abc\DuoWindowsLogon.admx,..
PS C:\temp\abc> ls | rm
rm : Cannot find path 'C:\temp\abc\DuoWindowsLogon.admx,.' because it does not exist.
PS C:\temp\abc> rm *
rm : An object at the specified path …Run Code Online (Sandbox Code Playgroud) windows powershell 7zip windows-server-2012-r2 powershell-5.0
我了解以下内容:
$ ruby -e "p 'abc'.sub('a','A').sub('b', 'B')"
"ABc"
Run Code Online (Sandbox Code Playgroud)
我也同意以下几点:
echo abc | ruby -p -e "sub('a','A');sub('b', 'B')"
ABc
Run Code Online (Sandbox Code Playgroud)
但:
echo abc | ruby -p -e "sub('a','A').sub('b', 'B')"
Abc
Run Code Online (Sandbox Code Playgroud)
我期望结果也是“ABc”,为什么不是?第二个sub('b', 'B')无法运行。
让我们看看 Perl 代码和结果:
$s = "a\nb\nc\n";
$s =~ s/^b/X/;
print $s;
a
b
c
$s = "a\nb\nc\n";
$s =~ s/^b/X/m;
print $s;
a
X
c
Run Code Online (Sandbox Code Playgroud)
我认为 Perl 是对的, ^ 仅在启用多行时才匹配中间新行之后的位置。
让我们看看红宝石:
$s = "a\nb\nc\n"
print $s.sub(/^b/,'X')
a
X
c
$s = "a\nb\nc\n"
print $s.sub(/^b/m,'X')
a
X
c
Run Code Online (Sandbox Code Playgroud)
^ 匹配文本中间换行符后的位置,无论它是否处于多行模式。
在我的一生中,我找不到定义多行选项将做什么的 Ruby 文档,它在哪里?
Ruby 也没有单行模式吗?
undefined group option: /(?s)^b/
Run Code Online (Sandbox Code Playgroud)
/^b./s 将解析但它的行为不像 Perl(。匹配新行)。
PS:我使用 Perl 5 和 Ruby 3.0 进行了测试。
我在ansible中有以下测试代码:
- shell: who am i
register: w
- debug:
msg:
- "{{ w }}"
Run Code Online (Sandbox Code Playgroud)
它产生空标准输出,如下所示:
ok: [10.20.30.40] => {
"msg": [
{
"changed": true,
"cmd": "who am i",
"delta": "0:00:00.003400",
"end": "2021-02-02 21:19:50.454729",
"failed": false,
"rc": 0,
"start": "2021-02-02 21:19:50.451329",
"stderr": "",
"stderr_lines": [],
"stdout": "",
"stdout_lines": []
}
]
}
Run Code Online (Sandbox Code Playgroud)
该命令适用于某些服务器,但不适用于其他服务器。我无法弄清楚有什么区别。我只能猜测它与终端信息有关。当我以交互方式输入“我是谁”命令时,我得到了预期的结果。
我还注意到“who”命令中 ssh 的其他奇怪行为:
$ ssh myhost who # who outputs nothing
$ ssh myhost who am i # who am i outputs nothing
$ ssh myhost whoami …Run Code Online (Sandbox Code Playgroud) ansible ×2
powershell ×2
ruby ×2
windows ×2
7zip ×1
ansible-2.x ×1
clamav ×1
command-line ×1
perl ×1
regex ×1
shell ×1
ssh ×1
unix ×1