powershell异于常人的两三事

本文从 Linux 程序员的角度出发,探讨了 Powershell 的几个关键特性,包括其统一规范的命名和参数规则、强大的管道机制以及对象处理方式。这些特性使得 Powershell 在脚本编写方面更加高效和直观。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一直以来使用ls,find,grep,sed等在linux下完成日常的系统配置,查看工作。自然而然的就认为世界就是这个样子,直到有一天我尝试了一下powershell。类似的情况也发生在我尝试使用函数式语言clojure的时候。 从出身时间来看,Powershell比unix的工具集要年轻许多。年代久远就意味这被时间证明的,可靠的,被广泛接受的,这么说诚然没错。但从另一个角度来看,也可以说是陈旧的,过时的,背满包袱的。这篇关于powershell的文章不是用来吹嘘或者布道Powershell,目的是给读者另外一个视角,消除一些技术之外的偏见。因为我常常看到一些程序员对于某家公司的产品毫无理由的贬低。 以下是从一个linux程序员的视角,觉得蛮不错的Powershell的特性。

统一规范,特别是cmd-let的命名和参数规则

其实我的英语水平中偏上,但对于linux的一些命令名称还是无法总结出一个规律,给人感觉起名称非常随意。就像上一代人,因为生活贫困,又生了许多孩子,没有精力和时间给孩子起一个再三斟酌名字,叫得应就行了,这种味道。

命令名称

Powershell从一开始就非常注重这一块内容,把起名当成和功能开发一样严肃对待。名称的规律是verb-noun,动词-名词。 Get-ChildItem(ls),Get-Content(cat),Set-Content翻译成中文的话,获取-子条目,获取-内容,设置-内容。*** 通过powershell的别名机制,ls,cat等都可以直接使用***

命令参数

命令的参数设计的非常巧妙,在参数位置输入“-”,然后按tab,所有的参数名称都会循环显示。除了参数名称的tab自动化,连参数值都可以tab化,参数值tab化的前提是参数值做了限定。比如 -Encoding (ascii|utf8),这种情况下,按tab键的时候,会在ascii,utf8之间循环显示。

在缺少某个“必须”参数的情况下,Powershell会提示你输入参数的值。 输入图片说明

你得到的反馈是需要一个Value的参数,而且这个参数可以从管道获取。再仔细看,提示的是Value[0],说明也可以输入集合。这个问题后面详谈。

 #使用管道
"abc" | Set-Content -Path abc.txt -Encoding Ascii
 #直接参数
Set-Content -Path abc.txt -Value "abc" -Encoding Ascii

# 在尝试之前,想象一下下面的代码会产生什么结果。如果结果如你所想,至少这种设计是直观易懂的。
"abc", "def" | Set-Content -Path abc.txt -Encoding Ascii

里面流着“对象”的管道

Linux管道里面流的是一个单独的字符串,PowerShell里面是对象。请看下面的示例代码: 输入图片说明

  • 第一个命令: 列出当前目录下的文件和目录 --》不是容器(不是目录) --》文件名称不是以.开头 --》 列出5个即可。
  • 第二个命令:开头和第一个命令一致,接下去看看对象有那些属性,这里指示列出最后5个属性,其中包括Length。
  • 第三个命令按照长度逆向排序的结果。 从这个简单的示例中,应该能够体会“对象”的优势了。

*** 补充一下,这个选择文件可以用switcher参数,-File,图片中使用了 Where-Object PSIscontainer -EQ $False ***

命令return的是什么?

除了你显式地丢弃地内容,powershell捕获所有的输出。初次接触Powershell可能会非常的不适应,只要记住这个“捕获一切”,也算是一种简单的规律吧。

function Return-What {
    "a"
    1
    "c"
}
# 返回的是一个对象数组,长度3
(Return-What).getType() # Object[]
function Return-What {
    "a" | Out-Null
    1
    "c"
}
# 返回的是一个对象数组,长度2,因为"a"| Out-Null,显式地抛弃了输出。
function Return-What {
    $a = 1
}

# 赋值语句不产生输出,没返回什么
(Return-What) -eq $null

这种规律即使在管道里面也严格遵守。

"a","b" | ForEach-Object -Begin {$a=@();"hello"} -Process {$a += $_; $_} -End {$a}
# 结果就是hello,a,b,a,b

几乎无差别的对待“单体”和“集合”

内置的命令都能合理的对待单体和集合,把单体想象成只有一个成员的集合,然后一切都似乎可以解释通了。

#比较一下下面的两行代码
Get-ChildItem . | Where-Object PSIscontainer -EQ $False | Where-Object Name -Match "\.bak$" | Remove-Item
# 把当前目录下以.bak结尾文件(不包含目录)删除,如果我想象正确的化,应该是每个对象流到Remove-Item的时候,进行删除。
Get-ChildItem . | Where-Object PSIscontainer -EQ $False | Where-Object Name -Match "\.bak$" | Select-Object -ExpandProperty FullName |  Out-File -filepath mybakfiles.txt
# 把当前目录下的bak文件的全路径名称写入到mybakfiles.txt文件中,这个结果就有点类似于reduce的味道,将流的对象收集起来放到文件中。

用管道还是不用管道,这是一个问题吗?

Powershell除去管道就是java,C#了。Powershell具有完备的foreach,while,do-while等关键字,你可以像java一样书写代码。 但是本人觉得管道是powershell的精髓,它训练人的思维模式,一旦适应之后,就可以书写流畅、易读的代码。使用java的stream的时候是否有这种感觉呢?

比如确定一个集合的所有对象是否符合某种要求。

# 不用管道
$a = "etc/hadoop/hdfs-site.xml", "etc/hadoop/core-site.xml", "etc/hadoop/mapred-site.xml","etc/hadoop/yarn-site.xml", "abc/kkk.xml"
$allStartsWithEtc = $True
foreach ($i in $a) {
    if (! $i.startsWith("etc/")) {
        $allStartsWithEtc = $False
        break;
    }
}
If ($allStartsWithEtc) {
  # do something.
}

# 使用管道
$a = "etc/hadoop/hdfs-site.xml", "etc/hadoop/core-site.xml", "etc/hadoop/mapred-site.xml","etc/hadoop/yarn-site.xml", "abc/kkk.xml"
if (!($a | Where-Object {$_ -notmatch "^etc/"} | select-object -first 1)) {
   # do something
}

广告时间

EasyInstaller,使用web界面安装群集软件。脚本代码基于powershell和tcl,bash,欢迎脚本爱好者参与。

转载于:https://my.oschina.net/jianglibo/blog/787396

### XXL-JOB 远程执行 PowerShell 脚本的配置方法 #### 一、XXL-JOB 的基本原理 XXL-JOB 是一种分布式任务调度平台,支持通过 JobHandler 来定义具体的任务逻辑。为了实现远程机器上的任务执行,通常需要在目标机器上安装并运行 XXL-JOB 执行器(Executor),并通过网络通信完成任务分发与执行。 对于执行 PowerShell 脚本的需求,可以通过自定义 JobHandler 并调用系统命令来启动脚本文件[^1]。 --- #### 二、具体配置步骤 ##### 1. 安装与部署 XXL-JOB Executor 确保远程机器已成功部署 XXL-JOB Executor,并能够正常连接到调度中心。如果尚未完成此操作,请参考官方文档或之前的介绍文章[^3]。 ##### 2. 创建 PowerShell 脚本 准备一个待执行的 PowerShell 脚本文件 `script.ps1`,将其放置于远程机器的目标路径下。例如: ```powershell # script.ps1 Write-Output "This is a test message from PowerShell." Get-Date ``` ##### 3. 自定义 JobHandler 在项目的业务代码中创建一个新的 JobHandler 类型,用于触发远程机器上的 PowerShell 命令。以下是 Java 实现的一个示例: ```java import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.IJobHandler; import com.xxl.job.core.handler.annotation.XxlJob; public class PowershellJobHandler extends IJobHandler { @XxlJob("powershellTestHandler") public ReturnT<String> execute(String param) { XxlJobLogger.log("Powershell 测试任务开始执行。参数: {}", param); try { String command = "powershell.exe C:\\path\\to\\your\\script.ps1"; Process process = Runtime.getRuntime().exec(command); int exitCode = process.waitFor(); if (exitCode != 0) { throw new Exception("Powershell 脚本执行失败!"); } StringBuilder outputBuilder = new StringBuilder(); java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine()) != null) { outputBuilder.append(line).append("\n"); } XxlJobLogger.log("Powershell 输出:\n{}", outputBuilder.toString()); return SUCCESS; } catch (Exception e) { XxlJobLogger.error(e.getMessage(), e); return new ReturnT<>(ReturnT.FAIL_CODE, "任务执行异常:" + e.getMessage()); } } } ``` 上述代码实现了以下功能: - 使用 `Runtime.exec()` 方法调用系统的 `powershell.exe` 工具。 - 将指定路径下的 `.ps1` 文件作为输入传递给 PowerShell 解析器。 - 记录日志以便调试和监控[^2]。 ##### 4. 注册 Task 到 Scheduler Center 登录 XXL-JOB 的 Web 控制台,在 **任务管理** 中新增一条记录: - **任务名称**: 自定义描述,如 “远程 PowerShell 脚本测试” - **执行器名称**: 对应远程机器上已经注册好的 Executor 名称 - **任务处理器**: 设置为 `powershellTestHandler` (需匹配 JobHandler 上的注解) - **CRON 表达式**: 根据需求设置定时规则,或者手动触发一次验证效果 保存后即可尝试运行该任务。 --- #### 三、注意项 1. 确保远程服务器允许执行 PowerShell 脚本。默认情况下可能启用了限制策略 (`Restricted`) ,可以修改为更宽松模式: ```powershell Set-ExecutionPolicy RemoteSigned -Scope CurrentUser ``` 2. 如果涉及敏感数据传输,则建议加密处理后再传入参数字段;同时避免硬编码明文密码等内容至源码里。 3. 当跨操作系统环境时(比如 Linux 下模拟 Windows 功能),可考虑借助其他工具代替原生 cmd 或 powershell 操作方式。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值