[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

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

一个思路
  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

评分人数

TOP

本帖最后由 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

评分人数

TOP

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

TOP

返回列表