Board logo

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

作者: for_flr    时间: 2022-3-22 16:35     标题: 【已解决】批处理如何实现有序名单每星期循环排列?

本帖最后由 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里
请问如何用代码根据接通知的时间上次周七值班人员名,实现自动排班
作者: idwma    时间: 2022-3-22 18:06

一个思路
  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. }
复制代码

作者: WHY    时间: 2022-3-23 00:13

本帖最后由 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;
复制代码

作者: for_flr    时间: 2022-3-23 15:23

本帖最后由 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
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2