找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 19807|回复: 3

[其他] 【已解决】批处理如何实现有序名单每星期循环排列?

[复制链接]
发表于 2022-3-22 16:35:26 | 显示全部楼层 |阅读模式
本帖最后由 for_flr 于 2022-3-23 15:25 编辑

单位有十个人,两人一组
老赵小赵,老钱小钱,老孙小孙,老李小李,老周小周。
根据社区临时通知进行疫情值守,从接到通知那天开始排值班表直到星期天。
上下午各留1人值班,按10人名单循环排列,但循环一次要求更改上下午次序。如(周二接到通知):

  1.            时间  上午  下午
  2. 2022.3.22 周二  老赵  小赵
  3. 2022.3.23 周三  老钱  小钱
  4. 2022.3.24 周四  老孙  小孙
  5. 2022.3.25 周五  老李  小李
  6. 2022.3.26 周六  老周  小周
  7. 2022.3.26 周日  小赵  老赵
复制代码
假设下次社区通知是星期一,则

  1.            时间  上午  下午
  2. 2022.3.27 周一  小钱  老钱
  3. 2022.3.28 周二  小孙  老孙
  4. 2022.3.29 周三  小李  老李
  5. 2022.3.30 周四  小周  老周
  6. 2022.3.31 周五  老赵  小赵
  7. 2022.4.1   周六  老钱  小钱
  8. 2022.4.2   周七  老孙  小孙
复制代码
每一周的排班表存到txt里
请问如何用代码根据接通知的时间上次周七值班人员名,实现自动排班
发表于 2022-3-22 18:06:59 | 显示全部楼层
一个思路
  1. $a=gc asdf.txt
  2. while(1){
  3. $a[-5..-1]|%{
  4. $b=$_ -split '\s+'
  5. '{0}{1}' -f $b[-1],$b[-2]
  6. if(((get-date)+[timespan]::FromDays(++$i)).dayofweek -eq 'Sunday'){break}
  7. }
  8. }
复制代码

评分

参与人数 1技术 +1 收起 理由
for_flr + 1 乐于助人

查看全部评分

发表于 2022-3-23 00:13:47 | 显示全部楼层
本帖最后由 WHY 于 2022-3-23 01:21 编辑
  1. $name  = '姓名.txt';       #每行2个人名,以逗号(,)隔开
  2. $arr   = gc $name;
  3. $count = $arr.Count;
  4. $today = (get-Date).DayOfWeek;

  5. $csv = @('日期,星期,上午,下午');
  6. $csv += for ($i = 0; $i -le (7-$today); $i++){
  7.     $date = (get-Date).AddDays($i);
  8.     $m    = $i % $count;
  9.     $date.ToString('yyyy/MM/dd') + ',' +  $date.ToString('ddd') + ',' + $arr[$m];
  10. }

  11. sc '值班表.csv' -Value $csv;

  12. if ($count - $m - 1) {
  13.     $arr = $arr[($m + 1)..($count - 1)] + $arr[0..$m];  #重新排序
  14. }
  15. $arr = $arr -replace '^([^,]+),([^,]+)$', '$2,$1';   #调换上、下午人员顺序

  16. sc $name -Value $arr;
复制代码

评分

参与人数 1技术 +1 收起 理由
for_flr + 1 乐于助人

查看全部评分

 楼主| 发表于 2022-3-23 15:23:32 | 显示全部楼层
本帖最后由 for_flr 于 2022-3-23 15:25 编辑

回复 3# WHY

感谢WHY神指导,借鉴修改,已能实现自动排表,谢谢。
  1. $namelist="老赵,小赵,老钱,小钱,老孙,小孙,老李,小李,老周,小周"      #原名字序列
  2. $namelist -split '(\w+,\w+)'|%{
  3.   $a=$_.split(',',[stringsplitoptions]::removeemptyentries)
  4.   [array]::reverse($a)
  5.   $new+=$a
  6. }
  7. $exchange=$new -join ","                     #交换上下午名字序列                                          
  8. $lastname="小李,老李"                           #上一次csv文件最后出现的名字顺序
  9. if ($namelist -match $lastname){$nameall=$namelist+","+$exchange}
  10. if ($exchange -match $lastname){$nameall=$exchange+","+$namelist}
  11. $namenew=($nameall -split "$lastname")[-1]         #将两个序列按情况拼接在一起!
  12. $namenew=$namenew.split(',',[stringsplitoptions]::removeemptyentries)

  13. $csv = @('日期,上午,下午')
  14. $today=(get-date).dayofweek
  15. $csv+=for($i=0;$i -le (7-$today);$i++){
  16.   $n=$i*2                              #模运算有点烧脑。。添加$n来取名单
  17.   $date=(get-date).adddays($i)
  18.   "{0},{1},{2}" -f ($date.tostring('yyyy/MM/dd')+$date.tostring('ddd')),$namenew[$n],$namenew[$n+1]
  19. }
  20. $csvname=$date.tostring('yyyyMMdd')+".csv"
  21. sc $csvname -value $csv
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 05:56 , Processed in 0.020181 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表